[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