aboutsummaryrefslogtreecommitdiff
path: root/llvm
diff options
context:
space:
mode:
authorHua Tian <akiratian@tencent.com>2024-06-19 15:15:37 +0800
committerGitHub <noreply@github.com>2024-06-19 15:15:37 +0800
commitdd1d2b7cb083e870174d50627870c835d1e118e6 (patch)
tree11e08c9d479d9c45d8b956b298f0111ea764af3d /llvm
parent6c01011db089bae22630922e1ac30e5d49de3137 (diff)
downloadllvm-dd1d2b7cb083e870174d50627870c835d1e118e6.zip
llvm-dd1d2b7cb083e870174d50627870c835d1e118e6.tar.gz
llvm-dd1d2b7cb083e870174d50627870c835d1e118e6.tar.bz2
[llvm][CodeGen] Fix failure in window scheduler caused by phi (#95900)
In certain cases, the register passed with the kernel MBB in phi are not defined within the kernel MBB. This patch adds the corresponding handling.
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/CodeGen/WindowScheduler.cpp11
-rw-r--r--llvm/test/CodeGen/Hexagon/swp-ws-phi.mir41
2 files changed, 48 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/WindowScheduler.cpp b/llvm/lib/CodeGen/WindowScheduler.cpp
index 418309b..7a86351 100644
--- a/llvm/lib/CodeGen/WindowScheduler.cpp
+++ b/llvm/lib/CodeGen/WindowScheduler.cpp
@@ -533,9 +533,12 @@ void WindowScheduler::schedulePhi(int Offset, unsigned &II) {
// The anti-dependency of phi need to be handled separately in the same way.
if (Register AntiReg = getAntiRegister(&Phi)) {
auto *AntiMI = MRI->getVRegDef(AntiReg);
- auto AntiCycle = getOriCycle(AntiMI);
- if (getOriStage(getOriMI(AntiMI), Offset) == 0)
- LateCycle = std::min(LateCycle, AntiCycle);
+ // AntiReg may be defined outside the kernel MBB.
+ if (AntiMI->getParent() == MBB) {
+ auto AntiCycle = getOriCycle(AntiMI);
+ if (getOriStage(getOriMI(AntiMI), Offset) == 0)
+ LateCycle = std::min(LateCycle, AntiCycle);
+ }
}
// If there is no limit to the late cycle, a default value is given.
if (LateCycle == INT_MAX)
@@ -683,7 +686,7 @@ Register WindowScheduler::getAntiRegister(MachineInstr *Phi) {
for (auto MO : Phi->uses()) {
if (MO.isReg())
AntiReg = MO.getReg();
- else if (MO.isMBB() && MO.getMBB()->getNumber() == MBB->getNumber())
+ else if (MO.isMBB() && MO.getMBB() == MBB)
return AntiReg;
}
return 0;
diff --git a/llvm/test/CodeGen/Hexagon/swp-ws-phi.mir b/llvm/test/CodeGen/Hexagon/swp-ws-phi.mir
new file mode 100644
index 0000000..7897a02
--- /dev/null
+++ b/llvm/test/CodeGen/Hexagon/swp-ws-phi.mir
@@ -0,0 +1,41 @@
+# REQUIRES: asserts
+# RUN: llc --march=hexagon %s -run-pass=pipeliner -debug-only=pipeliner \
+# RUN: -window-sched=force -filetype=null 2>&1 | FileCheck %s
+
+# CHECK: Window scheduling is not needed!
+# CHECK-LABEL: body: |
+# CHECK: bb.0:
+# CHECK: [[REG:%[0-9]+]]:intregs = A2_tfrsi 0
+# CHECK: bb.2:
+# CHECK: {{%[0-9]+}}:intregs = PHI {{%[0-9]+}}, %bb.0, [[REG]], %bb.2
+
+---
+name: poll_for_response
+tracksRegLiveness: true
+body: |
+ bb.0:
+ successors: %bb.2(0x80000000)
+ liveins: $r0, $r1
+
+ %0:intregs = COPY $r1
+ %1:intregs = COPY $r0
+ %2:intregs = A2_tfrsi 0
+ J2_loop0i %bb.2, 2, implicit-def $lc0, implicit-def $sa0, implicit-def $usr
+ J2_jump %bb.2, implicit-def dead $pc
+
+ bb.1:
+ PS_jmpret $r31, implicit-def dead $pc
+
+ bb.2:
+ successors: %bb.1(0x04000000), %bb.2(0x7c000000)
+
+ %3:intregs = PHI %1, %bb.0, %2, %bb.2
+ %4:intregs = PHI %2, %bb.0, %5, %bb.2
+ %6:intregs = S2_lsr_i_r %3, 1
+ S2_storerb_io %0, 0, killed %6
+ S4_storerb_rr %0, %4, 0, %2
+ %5:intregs = A2_tfrsi 1
+ ENDLOOP0 %bb.2, implicit-def $pc, implicit-def $lc0, implicit $sa0, implicit $lc0
+ J2_jump %bb.1, implicit-def $pc
+
+...