[llvm] [Loop Interchange] Handle Single Path Phi Nodes in Inner Loop Pre-Headers (PR #196691)

Sri Harika via llvm-commits llvm-commits at lists.llvm.org
Sat May 9 03:05:24 PDT 2026


https://github.com/Harikaraja updated https://github.com/llvm/llvm-project/pull/196691

>From d3580fbd3b46c9e4a65acf43ae688254dc5da3d6 Mon Sep 17 00:00:00 2001
From: Harika Raja <sudha200215 at gmail.com>
Date: Sat, 9 May 2026 11:13:05 +0530
Subject: [PATCH 1/2] [LoopInterchange] Handle single-incoming PHIs in
 InnerLoop-preheaders

---
 .../lib/Transforms/Scalar/LoopInterchange.cpp | 13 ++++++++
 .../inner-preheader-single-phi.ll             | 31 +++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 llvm/test/Transforms/LoopInterchange/inner-preheader-single-phi.ll

diff --git a/llvm/lib/Transforms/Scalar/LoopInterchange.cpp b/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
index 91e2510c33851..a2618de20bfa4 100644
--- a/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
@@ -2019,6 +2019,19 @@ bool LoopInterchangeTransform::transform(
   // instructions outside the loop nest.
   BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader();
   BasicBlock *OuterLoopHeader = OuterLoop->getHeader();
+
+  //check if there are any Single path Phi Nodes in InnerLoop-Pre Header
+
+  if(InnerLoopPreHeader && InnerLoopPreHeader != OuterLoopHeader){
+
+    for (PHINode &P : make_early_inc_range(InnerLoopPreHeader->phis())) {
+      if(P.getNumIncomingValues() == 1){
+        P.replaceAllUsesWith(P.getIncomingValue(0));
+        P.eraseFromParent();
+      }
+    }
+  }
+
   if (InnerLoopPreHeader != OuterLoopHeader) {
     for (Instruction &I :
          make_early_inc_range(make_range(InnerLoopPreHeader->begin(),
diff --git a/llvm/test/Transforms/LoopInterchange/inner-preheader-single-phi.ll b/llvm/test/Transforms/LoopInterchange/inner-preheader-single-phi.ll
new file mode 100644
index 0000000000000..baf1939602264
--- /dev/null
+++ b/llvm/test/Transforms/LoopInterchange/inner-preheader-single-phi.ll
@@ -0,0 +1,31 @@
+; RUN: opt -passes=loop-interchange -loop-interchange-profitabilities=ignore -S %s -o /dev/null
+
+define void @f(ptr %A) {
+entry:
+  br label %outer.header
+
+outer.header:
+  %i = phi i64 [ 0, %entry ], [ %i.inc, %outer.latch ]
+  br label %inner.ph
+
+inner.ph:
+  %p = phi i64 [ 42, %outer.header ]
+  br label %inner
+
+inner:
+  %j = phi i64 [ 0, %inner.ph ], [ %j.inc, %inner ]
+  %j.inc = add i64 %j, 1
+  %ec.j = icmp eq i64 %j.inc, 10
+  br i1 %ec.j, label %outer.body, label %inner
+
+outer.body:
+  br label %outer.latch
+
+outer.latch:
+  %i.inc = add i64 %i, 1
+  %ec.i = icmp eq i64 %i.inc, 10
+  br i1 %ec.i, label %exit, label %outer.header
+
+exit:
+  ret void
+}
\ No newline at end of file

>From aaa87d2fa9ad1b73f642a317d1b0a8e56c66a6e3 Mon Sep 17 00:00:00 2001
From: Harika Raja <sudha200215 at gmail.com>
Date: Sat, 9 May 2026 11:21:29 +0530
Subject: [PATCH 2/2] clang-format-testing

---
 llvm/lib/Transforms/Scalar/LoopInterchange.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Transforms/Scalar/LoopInterchange.cpp b/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
index a2618de20bfa4..68495eff5fa3b 100644
--- a/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
@@ -2020,12 +2020,12 @@ bool LoopInterchangeTransform::transform(
   BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader();
   BasicBlock *OuterLoopHeader = OuterLoop->getHeader();
 
-  //check if there are any Single path Phi Nodes in InnerLoop-Pre Header
+  // check if there are any Single path Phi Nodes in InnerLoop-Pre Header
 
-  if(InnerLoopPreHeader && InnerLoopPreHeader != OuterLoopHeader){
+  if (InnerLoopPreHeader && InnerLoopPreHeader != OuterLoopHeader) {
 
     for (PHINode &P : make_early_inc_range(InnerLoopPreHeader->phis())) {
-      if(P.getNumIncomingValues() == 1){
+      if (P.getNumIncomingValues() == 1) {
         P.replaceAllUsesWith(P.getIncomingValue(0));
         P.eraseFromParent();
       }



More information about the llvm-commits mailing list