[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