[PATCH] D84479: [X86] Detect if EFLAGs is live across XBEGIN pseudo instruction. Add it as livein to the basic blocks created when expanding the pseudo

Craig Topper via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 23 17:11:32 PDT 2020


craig.topper created this revision.
craig.topper added reviewers: spatel, RKSimon, efriedma.
Herald added a subscriber: hiraditya.
Herald added a project: LLVM.

XBEGIN causes several based blocks to be inserted. If flags are live across it we need to make eflags live in the new basic blocks to avoid machine verifier errors.

Is there a better way to do this than just scanning the rest of the basic block of uses or defs?

Fixes PR46827


https://reviews.llvm.org/D84479

Files:
  llvm/lib/Target/X86/X86ISelLowering.cpp
  llvm/test/CodeGen/X86/pr46827.ll


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
+}
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());


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84479.280296.patch
Type: text/x-patch
Size: 2914 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200724/2773a4af/attachment.bin>


More information about the llvm-commits mailing list