Skip to content

Commit bec201f

Browse files
author
Evan Cheng
committed
If all sources of a PHI node are defined by an implicit_def, just emit an implicit_def instead of a copy.
llvm-svn: 50927
1 parent 19e3c85 commit bec201f

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

llvm/lib/CodeGen/PHIElimination.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,15 @@ bool PNE::EliminatePHINodes(MachineFunction &MF, MachineBasicBlock &MBB) {
127127
return true;
128128
}
129129

130-
static bool isSourceDefinedByImplicitDef(MachineInstr *MPhi, unsigned SrcIdx,
130+
static bool isSourceDefinedByImplicitDef(MachineInstr *MPhi,
131131
MachineRegisterInfo *MRI) {
132-
unsigned SrcReg = MPhi->getOperand(SrcIdx*2+1).getReg();
133-
MachineInstr *DefMI = MRI->getVRegDef(SrcReg);
134-
return DefMI->getOpcode() == TargetInstrInfo::IMPLICIT_DEF;
132+
for (unsigned i = 1; i != MPhi->getNumOperands(); i += 2) {
133+
unsigned SrcReg = MPhi->getOperand(i).getReg();
134+
MachineInstr *DefMI = MRI->getVRegDef(SrcReg);
135+
if (!DefMI || DefMI->getOpcode() != TargetInstrInfo::IMPLICIT_DEF)
136+
return false;
137+
}
138+
return true;
135139
}
136140

137141
/// LowerAtomicPHINode - Lower the PHI node at the top of the specified block,
@@ -156,9 +160,9 @@ void PNE::LowerAtomicPHINode(MachineBasicBlock &MBB,
156160
// into the phi node destination.
157161
//
158162
const TargetInstrInfo *TII = MF.getTarget().getInstrInfo();
159-
if (NumSrcs == 1 && isSourceDefinedByImplicitDef(MPhi, 0, MRI))
160-
// If the only source of a PHI node is an implicit_def, just emit an
161-
// implicit_def instead of a copy.
163+
if (isSourceDefinedByImplicitDef(MPhi, MRI))
164+
// If all sources of a PHI node are implicit_def, just emit an implicit_def
165+
// instead of a copy.
162166
BuildMI(MBB, AfterPHIsIt, TII->get(TargetInstrInfo::IMPLICIT_DEF), DestReg);
163167
else
164168
TII->copyRegToReg(MBB, AfterPHIsIt, DestReg, IncomingReg, RC, RC);
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
; RUN: llvm-as < %s | llc -march=x86
2+
3+
%struct.V = type { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x i32>, float*, float*, float*, float*, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, i32, i32, i32, i32, i32, i32, i32, i32 }
4+
5+
define fastcc void @t() nounwind {
6+
entry:
7+
br i1 false, label %bb23816.preheader, label %bb23821
8+
9+
bb23816.preheader: ; preds = %entry
10+
%tmp23735 = and i32 0, 2 ; <i32> [#uses=0]
11+
br label %bb23830
12+
13+
bb23821: ; preds = %entry
14+
br i1 false, label %bb23830, label %bb23827
15+
16+
bb23827: ; preds = %bb23821
17+
%tmp23829 = getelementptr %struct.V* null, i32 0, i32 42 ; <i32*> [#uses=0]
18+
br label %bb23830
19+
20+
bb23830: ; preds = %bb23827, %bb23821, %bb23816.preheader
21+
%scaledInDst.2.reg2mem.5 = phi i8 [ undef, %bb23827 ], [ undef, %bb23821 ], [ undef, %bb23816.preheader ] ; <i8> [#uses=1]
22+
%toBool35047 = icmp eq i8 %scaledInDst.2.reg2mem.5, 0 ; <i1> [#uses=1]
23+
%bothcond39107 = or i1 %toBool35047, false ; <i1> [#uses=0]
24+
unreachable
25+
}

0 commit comments

Comments
 (0)