[llvm] 16547f9 - [CodeGen] Fix the bug of machine sink

via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 15 08:47:00 PDT 2022


Author: Luo, Yuanke
Date: 2022-06-15T23:35:52+08:00
New Revision: 16547f9fbbd56c7b8256b6eea1ccd8b1547ef4e5

URL: https://github.com/llvm/llvm-project/commit/16547f9fbbd56c7b8256b6eea1ccd8b1547ef4e5
DIFF: https://github.com/llvm/llvm-project/commit/16547f9fbbd56c7b8256b6eea1ccd8b1547ef4e5.diff

LOG: [CodeGen] Fix the bug of machine sink

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.

Differential Revision: https://reviews.llvm.org/D127848

Added: 
    llvm/test/CodeGen/X86/sink-down-undef-use.mir

Modified: 
    llvm/lib/CodeGen/MachineSink.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/MachineSink.cpp b/llvm/lib/CodeGen/MachineSink.cpp
index 797433e7a280..96d575ffb3fc 100644
--- a/llvm/lib/CodeGen/MachineSink.cpp
+++ b/llvm/lib/CodeGen/MachineSink.cpp
@@ -823,6 +823,8 @@ bool MachineSinking::isProfitableToSinkTo(Register Reg, MachineInstr &MI,
         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:

diff  --git a/llvm/test/CodeGen/X86/sink-down-undef-use.mir b/llvm/test/CodeGen/X86/sink-down-undef-use.mir
new file mode 100644
index 000000000000..7f14cecbc311
--- /dev/null
+++ b/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
+
+...


        


More information about the llvm-commits mailing list