[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