[PATCH] D127848: [CodeGen] Fix the bug of machine sink

LuoYuanke via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 15 05:04:32 PDT 2022


LuoYuanke created this revision.
Herald added subscribers: jsji, pengfei, hiraditya.
Herald added a project: All.
LuoYuanke requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

The use operand may be undefined. In that case we can just continue to
check the next operand since it won't increase register pressure.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D127848

Files:
  llvm/lib/CodeGen/MachineSink.cpp
  llvm/test/CodeGen/X86/sink-down-undef-use.mir


Index: llvm/test/CodeGen/X86/sink-down-undef-use.mir
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/sink-down-undef-use.mir
@@ -0,0 +1,63 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+# RUN: llc -mtriple=x86_64-- -run-pass=machine-sink -o - %s | FileCheck %s
+
+---
+name:            foo
+alignment:       16
+tracksRegLiveness: true
+registers:
+  - { id: 0, class: gr32 }
+  - { id: 1, class: gr32 }
+  - { id: 2, class: gr32 }
+  - { id: 3, class: gr32 }
+frameInfo:
+  maxAlignment:    4
+machineFunctionInfo: {}
+body:             |
+  ; CHECK-LABEL: name: foo
+  ; CHECK: bb.0.entry:
+  ; CHECK-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-NEXT:   liveins: $edi, $esi
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT:   JMP_1 %bb.2
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT: bb.1:
+  ; CHECK-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT:   [[MOV32rr:%[0-9]+]]:gr32 = MOV32rr undef %1:gr32
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT: bb.2:
+  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.3(0x40000000)
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT:   [[MOV32rr1:%[0-9]+]]:gr32 = MOV32rr undef %3:gr32
+  ; CHECK-NEXT:   JCC_1 %bb.1, 15, implicit undef $eflags
+  ; CHECK-NEXT:   JMP_1 %bb.3
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT: bb.3:
+  ; CHECK-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT:   MOV32mr $rip, 1, $noreg, 12, $noreg, [[MOV32rr1]]
+  ; CHECK-NEXT:   JCC_1 %bb.3, 15, implicit undef $eflags
+  ; CHECK-NEXT:   JMP_1 %bb.4
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT: bb.4:
+  ; CHECK-NEXT:   RET 0, undef $eax
+  bb.0.entry:
+    liveins: $edi, $esi
+    JMP_1 %bb.2
+  bb.1:
+    %0:gr32 = MOV32rr undef %1:gr32
+  bb.2:
+    %2:gr32 = MOV32rr undef %3:gr32
+    JCC_1 %bb.1, 15, undef implicit $eflags
+    JMP_1 %bb.3
+
+  bb.3:
+    MOV32mr $rip, 1, $noreg, 12, $noreg, %2
+    JCC_1 %bb.3, 15, undef implicit $eflags
+    JMP_1 %bb.4
+
+  bb.4:
+    RET 0, undef $eax
+
+...
Index: llvm/lib/CodeGen/MachineSink.cpp
===================================================================
--- llvm/lib/CodeGen/MachineSink.cpp
+++ llvm/lib/CodeGen/MachineSink.cpp
@@ -823,6 +823,8 @@
         return false;
     } else {
       MachineInstr *DefMI = MRI->getVRegDef(Reg);
+      if (!DefMI)
+        continue;
       MachineCycle *Cycle = CI->getCycle(DefMI->getParent());
       // DefMI is defined outside of cycle. There should be no live range
       // impact for this operand. Defination outside of cycle means:


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D127848.437114.patch
Type: text/x-patch
Size: 2613 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220615/2ce13ad8/attachment-0001.bin>


More information about the llvm-commits mailing list