[llvm] 957952d - [JumpThreading] Preserve profile metadata during select unfolding
Max Kazantsev via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 9 01:15:10 PST 2023
Author: Max Kazantsev
Date: 2023-01-09T16:14:58+07:00
New Revision: 957952dbf2f34ed552e8e1f8c35eed17eee2ea38
URL: https://github.com/llvm/llvm-project/commit/957952dbf2f34ed552e8e1f8c35eed17eee2ea38
DIFF: https://github.com/llvm/llvm-project/commit/957952dbf2f34ed552e8e1f8c35eed17eee2ea38.diff
LOG: [JumpThreading] Preserve profile metadata during select unfolding
Jump threading can replace select and unconditional branch with
conditional branch, but when doing so loses profile information.
This destructive transform can eventually lead to a performance
degradation due to folding of branches in
shouldFoldCondBranchesToCommonDestination as branch probabilities
are no longer known.
Patch by Roman Paukner!
Differential Revision: https://reviews.llvm.org/D138132
Reviewed By: mkazantsev
Added:
Modified:
llvm/lib/Transforms/Scalar/JumpThreading.cpp
llvm/test/Transforms/JumpThreading/select.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
index b6adea4beedb3..f1d622a52e8cb 100644
--- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
@@ -2758,8 +2758,24 @@ void JumpThreadingPass::unfoldSelectInstr(BasicBlock *Pred, BasicBlock *BB,
// Create a conditional branch and update PHI nodes.
auto *BI = BranchInst::Create(NewBB, BB, SI->getCondition(), Pred);
BI->applyMergedLocation(PredTerm->getDebugLoc(), SI->getDebugLoc());
+ BI->copyMetadata(*SI, {LLVMContext::MD_prof});
SIUse->setIncomingValue(Idx, SI->getFalseValue());
SIUse->addIncoming(SI->getTrueValue(), NewBB);
+ // Set the block frequency of NewBB.
+ if (HasProfileData) {
+ uint64_t TrueWeight, FalseWeight;
+ if (extractBranchWeights(*SI, TrueWeight, FalseWeight) &&
+ (TrueWeight + FalseWeight) != 0) {
+ SmallVector<BranchProbability, 2> BP;
+ BP.emplace_back(BranchProbability(TrueWeight, TrueWeight + FalseWeight));
+ BP.emplace_back(BranchProbability(FalseWeight, TrueWeight + FalseWeight));
+ BPI->setEdgeProbability(Pred, BP);
+ }
+
+ auto NewBBFreq =
+ BFI->getBlockFreq(Pred) * BPI->getEdgeProbability(Pred, NewBB);
+ BFI->setBlockFreq(NewBB, NewBBFreq.getFrequency());
+ }
// The select is now dead.
SI->eraseFromParent();
diff --git a/llvm/test/Transforms/JumpThreading/select.ll b/llvm/test/Transforms/JumpThreading/select.ll
index aedfab851d5d5..4c7f3ea7d2778 100644
--- a/llvm/test/Transforms/JumpThreading/select.ll
+++ b/llvm/test/Transforms/JumpThreading/select.ll
@@ -1,5 +1,12 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt -S -passes=jump-threading < %s | FileCheck %s
+; RUN: opt -S -passes=jump-threading -debug-only=branch-prob < %s 2>&1 | FileCheck %s
+
+; CHECK-LABEL: ---- Branch Probability Info : unfold1 ----
+; CHECK: set edge cond.false -> 0 successor probability to 0x0ccccccd / 0x80000000 = 10.00%
+; CHECK: set edge cond.false -> 1 successor probability to 0x73333333 / 0x80000000 = 90.00%
+; CHECK-LABEL: ---- Branch Probability Info : unfold2 ----
+; CHECK: set edge cond.false -> 0 successor probability to 0x0ccccccd / 0x80000000 = 10.00%
+; CHECK: set edge cond.false -> 1 successor probability to 0x73333333 / 0x80000000 = 90.00%
declare void @foo()
declare void @bar()
@@ -265,7 +272,7 @@ L4:
ret void
}
-define void @unfold1(double %x, double %y) nounwind {
+define void @unfold1(double %x, double %y) nounwind !prof !1 {
; CHECK-LABEL: @unfold1(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[SUB:%.*]] = fsub double [[X:%.*]], [[Y:%.*]]
@@ -274,7 +281,7 @@ define void @unfold1(double %x, double %y) nounwind {
; CHECK: cond.false:
; CHECK-NEXT: [[ADD:%.*]] = fadd double [[X]], [[Y]]
; CHECK-NEXT: [[CMP1:%.*]] = fcmp ogt double [[ADD]], 1.000000e+01
-; CHECK-NEXT: br i1 [[CMP1]], label [[COND_END4]], label [[IF_THEN:%.*]]
+; CHECK-NEXT: br i1 [[CMP1]], label [[COND_END4]], label [[IF_THEN:%.*]], !prof [[PROF1:![0-9]+]]
; CHECK: cond.end4:
; CHECK-NEXT: [[COND5:%.*]] = phi double [ [[SUB]], [[ENTRY:%.*]] ], [ [[ADD]], [[COND_FALSE]] ]
; CHECK-NEXT: [[CMP6:%.*]] = fcmp oeq double [[COND5]], 0.000000e+00
@@ -293,7 +300,7 @@ entry:
cond.false: ; preds = %entry
%add = fadd double %x, %y
%cmp1 = fcmp ogt double %add, 1.000000e+01
- %add. = select i1 %cmp1, double %add, double 0.000000e+00
+ %add. = select i1 %cmp1, double %add, double 0.000000e+00, !prof !0
br label %cond.end4
cond.end4: ; preds = %entry, %cond.false
@@ -311,7 +318,7 @@ if.end: ; preds = %if.then, %cond.end4
}
-define void @unfold2(i32 %x, i32 %y) nounwind {
+define void @unfold2(i32 %x, i32 %y) nounwind !prof !1 {
; CHECK-LABEL: @unfold2(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
@@ -320,7 +327,7 @@ define void @unfold2(i32 %x, i32 %y) nounwind {
; CHECK: cond.false:
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X]], [[Y]]
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[ADD]], 10
-; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[COND_END4:%.*]]
+; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[COND_END4:%.*]], !prof [[PROF1:![0-9]+]]
; CHECK: cond.end4:
; CHECK-NEXT: [[COND5:%.*]] = phi i32 [ [[ADD]], [[COND_FALSE]] ]
; CHECK-NEXT: [[CMP6:%.*]] = icmp eq i32 [[COND5]], 0
@@ -339,7 +346,7 @@ entry:
cond.false: ; preds = %entry
%add = add nsw i32 %x, %y
%cmp1 = icmp sgt i32 %add, 10
- %add. = select i1 %cmp1, i32 0, i32 %add
+ %add. = select i1 %cmp1, i32 0, i32 %add, !prof !0
br label %cond.end4
cond.end4: ; preds = %entry, %cond.false
@@ -652,3 +659,6 @@ if.end:
%v1 = select i1 %v, i32 %s, i32 42
ret i32 %v1
}
+
+!0 = !{!"branch_weights", i32 1, i32 9}
+!1 = !{!"function_entry_count", i64 1984}
More information about the llvm-commits
mailing list