[llvm-branch-commits] [llvm] 1a5938e - [Hexagon] Disable new value jumps when packetizer is disabled (#180615)

Douglas Yung via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Mar 5 09:10:33 PST 2026


Author: Brian Cain
Date: 2026-03-05T17:10:15Z
New Revision: 1a5938e7c87cdf913a0aff72ef3a48dd02625184

URL: https://github.com/llvm/llvm-project/commit/1a5938e7c87cdf913a0aff72ef3a48dd02625184
DIFF: https://github.com/llvm/llvm-project/commit/1a5938e7c87cdf913a0aff72ef3a48dd02625184.diff

LOG: [Hexagon] Disable new value jumps when packetizer is disabled (#180615)

New value jumps require the feeder instruction to be in the same packet
as the consumer (.new) instruction. When --disable-packetizer is used,
each instruction is placed in its own packet, making it impossible to
satisfy this requirement.

Previously, using --disable-packetizer would cause an assertion failure
in the MCCodeEmitter: "Couldn't find producer". This change fixes the
crash by checking the DisablePacketizer flag in the NewValueJump pass
and skipping NVJ generation when packetization is disabled.

(cherry picked from commit e1be4dfe1ef889c51d7e1704782a31dc65bb745c)

Added: 
    llvm/test/CodeGen/Hexagon/disable-packetizer-nvj.ll

Modified: 
    llvm/lib/Target/Hexagon/HexagonNewValueJump.cpp
    llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/Hexagon/HexagonNewValueJump.cpp b/llvm/lib/Target/Hexagon/HexagonNewValueJump.cpp
index 5a1d5bc669169..b237f11d926aa 100644
--- a/llvm/lib/Target/Hexagon/HexagonNewValueJump.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonNewValueJump.cpp
@@ -63,6 +63,8 @@ static cl::opt<int> DbgNVJCount("nvj-count", cl::init(-1), cl::Hidden,
 static cl::opt<bool> DisableNewValueJumps("disable-nvjump", cl::Hidden,
                                           cl::desc("Disable New Value Jumps"));
 
+extern cl::opt<bool> DisablePacketizer;
+
 namespace {
 
   struct HexagonNewValueJump : public MachineFunctionPass {
@@ -453,7 +455,9 @@ bool HexagonNewValueJump::runOnMachineFunction(MachineFunction &MF) {
       MF.getSubtarget().getRegisterInfo());
   MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
 
-  if (DisableNewValueJumps ||
+  // New value jumps require the feeder instruction to be in the same packet.
+  // If packetization is disabled, we cannot generate new value jumps.
+  if (DisableNewValueJumps || DisablePacketizer ||
       !MF.getSubtarget<HexagonSubtarget>().useNewValueJumps())
     return false;
 

diff  --git a/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp b/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp
index d39b79a86753a..8d1c17ca97421 100644
--- a/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp
@@ -55,9 +55,8 @@ using namespace llvm;
 
 #define DEBUG_TYPE "packets"
 
-static cl::opt<bool>
-    DisablePacketizer("disable-packetizer", cl::Hidden,
-                      cl::desc("Disable Hexagon packetizer pass"));
+cl::opt<bool> DisablePacketizer("disable-packetizer", cl::Hidden,
+                                cl::desc("Disable Hexagon packetizer pass"));
 
 static cl::opt<bool> Slot1Store("slot1-store-slot0-load", cl::Hidden,
                                 cl::init(true),

diff  --git a/llvm/test/CodeGen/Hexagon/disable-packetizer-nvj.ll b/llvm/test/CodeGen/Hexagon/disable-packetizer-nvj.ll
new file mode 100644
index 0000000000000..c2fac38625d76
--- /dev/null
+++ b/llvm/test/CodeGen/Hexagon/disable-packetizer-nvj.ll
@@ -0,0 +1,34 @@
+; RUN: llc -mtriple=hexagon -mcpu=hexagonv68 -O2 --disable-packetizer -filetype=obj -o /dev/null %s
+; RUN: llc -mtriple=hexagon -mcpu=hexagonv68 -O2 -mattr=-nvj -filetype=obj -o /dev/null %s
+; REQUIRES: asserts
+
+; Check that compiling with --disable-packetizer does not crash.
+; New value jumps require the feeder instruction to be in the same packet
+; as the consumer (.new) instruction. When packetization is disabled, the
+; NVJ pass must be skipped to avoid an assertion in the MCCodeEmitter
+; ("Couldn't find producer").
+;
+; The branches here are non-if-convertible (due to calls), ensuring the
+; compare+branch pattern survives to the NVJ pass regardless of the
+; optimization pipeline used.
+
+declare void @do_work(i32)
+declare void @do_other(i32)
+
+define void @test_nvj(ptr %p, i32 %threshold) {
+entry:
+  %val = load i32, ptr %p, align 4
+  %cmp = icmp eq i32 %val, %threshold
+  br i1 %cmp, label %if.then, label %if.else
+
+if.then:
+  call void @do_work(i32 %val)
+  br label %exit
+
+if.else:
+  call void @do_other(i32 %val)
+  br label %exit
+
+exit:
+  ret void
+}


        


More information about the llvm-branch-commits mailing list