From 295ff41c30cd5f2f1615fb594529347cfad3d43c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cakiratian=E2=80=9D?= Date: Tue, 18 Jun 2024 16:50:23 +0800 Subject: [PATCH 1/2] [llvm][CodeGen] Fix failure in window scheduler caused by phi In certain cases, the register passed with the kernel MBB in phi are not defined within the kernel MBB. The window algorithm currently does not support such scenarios, so a check is performed during initialization. --- llvm/lib/CodeGen/WindowScheduler.cpp | 8 +++- llvm/test/CodeGen/Hexagon/swp-ws-fail-3.mir | 44 +++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/Hexagon/swp-ws-fail-3.mir diff --git a/llvm/lib/CodeGen/WindowScheduler.cpp b/llvm/lib/CodeGen/WindowScheduler.cpp index 418309bc9dbf5..49c30acbb86a6 100644 --- a/llvm/lib/CodeGen/WindowScheduler.cpp +++ b/llvm/lib/CodeGen/WindowScheduler.cpp @@ -198,6 +198,12 @@ bool WindowScheduler::initialize() { if (MI.isMetaInstruction() || MI.isTerminator()) continue; if (MI.isPHI()) { + if (Register AntiReg = getAntiRegister(&MI)) + // Register with Kernel in phi is not defined within the Kernel itself. + if (MRI->getVRegDef(AntiReg)->getParent() != MBB) { + LLVM_DEBUG(dbgs() << "Special phi structure is not supported!\n"); + return false; + } for (auto Def : PhiDefs) if (MI.readsRegister(Def, TRI)) { LLVM_DEBUG( @@ -683,7 +689,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-fail-3.mir b/llvm/test/CodeGen/Hexagon/swp-ws-fail-3.mir new file mode 100644 index 0000000000000..c6da660b87cce --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/swp-ws-fail-3.mir @@ -0,0 +1,44 @@ +# REQUIRES: asserts +# RUN: llc --march=hexagon %s -run-pass=pipeliner -debug-only=pipeliner \ +# RUN: -window-sched=force -filetype=null 2>&1 | FileCheck %s + +# CHECK: Special phi structure is not supported! +# 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 + +... + + + From ea00efc1a5671603fc6fe1183f759a79918bf30e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cakiratian=E2=80=9D?= Date: Tue, 18 Jun 2024 20:04:29 +0800 Subject: [PATCH 2/2] [llvm][CodeGen] Modifications made based on review comments 1 --- llvm/lib/CodeGen/WindowScheduler.cpp | 15 ++++++--------- .../Hexagon/{swp-ws-fail-3.mir => swp-ws-phi.mir} | 5 +---- 2 files changed, 7 insertions(+), 13 deletions(-) rename llvm/test/CodeGen/Hexagon/{swp-ws-fail-3.mir => swp-ws-phi.mir} (95%) diff --git a/llvm/lib/CodeGen/WindowScheduler.cpp b/llvm/lib/CodeGen/WindowScheduler.cpp index 49c30acbb86a6..7a86351a1f4e3 100644 --- a/llvm/lib/CodeGen/WindowScheduler.cpp +++ b/llvm/lib/CodeGen/WindowScheduler.cpp @@ -198,12 +198,6 @@ bool WindowScheduler::initialize() { if (MI.isMetaInstruction() || MI.isTerminator()) continue; if (MI.isPHI()) { - if (Register AntiReg = getAntiRegister(&MI)) - // Register with Kernel in phi is not defined within the Kernel itself. - if (MRI->getVRegDef(AntiReg)->getParent() != MBB) { - LLVM_DEBUG(dbgs() << "Special phi structure is not supported!\n"); - return false; - } for (auto Def : PhiDefs) if (MI.readsRegister(Def, TRI)) { LLVM_DEBUG( @@ -539,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) diff --git a/llvm/test/CodeGen/Hexagon/swp-ws-fail-3.mir b/llvm/test/CodeGen/Hexagon/swp-ws-phi.mir similarity index 95% rename from llvm/test/CodeGen/Hexagon/swp-ws-fail-3.mir rename to llvm/test/CodeGen/Hexagon/swp-ws-phi.mir index c6da660b87cce..7897a02b43f38 100644 --- a/llvm/test/CodeGen/Hexagon/swp-ws-fail-3.mir +++ b/llvm/test/CodeGen/Hexagon/swp-ws-phi.mir @@ -2,7 +2,7 @@ # RUN: llc --march=hexagon %s -run-pass=pipeliner -debug-only=pipeliner \ # RUN: -window-sched=force -filetype=null 2>&1 | FileCheck %s -# CHECK: Special phi structure is not supported! +# CHECK: Window scheduling is not needed! # CHECK-LABEL: body: | # CHECK: bb.0: # CHECK: [[REG:%[0-9]+]]:intregs = A2_tfrsi 0 @@ -39,6 +39,3 @@ body: | J2_jump %bb.1, implicit-def $pc ... - - -