Index: llvm/lib/Target/X86/X86ISelLowering.cpp =================================================================== --- llvm/lib/Target/X86/X86ISelLowering.cpp +++ llvm/lib/Target/X86/X86ISelLowering.cpp @@ -30985,6 +30985,29 @@ MF->insert(I, fallMBB); MF->insert(I, sinkMBB); + // If the EFLAGS register isn't dead in the terminator, then claim that it's + // live into the mainMBB, fallMBB, and sinkMBB. + auto IsEFlagsLive = [](MachineBasicBlock::iterator XBeginI, + MachineBasicBlock *BB) { + // Scan forward through BB for a use/def of EFLAGS. + MachineBasicBlock::iterator miI(std::next(XBeginI)); + for (MachineBasicBlock::iterator miE = BB->end(); miI != miE; ++miI) { + const MachineInstr& mi = *miI; + if (mi.readsRegister(X86::EFLAGS)) + return true; + if (mi.definesRegister(X86::EFLAGS)) + break; + } + + return false; + }; + + if (IsEFlagsLive(MI, MBB)) { + mainMBB->addLiveIn(X86::EFLAGS); + fallMBB->addLiveIn(X86::EFLAGS); + sinkMBB->addLiveIn(X86::EFLAGS); + } + // Transfer the remainder of BB and its successor edges to sinkMBB. sinkMBB->splice(sinkMBB->begin(), MBB, std::next(MachineBasicBlock::iterator(MI)), MBB->end()); Index: llvm/test/CodeGen/X86/pr46827.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/X86/pr46827.ll @@ -0,0 +1,39 @@ +; RUN: llc < %s -mtriple=i686-pc-linux -mattr=+rtm -verify-machineinstrs -stop-after=finalize-isel | FileCheck %s + +; CHECK: body: | +; CHECK: bb.0.bb107: +; CHECK: successors: %bb.3(0x40000000), %bb.4(0x40000000) +; CHECK: %0:gr32 = MOV32rm %fixed-stack.0, 1, $noreg, 0, $noreg :: (load 4 from %fixed-stack.0, align 16) +; CHECK: %1:gr32 = SUB32ri8 %0, 1, implicit-def $eflags +; CHECK: XBEGIN_4 %bb.4, implicit-def $eax +; CHECK: bb.3.bb107: +; CHECK: successors: %bb.5(0x80000000) +; CHECK: liveins: $eflags +; CHECK: %3:gr32 = MOV32ri -1 +; CHECK: JMP_1 %bb.5 +; CHECK: bb.4.bb107: +; CHECK: successors: %bb.5(0x80000000) +; CHECK: liveins: $eflags +; CHECK: XABORT_DEF implicit-def $eax +; CHECK: %4:gr32 = COPY $eax +; CHECK: bb.5.bb107: +; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) +; CHECK: liveins: $eflags +; CHECK: %2:gr32 = PHI %3, %bb.3, %4, %bb.4 +; CHECK: JCC_1 %bb.2, 5, implicit $eflags +; CHECK: JMP_1 %bb.1 + +declare i32 @llvm.x86.xbegin() #0 + +define void @wobble.12(i32 %tmp116) { +bb107: ; preds = %bb42 + %tmp117 = icmp eq i32 %tmp116, 1 + %tmp127 = tail call i32 @llvm.x86.xbegin() #0 + br i1 %tmp117, label %bb129, label %bb250 + +bb129: ; preds = %bb107 + unreachable + +bb250: ; preds = %bb107 + unreachable +}