Skip to content

Commit ee2c1de

Browse files
committedApr 11, 2018
[X86] In X86FlagsCopyLowering, when rewriting a memory setcc we need to emit an explicit MOV8mr instruction.
Previously the code only knew how to handle setcc to a register. This should fix a crash in the chromium build. llvm-svn: 329771
1 parent 2b38463 commit ee2c1de

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed
 

‎llvm/lib/Target/X86/X86FlagsCopyLowering.cpp

+22-3
Original file line numberDiff line numberDiff line change
@@ -727,8 +727,27 @@ void X86FlagsCopyLoweringPass::rewriteSetCC(MachineBasicBlock &TestMBB,
727727
if (!CondReg)
728728
CondReg = promoteCondToReg(TestMBB, TestPos, TestLoc, Cond);
729729

730-
// Rewriting this is trivial: we just replace the register and remove the
731-
// setcc.
732-
MRI->replaceRegWith(SetCCI.getOperand(0).getReg(), CondReg);
730+
// Rewriting a register def is trivial: we just replace the register and
731+
// remove the setcc.
732+
if (!SetCCI.mayStore()) {
733+
assert(SetCCI.getOperand(0).isReg() &&
734+
"Cannot have a non-register defined operand to SETcc!");
735+
MRI->replaceRegWith(SetCCI.getOperand(0).getReg(), CondReg);
736+
SetCCI.eraseFromParent();
737+
return;
738+
}
739+
740+
// Otherwise, we need to emit a store.
741+
auto MIB = BuildMI(*SetCCI.getParent(), SetCCI.getIterator(),
742+
SetCCI.getDebugLoc(), TII->get(X86::MOV8mr));
743+
// Copy the address operands.
744+
for (int i = 0; i < X86::AddrNumOperands; ++i)
745+
MIB.add(SetCCI.getOperand(i));
746+
747+
MIB.addReg(CondReg);
748+
749+
MIB->setMemRefs(SetCCI.memoperands_begin(), SetCCI.memoperands_end());
750+
733751
SetCCI.eraseFromParent();
752+
return;
734753
}

‎llvm/test/CodeGen/X86/flags-copy-lowering.mir

+1-2
Original file line numberDiff line numberDiff line change
@@ -208,11 +208,10 @@ body: |
208208
%3:gr8 = SETAr implicit $eflags
209209
%4:gr8 = SETBr implicit $eflags
210210
%5:gr8 = SETEr implicit $eflags
211-
%6:gr8 = SETNEr implicit killed $eflags
211+
SETNEm $rsp, 1, $noreg, -16, $noreg, implicit killed $eflags
212212
MOV8mr $rsp, 1, $noreg, -16, $noreg, killed %3
213213
MOV8mr $rsp, 1, $noreg, -16, $noreg, killed %4
214214
MOV8mr $rsp, 1, $noreg, -16, $noreg, killed %5
215-
MOV8mr $rsp, 1, $noreg, -16, $noreg, killed %6
216215
; CHECK-NOT: $eflags =
217216
; CHECK-NOT: = SET{{.*}}
218217
; CHECK: MOV8mr {{.*}}, killed %[[A_REG]]

0 commit comments

Comments
 (0)
Please sign in to comment.