[llvm] [CorrelatedValuePropagation] Run CVP before first SimplifyCFG (PR #141125)

via llvm-commits llvm-commits at lists.llvm.org
Thu May 22 15:10:49 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: Florian Mayer (fmayer)

<details>
<summary>Changes</summary>

SimplifyCFG converts some explicit branches into select instructions,
which obscures the branch conditions from CVP in some cases. This leads
to suboptimal codegen, where we do not eliminated branches that are
impossible.


---
Full diff: https://github.com/llvm/llvm-project/pull/141125.diff


6 Files Affected:

- (modified) llvm/lib/Passes/PassBuilderPipelines.cpp (+5) 
- (modified) llvm/test/Other/new-pm-defaults.ll (+9-3) 
- (modified) llvm/test/Other/new-pm-thinlto-prelink-defaults.ll (+9-3) 
- (modified) llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll (+9-3) 
- (modified) llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll (+9-3) 
- (added) llvm/test/Transforms/CorrelatedValuePropagation/O2-convertible-to-select.ll (+43) 


``````````diff
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 5a85b308925a6..c09ffbeb56ad1 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -1123,6 +1123,11 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
     // Compare/branch metadata may alter the behavior of passes like
     // SimplifyCFG.
     EarlyFPM.addPass(LowerExpectIntrinsicPass());
+    // We need to run CorrelatedValuePropagationPass before the first
+    // SimplifyCFG, because that can obscure branch conditions by converting
+    // branches into `select`.
+    if (Level.getSpeedupLevel() > 1 || Level.getSizeLevel() > 0)
+      EarlyFPM.addPass(CorrelatedValuePropagationPass());
     EarlyFPM.addPass(SimplifyCFGPass());
     EarlyFPM.addPass(SROAPass(SROAOptions::ModifyCFG));
     EarlyFPM.addPass(EarlyCSEPass());
diff --git a/llvm/test/Other/new-pm-defaults.ll b/llvm/test/Other/new-pm-defaults.ll
index c554fdbf4c799..3e44fafaa94aa 100644
--- a/llvm/test/Other/new-pm-defaults.ll
+++ b/llvm/test/Other/new-pm-defaults.ll
@@ -107,11 +107,17 @@
 ; CHECK-O-NEXT: Running pass: CoroEarlyPass
 ; CHECK-O-NEXT: Running pass: EntryExitInstrumenterPass
 ; CHECK-O-NEXT: Running pass: LowerExpectIntrinsicPass
+; CHECK-O23SZ-NEXT: Running pass: CorrelatedValuePropagationPass
+; CHECK-O23SZ-NEXT: Running analysis: LazyValueAnalysis
+; CHECK-O23SZ-NEXT: Running analysis: AssumptionAnalysis
+; CHECK-O23SZ-NEXT: Running analysis: TargetIRAnalysis
+; CHECK-O23SZ-NEXT: Running analysis: DominatorTreeAnalysis
+; CHECK-O23SZ-NEXT: Invalidating analysis: LazyValueAnalysis
 ; CHECK-O-NEXT: Running pass: SimplifyCFGPass
-; CHECK-O-NEXT: Running analysis: TargetIRAnalysis
-; CHECK-O-NEXT: Running analysis: AssumptionAnalysis
+; CHECK-O1-NEXT: Running analysis: TargetIRAnalysis
+; CHECK-O1-NEXT: Running analysis: AssumptionAnalysis
 ; CHECK-O-NEXT: Running pass: SROAPass
-; CHECK-O-NEXT: Running analysis: DominatorTreeAnalysis
+; CHECK-O1-NEXT: Running analysis: DominatorTreeAnalysis
 ; CHECK-O-NEXT: Running pass: EarlyCSEPass
 ; CHECK-O-NEXT: Running analysis: TargetLibraryAnalysis
 ; CHECK-O3-NEXT: Running pass: CallSiteSplittingPass
diff --git a/llvm/test/Other/new-pm-thinlto-prelink-defaults.ll b/llvm/test/Other/new-pm-thinlto-prelink-defaults.ll
index 5aacd26def2be..6e5e4fa90ba6d 100644
--- a/llvm/test/Other/new-pm-thinlto-prelink-defaults.ll
+++ b/llvm/test/Other/new-pm-thinlto-prelink-defaults.ll
@@ -72,11 +72,17 @@
 ; CHECK-O-NEXT: Running pass: CoroEarlyPass
 ; CHECK-O-NEXT: Running pass: EntryExitInstrumenterPass
 ; CHECK-O-NEXT: Running pass: LowerExpectIntrinsicPass
+; CHECK-O23SZ-NEXT: Running pass: CorrelatedValuePropagationPass
+; CHECK-O23SZ-NEXT: Running analysis: LazyValueAnalysis
+; CHECK-O23SZ-NEXT: Running analysis: AssumptionAnalysis
+; CHECK-O23SZ-NEXT: Running analysis: TargetIRAnalysis
+; CHECK-O23SZ-NEXT: Running analysis: DominatorTreeAnalysis
+; CHECK-O23SZ-NEXT: Invalidating analysis: LazyValueAnalysis
 ; CHECK-O-NEXT: Running pass: SimplifyCFGPass
-; CHECK-O-NEXT: Running analysis: TargetIRAnalysis
-; CHECK-O-NEXT: Running analysis: AssumptionAnalysis
+; CHECK-O1-NEXT: Running analysis: TargetIRAnalysis
+; CHECK-O1-NEXT: Running analysis: AssumptionAnalysis
 ; CHECK-O-NEXT: Running pass: SROAPass
-; CHECK-O-NEXT: Running analysis: DominatorTreeAnalysis
+; CHECK-O1-NEXT: Running analysis: DominatorTreeAnalysis
 ; CHECK-O-NEXT: Running pass: EarlyCSEPass
 ; CHECK-O-NEXT: Running analysis: TargetLibraryAnalysis
 ; CHECK-O3-NEXT: Running pass: CallSiteSplittingPass
diff --git a/llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll
index f6a9406596803..c255ab1991813 100644
--- a/llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll
+++ b/llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll
@@ -36,11 +36,17 @@
 ; CHECK-O-NEXT: Running pass: CoroEarlyPass
 ; CHECK-O-NEXT: Running pass: EntryExitInstrumenterPass
 ; CHECK-O-NEXT: Running pass: LowerExpectIntrinsicPass
+; CHECK-O23SZ-NEXT: Running pass: CorrelatedValuePropagationPass
+; CHECK-O23SZ-NEXT: Running analysis: LazyValueAnalysis
+; CHECK-O23SZ-NEXT: Running analysis: AssumptionAnalysis
+; CHECK-O23SZ-NEXT: Running analysis: TargetIRAnalysis
+; CHECK-O23SZ-NEXT: Running analysis: DominatorTreeAnalysis
+; CHECK-O23SZ-NEXT: Invalidating analysis: LazyValueAnalysis
 ; CHECK-O-NEXT: Running pass: SimplifyCFGPass
-; CHECK-O-NEXT: Running analysis: TargetIRAnalysis
-; CHECK-O-NEXT: Running analysis: AssumptionAnalysis
+; CHECK-O1-NEXT: Running analysis: TargetIRAnalysis
+; CHECK-O1-NEXT: Running analysis: AssumptionAnalysis
 ; CHECK-O-NEXT: Running pass: SROAPass
-; CHECK-O-NEXT: Running analysis: DominatorTreeAnalysis
+; CHECK-O1-NEXT: Running analysis: DominatorTreeAnalysis
 ; CHECK-O-NEXT: Running pass: EarlyCSEPass
 ; CHECK-O-NEXT: Running analysis: TargetLibraryAnalysis
 ; CHECK-O3-NEXT: Running pass: CallSiteSplittingPass
diff --git a/llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll
index 48a9433d24999..c5bfe24af4b1b 100644
--- a/llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll
+++ b/llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll
@@ -35,11 +35,17 @@
 ; CHECK-O-NEXT: Running pass: CoroEarlyPass
 ; CHECK-O-NEXT: Running pass: EntryExitInstrumenterPass
 ; CHECK-O-NEXT: Running pass: LowerExpectIntrinsicPass
+; CHECK-O23SZ-NEXT: Running pass: CorrelatedValuePropagationPass
+; CHECK-O23SZ-NEXT: Running analysis: LazyValueAnalysis
+; CHECK-O23SZ-NEXT: Running analysis: AssumptionAnalysis
+; CHECK-O23SZ-NEXT: Running analysis: TargetIRAnalysis
+; CHECK-O23SZ-NEXT: Running analysis: DominatorTreeAnalysis
+; CHECK-O23SZ-NEXT: Invalidating analysis: LazyValueAnalysis
 ; CHECK-O-NEXT: Running pass: SimplifyCFGPass
-; CHECK-O-NEXT: Running analysis: TargetIRAnalysis
-; CHECK-O-NEXT: Running analysis: AssumptionAnalysis
+; CHECK-O1-NEXT: Running analysis: TargetIRAnalysis
+; CHECK-O1-NEXT: Running analysis: AssumptionAnalysis
 ; CHECK-O-NEXT: Running pass: SROAPass
-; CHECK-O-NEXT: Running analysis: DominatorTreeAnalysis
+; CHECK-O1-NEXT: Running analysis: DominatorTreeAnalysis
 ; CHECK-O-NEXT: Running pass: EarlyCSEPass
 ; CHECK-O-NEXT: Running analysis: TargetLibraryAnalysis
 ; CHECK-O3-NEXT: Running pass: CallSiteSplittingPass
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/O2-convertible-to-select.ll b/llvm/test/Transforms/CorrelatedValuePropagation/O2-convertible-to-select.ll
new file mode 100644
index 0000000000000..0aecd2fa6410a
--- /dev/null
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/O2-convertible-to-select.ll
@@ -0,0 +1,43 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -O2 < %s | FileCheck %s
+
+; Make sure we can get rid off the unnecessary branch in O2.
+; CorrelatedValuePropagation does not handle `select` correctly, so we need
+; to check for correct pass ordering.
+
+declare void @bar(i8)
+
+define void @foo(i8 %1) {
+; CHECK-LABEL: @foo(
+; CHECK-NEXT:    [[TMP2:%.*]] = srem i8 [[TMP0:%.*]], 12
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp slt i8 [[TMP2]], 1
+; CHECK-NEXT:    [[TMP4:%.*]] = add nsw i8 [[TMP2]], 12
+; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[TMP3]], i8 [[TMP4]], i8 [[TMP2]]
+; CHECK-NEXT:    tail call void @bar(i8 [[SPEC_SELECT]])
+; CHECK-NEXT:    ret void
+;
+2:
+  %3 = srem i8 %1, 12
+  %4 = icmp slt i8 %3, 1
+  br i1 %4, label %5, label %7
+
+5:
+  %6 = add nsw i8 %3, 12
+  br label %7
+
+7:
+  %8 = phi i8 [ %6, %5 ], [ %3, %2 ]
+  br label %9
+
+9:
+  %10 = icmp ult i8 %8, 13
+  br i1 %10, label %11, label %12
+
+11:
+  call void @bar(i8 %8)
+  ret void
+
+12:
+  tail call void @llvm.ubsantrap(i8 18)
+  unreachable
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/141125


More information about the llvm-commits mailing list