[llvm] Fix profile metadata propagation in InstCombine takeLog2 (PR #179331)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 4 18:06:57 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Snehasish Kumar (snehasish)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/179331.diff
8 Files Affected:
- (modified) llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp (+6)
- (modified) llvm/test/Transforms/InstCombine/2005-04-07-UDivSelectCrash.ll (+15-4)
- (modified) llvm/test/Transforms/InstCombine/apint-div1.ll (+28-13)
- (modified) llvm/test/Transforms/InstCombine/apint-div2.ll (+28-13)
- (modified) llvm/test/Transforms/InstCombine/cttz.ll (+8-3)
- (modified) llvm/test/Transforms/InstCombine/div-shift.ll (+12-5)
- (modified) llvm/test/Transforms/InstCombine/mul-pow2.ll (+8-3)
- (modified) llvm/utils/profcheck-xfail.txt (-7)
``````````diff
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
index 759af82ebbbdc..d3ce1cd13dcb2 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
@@ -41,6 +41,10 @@
using namespace llvm;
using namespace PatternMatch;
+namespace llvm {
+extern cl::opt<bool> ProfcheckDisableMetadataFixes;
+}
+
/// The specific integer value is used in a context where it is known to be
/// non-zero. If this allows us to simplify the computation, do so and return
/// the new operand, otherwise return null.
@@ -1619,6 +1623,8 @@ Value *InstCombinerImpl::takeLog2(Value *Op, unsigned Depth, bool AssumeNonZero,
if (Value *LogY =
takeLog2(SI->getOperand(2), Depth, AssumeNonZero, DoFold))
return IfFold([&]() {
+ if (!ProfcheckDisableMetadataFixes)
+ return Builder.CreateSelect(SI->getOperand(0), LogX, LogY, "", SI);
return Builder.CreateSelect(SI->getOperand(0), LogX, LogY);
});
diff --git a/llvm/test/Transforms/InstCombine/2005-04-07-UDivSelectCrash.ll b/llvm/test/Transforms/InstCombine/2005-04-07-UDivSelectCrash.ll
index 64db3896d335f..4eed90afb1f83 100644
--- a/llvm/test/Transforms/InstCombine/2005-04-07-UDivSelectCrash.ll
+++ b/llvm/test/Transforms/InstCombine/2005-04-07-UDivSelectCrash.ll
@@ -1,8 +1,19 @@
-; RUN: opt < %s -passes=instcombine -disable-output
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -passes=instcombine -S | FileCheck %s
define i32 @test(i1 %C, i32 %tmp.15) {
- %tmp.16 = select i1 %C, i32 8, i32 1 ; <i32> [#uses=1]
- %tmp.18 = udiv i32 %tmp.15, %tmp.16 ; <i32> [#uses=1]
- ret i32 %tmp.18
+; CHECK-LABEL: define i32 @test(
+; CHECK-SAME: i1 [[C:%.*]], i32 [[TMP_15:%.*]]) {
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C]], i32 3, i32 0, !prof [[PROF0:![0-9]+]]
+; CHECK-NEXT: [[TMP_181:%.*]] = lshr i32 [[TMP_15]], [[TMP1]]
+; CHECK-NEXT: ret i32 [[TMP_181]]
+;
+ %tmp.16 = select i1 %C, i32 8, i32 1, !prof !0 ; <i32> [#uses=1]
+ %tmp.18 = udiv i32 %tmp.15, %tmp.16 ; <i32> [#uses=1]
+ ret i32 %tmp.18
}
+!0 = !{!"branch_weights", i32 10, i32 20}
+;.
+; CHECK: [[PROF0]] = !{!"branch_weights", i32 10, i32 20}
+;.
diff --git a/llvm/test/Transforms/InstCombine/apint-div1.ll b/llvm/test/Transforms/InstCombine/apint-div1.ll
index 22af6e9b9867f..beb6d2a973af0 100644
--- a/llvm/test/Transforms/InstCombine/apint-div1.ll
+++ b/llvm/test/Transforms/InstCombine/apint-div1.ll
@@ -1,22 +1,37 @@
-; This test makes sure that div instructions are properly eliminated.
-; This test is for Integer BitWidth < 64 && BitWidth % 2 != 0.
-;
-; RUN: opt < %s -passes=instcombine -S | not grep div
-
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
+; RUN: opt < %s -passes=instcombine -S | FileCheck %s
define i33 @test1(i33 %X) {
- %Y = udiv i33 %X, 4096
- ret i33 %Y
+; CHECK-LABEL: @test1(
+; CHECK-NEXT: [[Y:%.*]] = lshr i33 [[X:%.*]], 12
+; CHECK-NEXT: ret i33 [[Y]]
+;
+ %Y = udiv i33 %X, 4096
+ ret i33 %Y
}
define i49 @test2(i49 %X) {
- %tmp.0 = shl i49 4096, 17
- %Y = udiv i49 %X, %tmp.0
- ret i49 %Y
+; CHECK-LABEL: @test2(
+; CHECK-NEXT: [[Y:%.*]] = lshr i49 [[X:%.*]], 29
+; CHECK-NEXT: ret i49 [[Y]]
+;
+ %tmp.0 = shl i49 4096, 17
+ %Y = udiv i49 %X, %tmp.0
+ ret i49 %Y
}
define i59 @test3(i59 %X, i1 %C) {
- %V = select i1 %C, i59 1024, i59 4096
- %R = udiv i59 %X, %V
- ret i59 %R
+; CHECK-LABEL: @test3(
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C:%.*]], i59 10, i59 12, !prof [[PROF0:![0-9]+]]
+; CHECK-NEXT: [[R:%.*]] = lshr i59 [[X:%.*]], [[TMP1]]
+; CHECK-NEXT: ret i59 [[R]]
+;
+ %V = select i1 %C, i59 1024, i59 4096, !prof !0
+ %R = udiv i59 %X, %V
+ ret i59 %R
}
+
+!0 = !{!"branch_weights", i32 1, i32 2}
+;.
+; CHECK: [[PROF0]] = !{!"branch_weights", i32 1, i32 2}
+;.
diff --git a/llvm/test/Transforms/InstCombine/apint-div2.ll b/llvm/test/Transforms/InstCombine/apint-div2.ll
index 36a5bff23383f..2ce9ea165dc11 100644
--- a/llvm/test/Transforms/InstCombine/apint-div2.ll
+++ b/llvm/test/Transforms/InstCombine/apint-div2.ll
@@ -1,22 +1,37 @@
-; This test makes sure that div instructions are properly eliminated.
-; This test is for Integer BitWidth >= 64 && BitWidth <= 1024.
-;
-; RUN: opt < %s -passes=instcombine -S | not grep div
-
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
+; RUN: opt < %s -passes=instcombine -S | FileCheck %s
define i333 @test1(i333 %X) {
- %Y = udiv i333 %X, 70368744177664
- ret i333 %Y
+; CHECK-LABEL: @test1(
+; CHECK-NEXT: [[Y:%.*]] = lshr i333 [[X:%.*]], 46
+; CHECK-NEXT: ret i333 [[Y]]
+;
+ %Y = udiv i333 %X, 70368744177664
+ ret i333 %Y
}
define i499 @test2(i499 %X) {
- %tmp.0 = shl i499 4096, 197
- %Y = udiv i499 %X, %tmp.0
- ret i499 %Y
+; CHECK-LABEL: @test2(
+; CHECK-NEXT: [[Y:%.*]] = lshr i499 [[X:%.*]], 209
+; CHECK-NEXT: ret i499 [[Y]]
+;
+ %tmp.0 = shl i499 4096, 197
+ %Y = udiv i499 %X, %tmp.0
+ ret i499 %Y
}
define i599 @test3(i599 %X, i1 %C) {
- %V = select i1 %C, i599 70368744177664, i599 4096
- %R = udiv i599 %X, %V
- ret i599 %R
+; CHECK-LABEL: @test3(
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C:%.*]], i599 46, i599 12, !prof [[PROF0:![0-9]+]]
+; CHECK-NEXT: [[R:%.*]] = lshr i599 [[X:%.*]], [[TMP1]]
+; CHECK-NEXT: ret i599 [[R]]
+;
+ %V = select i1 %C, i599 70368744177664, i599 4096, !prof !0
+ %R = udiv i599 %X, %V
+ ret i599 %R
}
+
+!0 = !{!"branch_weights", i32 3, i32 4}
+;.
+; CHECK: [[PROF0]] = !{!"branch_weights", i32 3, i32 4}
+;.
diff --git a/llvm/test/Transforms/InstCombine/cttz.ll b/llvm/test/Transforms/InstCombine/cttz.ll
index 829213b24e93e..b3291e7058896 100644
--- a/llvm/test/Transforms/InstCombine/cttz.ll
+++ b/llvm/test/Transforms/InstCombine/cttz.ll
@@ -1,4 +1,4 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals smart
; RUN: opt < %s -S -passes=instcombine | FileCheck %s
declare i32 @llvm.cttz.i32(i32, i1)
@@ -341,16 +341,18 @@ define i8 @fold_ctz_log2_maybe_z_okay(i8 %x, i8 %y, i1 %c) {
; CHECK-LABEL: @fold_ctz_log2_maybe_z_okay(
; CHECK-NEXT: [[X:%.*]] = add i8 [[X1:%.*]], 1
; CHECK-NEXT: [[Y:%.*]] = add i8 [[Y1:%.*]], 2
-; CHECK-NEXT: [[V_V:%.*]] = select i1 [[C:%.*]], i8 [[X]], i8 [[Y]]
+; CHECK-NEXT: [[V_V:%.*]] = select i1 [[C:%.*]], i8 [[X]], i8 [[Y]], !prof [[PROF0:![0-9]+]]
; CHECK-NEXT: ret i8 [[V_V]]
;
%p2 = shl i8 2, %x
%p2_2 = shl i8 4, %y
- %v = select i1 %c, i8 %p2, i8 %p2_2
+ %v = select i1 %c, i8 %p2, i8 %p2_2, !prof !0
%r = call i8 @llvm.cttz(i8 %v, i1 true)
ret i8 %r
}
+!0 = !{!"branch_weights", i32 1, i32 2}
+
define i8 @fold_clz_log2(i8 %x) {
; CHECK-LABEL: @fold_clz_log2(
; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 5)
@@ -390,3 +392,6 @@ define i9 @fold_clz_log2_i9(i9 %x) {
%r = call i9 @llvm.ctlz(i9 %v, i1 true)
ret i9 %r
}
+;.
+; CHECK: [[PROF0]] = !{!"branch_weights", i32 1, i32 2}
+;.
diff --git a/llvm/test/Transforms/InstCombine/div-shift.ll b/llvm/test/Transforms/InstCombine/div-shift.ll
index fd857b983a788..5454a35dbcce8 100644
--- a/llvm/test/Transforms/InstCombine/div-shift.ll
+++ b/llvm/test/Transforms/InstCombine/div-shift.ll
@@ -1,4 +1,4 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals smart
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
declare void @use(i8)
@@ -77,18 +77,21 @@ define i32 @t4(i32 %x, i32 %y) {
define i32 @t5(i1 %x, i1 %y, i32 %V) {
; CHECK-LABEL: @t5(
-; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[X:%.*]], i32 5, i32 6
-; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[Y:%.*]], i32 [[TMP1]], i32 [[V:%.*]]
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[X:%.*]], i32 5, i32 6, !prof [[PROF0:![0-9]+]]
+; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[Y:%.*]], i32 [[TMP1]], i32 [[V:%.*]], !prof [[PROF1:![0-9]+]]
; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[V]], [[TMP2]]
; CHECK-NEXT: ret i32 [[TMP3]]
;
%1 = shl i32 1, %V
- %2 = select i1 %x, i32 32, i32 64
- %3 = select i1 %y, i32 %2, i32 %1
+ %2 = select i1 %x, i32 32, i32 64, !prof !0
+ %3 = select i1 %y, i32 %2, i32 %1, !prof !1
%4 = udiv i32 %V, %3
ret i32 %4
}
+!0 = !{!"branch_weights", i32 1, i32 2}
+!1 = !{!"branch_weights", i32 3, i32 4}
+
define i32 @t6(i32 %x, i32 %z) {
; CHECK-LABEL: @t6(
; CHECK-NEXT: [[DIVISOR:%.*]] = call i32 @llvm.umax.i32(i32 [[X:%.*]], i32 1)
@@ -1397,3 +1400,7 @@ start:
%div = udiv i8 %x, %y
ret i8 %div
}
+;.
+; CHECK: [[PROF0]] = !{!"branch_weights", i32 1, i32 2}
+; CHECK: [[PROF1]] = !{!"branch_weights", i32 3, i32 4}
+;.
diff --git a/llvm/test/Transforms/InstCombine/mul-pow2.ll b/llvm/test/Transforms/InstCombine/mul-pow2.ll
index bc172f0152fe5..92c40ee841572 100644
--- a/llvm/test/Transforms/InstCombine/mul-pow2.ll
+++ b/llvm/test/Transforms/InstCombine/mul-pow2.ll
@@ -1,17 +1,19 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals smart
; RUN: opt -passes=instcombine -S < %s | FileCheck %s
declare void @use_i8(i8)
define i8 @mul_selectp2_x(i8 %x, i1 %c) {
; CHECK-LABEL: @mul_selectp2_x(
-; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C:%.*]], i8 1, i8 2
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C:%.*]], i8 1, i8 2, !prof [[PROF0:![0-9]+]]
; CHECK-NEXT: [[R:%.*]] = shl i8 [[X:%.*]], [[TMP1]]
; CHECK-NEXT: ret i8 [[R]]
;
- %s = select i1 %c, i8 2, i8 4
+ %s = select i1 %c, i8 2, i8 4, !prof !0
%r = mul i8 %s, %x
ret i8 %r
}
+!0 = !{!"branch_weights", i32 1, i32 2}
+
define i8 @mul_selectp2_x_propegate_nuw(i8 %x, i1 %c) {
; CHECK-LABEL: @mul_selectp2_x_propegate_nuw(
@@ -136,3 +138,6 @@ define i8 @shl_add_log_may_cause_poison_pr62175_with_nsw(i8 %x, i8 %y) {
%mul = mul i8 %y, %shl
ret i8 %mul
}
+;.
+; CHECK: [[PROF0]] = !{!"branch_weights", i32 1, i32 2}
+;.
diff --git a/llvm/utils/profcheck-xfail.txt b/llvm/utils/profcheck-xfail.txt
index 414b47d08683d..2849d03bb61dd 100644
--- a/llvm/utils/profcheck-xfail.txt
+++ b/llvm/utils/profcheck-xfail.txt
@@ -207,13 +207,10 @@ Transforms/IndVarSimplify/invalidate-modified-lcssa-phi.ll
Transforms/IndVarSimplify/pr45835.ll
Transforms/IndVarSimplify/preserving-debugloc-rem-div.ll
Transforms/InstCombine/2004-09-20-BadLoadCombine.ll
-Transforms/InstCombine/2005-04-07-UDivSelectCrash.ll
Transforms/InstCombine/add-shl-mul-umax.ll
Transforms/InstCombine/and2.ll
Transforms/InstCombine/and-fcmp.ll
Transforms/InstCombine/and-or-icmps.ll
-Transforms/InstCombine/apint-div1.ll
-Transforms/InstCombine/apint-div2.ll
Transforms/InstCombine/atomic.ll
Transforms/InstCombine/binop-cast.ll
Transforms/InstCombine/binop-select-cast-of-select-cond.ll
@@ -224,9 +221,6 @@ Transforms/InstCombine/canonicalize-clamp-like-pattern-between-negative-and-posi
Transforms/InstCombine/canonicalize-clamp-like-pattern-between-zero-and-positive-threshold.ll
Transforms/InstCombine/cast-mul-select.ll
Transforms/InstCombine/clamp-to-minmax.ll
-Transforms/InstCombine/cttz.ll
-Transforms/InstCombine/div.ll
-Transforms/InstCombine/div-shift.ll
Transforms/InstCombine/fabs.ll
Transforms/InstCombine/fcmp-select.ll
Transforms/InstCombine/ffs-1.ll
@@ -258,7 +252,6 @@ Transforms/InstCombine/minmax-fp.ll
Transforms/InstCombine/minmax-intrinsics.ll
Transforms/InstCombine/mul-inseltpoison.ll
Transforms/InstCombine/mul.ll
-Transforms/InstCombine/mul-pow2.ll
Transforms/InstCombine/multiple-uses-load-bitcast-select.ll
Transforms/InstCombine/nested-select.ll
Transforms/InstCombine/or-fcmp.ll
``````````
</details>
https://github.com/llvm/llvm-project/pull/179331
More information about the llvm-commits
mailing list