[llvm] [SimplifyCFG] Add loop metadata to the new branch when doing jump-threading (PR #157180)

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 10 11:55:17 PDT 2025


https://github.com/asastry108 updated https://github.com/llvm/llvm-project/pull/157180

>From cdb8e08a928256c13aa93e3e9e60e94ef717a2fa Mon Sep 17 00:00:00 2001
From: asastry <asastry at nvidia.com>
Date: Thu, 28 Aug 2025 23:49:02 +0000
Subject: [PATCH 1/4] Add loop metadata to the new branch when doing
 jump-threading

---
 llvm/lib/Transforms/Utils/SimplifyCFG.cpp     |  3 ++
 .../preserve-llvm-loop-metadata-2.ll          | 30 +++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll

diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 86d4750f6f000..193dad9672098 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -3602,6 +3602,9 @@ foldCondBranchOnValueKnownInPredecessorImpl(BranchInst *BI, DomTreeUpdater *DTU,
     EdgeBB->setName(RealDest->getName() + ".critedge");
     EdgeBB->moveBefore(RealDest);
 
+    if (MDNode *LoopMD = BI->getMetadata(LLVMContext::MD_loop))
+      EdgeBB->getTerminator()->setMetadata(LLVMContext::MD_loop, LoopMD);
+
     // Update PHI nodes.
     addPredecessorToBlock(RealDest, EdgeBB, BB);
 
diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll b/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll
new file mode 100644
index 0000000000000..9a296c928f401
--- /dev/null
+++ b/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll
@@ -0,0 +1,30 @@
+; RUN: opt -passes='simplifycfg' -S < %s | FileCheck %s
+
+; CHECK: br i1 %4, label %3, label %1, 
+; CHECK-SAME: llvm.loop
+
+define void @test(i32 %1 ) {
+.critedge:
+  br label %107
+
+107:                                              ; preds = %147, .critedge 
+  %111 = icmp eq i32 %1, 0
+  br i1 %111, label %112, label %156
+
+112:                                              ; preds = %107
+  br label %147
+
+147:                                              ; preds = %149, %112
+  %148 = phi i1 [ false, %149 ], [ true, %112 ]
+  br i1 %148, label %149, label %107, !llvm.loop !32
+
+149:                                              ; preds = %147
+  br label %147
+
+156:                                              ; preds = %107
+   ret void
+} 
+
+!32 = distinct !{!32, !33, !34}
+!33 = !{!"llvm.loop.unroll.enable"}
+!34 = !{!"llvm.loop.unroll.full"}

>From 042d4783fea31b081cdea23f6ceca5e6724d0edd Mon Sep 17 00:00:00 2001
From: asastry <asastry at nvidia.com>
Date: Tue, 9 Sep 2025 03:32:17 +0000
Subject: [PATCH 2/4] replaced loop header blocks with named labels, as per
 review suggestion

---
 .../preserve-llvm-loop-metadata-2.ll          | 20 +++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll b/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll
index 9a296c928f401..a5428268b718a 100644
--- a/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll
+++ b/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll
@@ -1,27 +1,27 @@
 ; RUN: opt -passes='simplifycfg' -S < %s | FileCheck %s
 
-; CHECK: br i1 %4, label %3, label %1, 
+; CHECK: br i1 %2, label %loop2, label %loop1
 ; CHECK-SAME: llvm.loop
 
 define void @test(i32 %1 ) {
 .critedge:
-  br label %107
+  br label %loop1 
 
-107:                                              ; preds = %147, .critedge 
+loop1:                                              ; preds = %loop2, .critedge 
   %111 = icmp eq i32 %1, 0
   br i1 %111, label %112, label %156
 
-112:                                              ; preds = %107
-  br label %147
+112:                                              ; preds = %loop1 
+  br label %loop2 
 
-147:                                              ; preds = %149, %112
+loop2:                                              ; preds = %149, %112
   %148 = phi i1 [ false, %149 ], [ true, %112 ]
-  br i1 %148, label %149, label %107, !llvm.loop !32
+  br i1 %148, label %149, label %loop1, !llvm.loop !32
 
-149:                                              ; preds = %147
-  br label %147
+149:                                              ; preds = %loop2 
+  br label %loop2 
 
-156:                                              ; preds = %107
+156:                                              ; preds = loop1 
    ret void
 } 
 

>From 4394b7d6133369ef0b0890346137ceca63375273 Mon Sep 17 00:00:00 2001
From: asastry <asastry at nvidia.com>
Date: Tue, 9 Sep 2025 04:23:28 +0000
Subject: [PATCH 3/4] used updte_test_checks.py, as per review feedback

---
 .../preserve-llvm-loop-metadata-2.ll          | 37 ++++++++++++++-----
 1 file changed, 28 insertions(+), 9 deletions(-)

diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll b/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll
index a5428268b718a..60bfe4d5c076e 100644
--- a/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll
+++ b/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll
@@ -1,30 +1,49 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -passes='simplifycfg' -S < %s | FileCheck %s
 
 ; CHECK: br i1 %2, label %loop2, label %loop1
 ; CHECK-SAME: llvm.loop
 
 define void @test(i32 %1 ) {
+; CHECK-LABEL: define void @test(
+; CHECK-SAME: i32 [[TMP0:%.*]]) {
+; CHECK-NEXT:  [[_CRITEDGE:.*:]]
+; CHECK-NEXT:    br label %[[LOOP1:.*]]
+; CHECK:       [[LOOP1]]:
+; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 0
+; CHECK-NEXT:    br i1 [[TMP1]], label %[[LOOP2:.*]], label %[[BB3:.*]]
+; CHECK:       [[LOOP2]]:
+; CHECK-NEXT:    [[TMP2:%.*]] = phi i1 [ true, %[[LOOP1]] ], [ false, %[[LOOP2]] ]
+; CHECK-NEXT:    br i1 [[TMP2]], label %[[LOOP2]], label %[[LOOP1]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK:       [[BB3]]:
+; CHECK-NEXT:    ret void
+;
 .critedge:
-  br label %loop1 
+  br label %loop1
 
-loop1:                                              ; preds = %loop2, .critedge 
+loop1:                                              ; preds = %loop2, .critedge
   %111 = icmp eq i32 %1, 0
   br i1 %111, label %112, label %156
 
-112:                                              ; preds = %loop1 
-  br label %loop2 
+112:                                              ; preds = %loop1
+  br label %loop2
 
 loop2:                                              ; preds = %149, %112
   %148 = phi i1 [ false, %149 ], [ true, %112 ]
   br i1 %148, label %149, label %loop1, !llvm.loop !32
 
-149:                                              ; preds = %loop2 
-  br label %loop2 
+149:                                              ; preds = %loop2
+  br label %loop2
 
-156:                                              ; preds = loop1 
-   ret void
-} 
+156:                                              ; preds = loop1
+  ret void
+}
 
 !32 = distinct !{!32, !33, !34}
 !33 = !{!"llvm.loop.unroll.enable"}
 !34 = !{!"llvm.loop.unroll.full"}
+;.
+; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
+; CHECK: [[META1]] = !{!"llvm.loop.unroll.enable"}
+; CHECK: [[META2]] = !{!"llvm.loop.unroll.full"}
+;.

>From 6e2e3ad13ba09768240427d7a9b6886c131ad9c1 Mon Sep 17 00:00:00 2001
From: asastry <asastry at nvidia.com>
Date: Tue, 9 Sep 2025 22:50:03 +0000
Subject: [PATCH 4/4] updated numbered labels with meaningful names

---
 .../preserve-llvm-loop-metadata-2.ll          | 20 +++++++++----------
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll b/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll
index 60bfe4d5c076e..e11ba39a1424d 100644
--- a/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll
+++ b/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll
@@ -1,8 +1,6 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -passes='simplifycfg' -S < %s | FileCheck %s
 
-; CHECK: br i1 %2, label %loop2, label %loop1
-; CHECK-SAME: llvm.loop
 
 define void @test(i32 %1 ) {
 ; CHECK-LABEL: define void @test(
@@ -18,24 +16,24 @@ define void @test(i32 %1 ) {
 ; CHECK:       [[BB3]]:
 ; CHECK-NEXT:    ret void
 ;
-.critedge:
+entry:
   br label %loop1
 
-loop1:                                              ; preds = %loop2, .critedge
+loop1:                                              ; preds = %loop2, %entry 
   %111 = icmp eq i32 %1, 0
-  br i1 %111, label %112, label %156
+  br i1 %111, label %trampoline, label %retlabel
 
-112:                                              ; preds = %loop1
+trampoline:                                              ; preds = %loop1
   br label %loop2
 
-loop2:                                              ; preds = %149, %112
-  %148 = phi i1 [ false, %149 ], [ true, %112 ]
-  br i1 %148, label %149, label %loop1, !llvm.loop !32
+loop2:                                              ; preds = %loop2latch, %trampoline
+  %148 = phi i1 [ false, %loop2latch ], [ true, %trampoline ]
+  br i1 %148, label %loop2latch, label %loop1, !llvm.loop !32
 
-149:                                              ; preds = %loop2
+loop2latch:                                              ; preds = %loop2
   br label %loop2
 
-156:                                              ; preds = loop1
+retlabel:                                              ; preds = loop1
   ret void
 }
 



More information about the llvm-commits mailing list