diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index 5f593d6f986..bdcf86cfed6 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -7501,6 +7501,7 @@ ARMTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI, unsigned int ABSSrcReg = MI->getOperand(1).getReg(); unsigned int ABSDstReg = MI->getOperand(0).getReg(); + bool ABSSrcKIll = MI->getOperand(1).isKill(); bool isThumb2 = Subtarget->isThumb2(); MachineRegisterInfo &MRI = Fn->getRegInfo(); // In Thumb mode S must not be specified if source register is the SP or @@ -7534,7 +7535,7 @@ ARMTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI, // by if-conversion pass BuildMI(*RSBBB, RSBBB->begin(), dl, TII->get(isThumb2 ? ARM::t2RSBri : ARM::RSBri), NewRsbDstReg) - .addReg(ABSSrcReg, RegState::Kill) + .addReg(ABSSrcReg, ABSSrcKIll ? RegState::Kill : 0) .addImm(0).addImm((unsigned)ARMCC::AL).addReg(0).addReg(0); // insert PHI in SinkBB, diff --git a/test/CodeGen/ARM/t2abs-killflags.ll b/test/CodeGen/ARM/t2abs-killflags.ll new file mode 100644 index 00000000000..eed8f6719ae --- /dev/null +++ b/test/CodeGen/ARM/t2abs-killflags.ll @@ -0,0 +1,23 @@ +; RUN: llc %s -o - -verify-machineinstrs | FileCheck %s + +target datalayout = "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" +target triple = "thumbv7s-unknown-unknown" + +; Test that we don't crash the machine verifier when expanding t2ABS. +; It was applying the kill flag to its source, even if the original t2ABS didn't +; kill the operand prior to pseudo expansion. + +; Function Attrs: noreturn +declare void @foo(i32, i32) #0 + +; CHECK-LABEL: @test +; CHECK: rsbmi +define void @test(i32 %arg) { + %cmp58 = icmp slt i32 %arg, 0 + %sub62 = sub nsw i32 0, %arg + %l.1 = select i1 %cmp58, i32 %sub62, i32 %arg + call void @foo(i32 %l.1, i32 %arg) #0 + unreachable +} + +attributes #0 = { noreturn }