[llvm] [FixIrreducible] Handle conditional branch with both successors as header (PR #206057)

via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 26 07:52:23 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: lijinpei-amd

<details>
<summary>Changes</summary>

A conditional branch redirecting edges to the cycle header may have both successors equal to the header (e.g. `br i1 %c, label %h, label %h`), which the previous `Succ1 = Succ0 ? nullptr : Header` logic mishandled by dropping the second edge.

Check each successor independently against the header instead.

Fixes https://github.com/llvm/llvm-project/issues/191979.

---
Full diff: https://github.com/llvm/llvm-project/pull/206057.diff


2 Files Affected:

- (modified) llvm/lib/Transforms/Utils/FixIrreducible.cpp (+1-3) 
- (added) llvm/test/Transforms/FixIrreducible/pr191979.ll (+27) 


``````````diff
diff --git a/llvm/lib/Transforms/Utils/FixIrreducible.cpp b/llvm/lib/Transforms/Utils/FixIrreducible.cpp
index ead39f5991081..b4f6262f7b309 100644
--- a/llvm/lib/Transforms/Utils/FixIrreducible.cpp
+++ b/llvm/lib/Transforms/Utils/FixIrreducible.cpp
@@ -298,10 +298,8 @@ static bool fixIrreducible(Cycle &C, CycleInfo &CI, DominatorTree &DT,
       LLVM_DEBUG(dbgs() << "Added internal branch: " << printBasicBlock(P)
                         << " -> " << printBasicBlock(Header) << '\n');
     } else if (CondBrInst *Branch = dyn_cast<CondBrInst>(P->getTerminator())) {
-      // Exactly one of the two successors is the header.
       BasicBlock *Succ0 = Branch->getSuccessor(0) == Header ? Header : nullptr;
-      BasicBlock *Succ1 = Succ0 ? nullptr : Header;
-      assert(Succ0 || Branch->getSuccessor(1) == Header);
+      BasicBlock *Succ1 = Branch->getSuccessor(1) == Header ? Header : nullptr;
       assert(Succ0 || Succ1);
       CHub.addBranch(P, Succ0, Succ1);
 
diff --git a/llvm/test/Transforms/FixIrreducible/pr191979.ll b/llvm/test/Transforms/FixIrreducible/pr191979.ll
new file mode 100644
index 0000000000000..1316fa453429c
--- /dev/null
+++ b/llvm/test/Transforms/FixIrreducible/pr191979.ll
@@ -0,0 +1,27 @@
+; NOTE: Do not autogenerate
+; RUN: opt < %s -passes=fix-irreducible -disable-output
+
+; Regression test for https://github.com/llvm/llvm-project/issues/191979.
+declare i1 @sideeffect()
+
+define void @foo(i1 %c1) {
+entry:
+  br label %pad0
+
+pad0:
+  br label %pad1
+
+pad1:
+  br i1 %c1, label %a, label %b
+
+a:
+  %c2.a = call i1 @sideeffect()
+  br i1 %c2.a, label %b, label %b
+
+b:
+  %c2.b = call i1 @sideeffect()
+  br i1 %c2.b, label %exit, label %a
+
+exit:
+  ret void
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/206057


More information about the llvm-commits mailing list