[clang] [llvm] [LTO] Enable `PrepareForLTO` for loop unrolling in pre-link pipelines (PR #192155)
Justin Fargnoli via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 27 12:07:24 PDT 2026
https://github.com/justinfargnoli updated https://github.com/llvm/llvm-project/pull/192155
>From 7c5d872151bb5ab46d83f7e523bee342b3c59354 Mon Sep 17 00:00:00 2001
From: Justin Fargnoli <jfargnoli at nvidia.com>
Date: Wed, 15 Apr 2026 00:13:15 +0000
Subject: [PATCH 1/2] [LTO] Enable PrepareForLTO for loop unrolling in pre-link
pipelines
Set PrepareForLTO=true on the LoopFullUnrollPass in the O1 and O2
function simplification pipelines when running in a ThinLTO or
FullLTO pre-link phase. This defers unrolling of loops with calls
that may be inlined during the LTO link phase, allowing the post-link
unroller to make better decisions with fully resolved call targets.
---
llvm/lib/Passes/PassBuilderPipelines.cpp | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index b8c5b1eab2f97..d77b8e1f4998d 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -567,7 +567,8 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
PGOOpt->Action != PGOOptions::SampleUse)
LPM2.addPass(LoopFullUnrollPass(static_cast<int>(Level),
/* OnlyWhenForced= */ !PTO.LoopUnrolling,
- PTO.ForgetAllSCEVInLoopUnroll));
+ PTO.ForgetAllSCEVInLoopUnroll,
+ /* PrepareForLTO= */ isLTOPreLink(Phase)));
invokeLoopOptimizerEndEPCallbacks(LPM2, Level);
@@ -749,7 +750,8 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
PGOOpt->Action != PGOOptions::SampleUse)
LPM2.addPass(LoopFullUnrollPass(static_cast<int>(Level),
/* OnlyWhenForced= */ !PTO.LoopUnrolling,
- PTO.ForgetAllSCEVInLoopUnroll));
+ PTO.ForgetAllSCEVInLoopUnroll,
+ /* PrepareForLTO= */ isLTOPreLink(Phase)));
invokeLoopOptimizerEndEPCallbacks(LPM2, Level);
>From cfde2c2665b27d3ad162ec31ecb4ea68c1de1f60 Mon Sep 17 00:00:00 2001
From: Justin Fargnoli <jfargnoli at nvidia.com>
Date: Thu, 27 Aug 2026 19:06:59 +0000
Subject: [PATCH 2/2] Update test
---
clang/test/CodeGen/fat-lto-objects-cfi.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/test/CodeGen/fat-lto-objects-cfi.cpp b/clang/test/CodeGen/fat-lto-objects-cfi.cpp
index a41412e0d5148..f68d8243be76d 100644
--- a/clang/test/CodeGen/fat-lto-objects-cfi.cpp
+++ b/clang/test/CodeGen/fat-lto-objects-cfi.cpp
@@ -17,7 +17,7 @@
// TYPE_TEST-NEXT: %cmp14.not = icmp eq i64 %len, 0
// TYPE_TEST-NEXT: br i1 %cmp14.not, label %for.end7, label %for.cond1.preheader.preheader
// TYPE_TEST-LABEL: for.cond1.preheader.preheader: ; preds = %entry
-// TYPE_TEST-NEXT: %arrayidx.1 = getelementptr inbounds nuw i8, ptr %ptr, i64 4
+// TYPE_TEST-NEXT: %arrayidx.c = getelementptr inbounds nuw i8, ptr %ptr, i64 4
// TYPE_TEST-NEXT: br label %for.cond1.preheader
// The code below is a reduced case from https://github.com/llvm/llvm-project/issues/112053
More information about the cfe-commits
mailing list