Skip to content

Commit 4e66147

Browse files
author
Igor Breger
committed
[GlobalISel][X86] G_PHI support.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312473 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 3438d07 commit 4e66147

File tree

6 files changed

+1339
-10
lines changed

6 files changed

+1339
-10
lines changed

lib/Target/X86/X86InstructionSelector.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class X86InstructionSelector : public InstructionSelector {
8585
MachineFunction &MF) const;
8686
bool selectCondBranch(MachineInstr &I, MachineRegisterInfo &MRI,
8787
MachineFunction &MF) const;
88-
bool selectImplicitDef(MachineInstr &I, MachineRegisterInfo &MRI) const;
88+
bool selectImplicitDefOrPHI(MachineInstr &I, MachineRegisterInfo &MRI) const;
8989

9090
// emit insert subreg instruction and insert it before MachineInstr &I
9191
bool emitInsertSubreg(unsigned DstReg, unsigned SrcReg, MachineInstr &I,
@@ -290,13 +290,10 @@ bool X86InstructionSelector::select(MachineInstr &I) const {
290290

291291
if (Opcode == TargetOpcode::LOAD_STACK_GUARD)
292292
return false;
293-
if (Opcode == TargetOpcode::PHI)
294-
return false;
295293

296294
if (I.isCopy())
297295
return selectCopy(I, MRI);
298296

299-
// TODO: handle more cases - LOAD_STACK_GUARD, PHI
300297
return true;
301298
}
302299

@@ -335,7 +332,7 @@ bool X86InstructionSelector::select(MachineInstr &I) const {
335332
return true;
336333
if (selectCondBranch(I, MRI, MF))
337334
return true;
338-
if (selectImplicitDef(I, MRI))
335+
if (selectImplicitDefOrPHI(I, MRI))
339336
return true;
340337

341338
return false;
@@ -1131,10 +1128,11 @@ bool X86InstructionSelector::selectCondBranch(MachineInstr &I,
11311128
return true;
11321129
}
11331130

1134-
bool X86InstructionSelector::selectImplicitDef(MachineInstr &I,
1135-
MachineRegisterInfo &MRI) const {
1131+
bool X86InstructionSelector::selectImplicitDefOrPHI(
1132+
MachineInstr &I, MachineRegisterInfo &MRI) const {
11361133

1137-
if (I.getOpcode() != TargetOpcode::G_IMPLICIT_DEF)
1134+
if (I.getOpcode() != TargetOpcode::G_IMPLICIT_DEF &&
1135+
I.getOpcode() != TargetOpcode::G_PHI)
11381136
return false;
11391137

11401138
unsigned DstReg = I.getOperand(0).getReg();
@@ -1150,7 +1148,11 @@ bool X86InstructionSelector::selectImplicitDef(MachineInstr &I,
11501148
}
11511149
}
11521150

1153-
I.setDesc(TII.get(X86::IMPLICIT_DEF));
1151+
if (I.getOpcode() == TargetOpcode::G_IMPLICIT_DEF)
1152+
I.setDesc(TII.get(X86::IMPLICIT_DEF));
1153+
else
1154+
I.setDesc(TII.get(X86::PHI));
1155+
11541156
return true;
11551157
}
11561158

lib/Target/X86/X86LegalizerInfo.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ void X86LegalizerInfo::setLegalizerInfo32bit() {
5252
for (auto Ty : {p0, s1, s8, s16, s32})
5353
setAction({G_IMPLICIT_DEF, Ty}, Legal);
5454

55+
for (auto Ty : {s8, s16, s32, p0})
56+
setAction({G_PHI, Ty}, Legal);
57+
58+
setAction({G_PHI, s1}, WidenScalar);
59+
5560
for (unsigned BinOp : {G_ADD, G_SUB, G_MUL, G_AND, G_OR, G_XOR})
5661
for (auto Ty : {s8, s16, s32})
5762
setAction({BinOp, Ty}, Legal);
@@ -118,6 +123,8 @@ void X86LegalizerInfo::setLegalizerInfo64bit() {
118123

119124
setAction({G_IMPLICIT_DEF, s64}, Legal);
120125

126+
setAction({G_PHI, s64}, Legal);
127+
121128
for (unsigned BinOp : {G_ADD, G_SUB, G_MUL, G_AND, G_OR, G_XOR})
122129
setAction({BinOp, s64}, Legal);
123130

0 commit comments

Comments
 (0)