[llvm] 7c1b80e - [ConstraintElim] Support unsigned decomposition of mul/shl nuw..const
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sat Oct 15 13:28:50 PDT 2022
Author: Florian Hahn
Date: 2022-10-15T21:28:08+01:00
New Revision: 7c1b80e35c4a08ff3e0ddaca39a1e6c13b2ecc12
URL: https://github.com/llvm/llvm-project/commit/7c1b80e35c4a08ff3e0ddaca39a1e6c13b2ecc12
DIFF: https://github.com/llvm/llvm-project/commit/7c1b80e35c4a08ff3e0ddaca39a1e6c13b2ecc12.diff
LOG: [ConstraintElim] Support unsigned decomposition of mul/shl nuw..const
Support decomposition for `mul/shl nuw` with constant operand for unsigned
queries. Those expressions should not wrap in the unsigned sense and can
be added directly to the unsigned system.
Added:
Modified:
llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
llvm/test/Transforms/ConstraintElimination/mul.ll
llvm/test/Transforms/ConstraintElimination/shl.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index d2f4e735cd6c6..e1290e9443f93 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -381,6 +381,22 @@ decompose(Value *V, SmallVector<PreconditionTy, 4> &Preconditions,
return MergeResults(Op0, CI, true);
}
+ if (match(V, m_NUWShl(m_Value(Op1), m_ConstantInt(CI))) && canUseSExt(CI)) {
+ int64_t Mult = int64_t(std::pow(int64_t(2), CI->getSExtValue()));
+ auto Result = decompose(Op1, Preconditions, IsSigned, DL);
+ for (auto &KV : Result)
+ KV.Coefficient *= Mult;
+ return Result;
+ }
+
+ if (match(V, m_NUWMul(m_Value(Op1), m_ConstantInt(CI))) && canUseSExt(CI) &&
+ (!CI->isNegative())) {
+ auto Result = decompose(Op1, Preconditions, IsSigned, DL);
+ for (auto &KV : Result)
+ KV.Coefficient *= CI->getSExtValue();
+ return Result;
+ }
+
if (match(V, m_NUWSub(m_Value(Op0), m_ConstantInt(CI))) && canUseSExt(CI))
return {{-1 * CI->getSExtValue(), nullptr}, {1, Op0}};
if (match(V, m_NUWSub(m_Value(Op0), m_Value(Op1))))
diff --git a/llvm/test/Transforms/ConstraintElimination/mul.ll b/llvm/test/Transforms/ConstraintElimination/mul.ll
index 8099addd1def8..29d08c0af2a9d 100644
--- a/llvm/test/Transforms/ConstraintElimination/mul.ll
+++ b/llvm/test/Transforms/ConstraintElimination/mul.ll
@@ -50,7 +50,7 @@ define i1 @test_mul_const_nuw_unsigned_3(i8 %start, i8 %high) {
; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2
; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
; CHECK-NEXT: [[T:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_MUL_2]]
-; CHECK-NEXT: ret i1 [[T]]
+; CHECK-NEXT: ret i1 true
;
entry:
%start.mul.4 = mul nuw i8 %start, 4
@@ -73,7 +73,7 @@ define i1 @test_mul_const_nuw_unsigned_4(i8 %start, i8 %high) {
; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2
; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
; CHECK-NEXT: [[F:%.*]] = icmp ult i8 [[START_ADD_1]], [[START_MUL_2]]
-; CHECK-NEXT: ret i1 [[F]]
+; CHECK-NEXT: ret i1 false
;
entry:
%start.mul.4 = mul nuw i8 %start, 4
@@ -96,7 +96,7 @@ define i1 @test_mul_const_nuw_unsigned_5(i8 %start, i8 %high) {
; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_MUL_4]]
-; CHECK-NEXT: ret i1 [[T_4]]
+; CHECK-NEXT: ret i1 true
;
entry:
%start.mul.4 = mul nuw i8 %start, 4
@@ -118,7 +118,7 @@ define i1 @test_mul_const_nuw_unsigned_6(i8 %start, i8 %high) {
; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
; CHECK-NEXT: [[F_2:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_4]]
-; CHECK-NEXT: ret i1 [[F_2]]
+; CHECK-NEXT: ret i1 false
;
entry:
%start.mul.4 = mul nuw i8 %start, 4
@@ -142,7 +142,7 @@ define i1 @test_mul_const_nuw_unsigned_7(i8 %start, i8 %high) {
; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1
; CHECK-NEXT: [[F_3:%.*]] = icmp ule i8 [[START_ADD_2_1]], [[START_MUL_4]]
-; CHECK-NEXT: ret i1 [[F_3]]
+; CHECK-NEXT: ret i1 false
;
entry:
%start.mul.4 = mul nuw i8 %start, 4
@@ -221,7 +221,7 @@ define i1 @test_mul_const_nuw_unsigned_10(i8 %start, i8 %high) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]])
; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]]
-; CHECK-NEXT: ret i1 [[T_1]]
+; CHECK-NEXT: ret i1 true
;
entry:
%start.mul.5 = mul nuw i8 %start, 5
@@ -241,7 +241,7 @@ define i1 @test_mul_const_nuw_unsigned_11(i8 %start, i8 %high) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]])
; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]]
-; CHECK-NEXT: ret i1 [[C_1]]
+; CHECK-NEXT: ret i1 false
;
entry:
%start.mul.5 = mul nuw i8 %start, 5
@@ -261,7 +261,7 @@ define i1 @test_mul_const_nuw_unsigned_12(i8 %start) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nuw i8 [[START]], 5
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]]
-; CHECK-NEXT: ret i1 [[T_1]]
+; CHECK-NEXT: ret i1 true
;
entry:
%start.mul.3 = mul nuw i8 %start, 3
@@ -281,7 +281,7 @@ define i1 @test_mul_const_nuw_unsigned_13(i8 %start) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nuw i8 [[START]], 5
; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]]
-; CHECK-NEXT: ret i1 [[F_1]]
+; CHECK-NEXT: ret i1 false
;
entry:
%start.mul.3 = mul nuw i8 %start, 3
@@ -373,7 +373,6 @@ entry:
ret i1 %c.1
}
-
define i1 @test_mul_add_const_nuw_unsigned_1(i8 %start, i8 %high) {
; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_1(
; CHECK-NEXT: entry:
@@ -426,7 +425,7 @@ define i1 @test_mul_add_const_nuw_unsigned_3(i8 %start, i8 %high) {
; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_MUL_4]]
-; CHECK-NEXT: ret i1 [[T_3]]
+; CHECK-NEXT: ret i1 true
;
entry:
%add = add nuw i8 %start, 3
@@ -451,7 +450,7 @@ define i1 @test_mul_add_const_nuw_unsigned_4(i8 %start, i8 %high) {
; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
; CHECK-NEXT: [[T_4:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_4]]
-; CHECK-NEXT: ret i1 [[T_4]]
+; CHECK-NEXT: ret i1 true
;
entry:
%add = add nuw i8 %start, 3
@@ -477,7 +476,7 @@ define i1 @test_mul_add_const_nuw_unsigned_5(i8 %start, i8 %high) {
; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
; CHECK-NEXT: [[START_ADD_2_12:%.*]] = add nuw i8 [[START_ADD_2]], 12
; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_2_12]], [[START_MUL_4]]
-; CHECK-NEXT: ret i1 [[T_5]]
+; CHECK-NEXT: ret i1 true
;
entry:
%add = add nuw i8 %start, 3
@@ -503,7 +502,7 @@ define i1 @test_mul_add_const_nuw_unsigned_6(i8 %start, i8 %high) {
; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
; CHECK-NEXT: [[START_ADD_2_13:%.*]] = add nuw i8 [[START_ADD_2]], 13
; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[START_ADD_2_13]], [[START_MUL_4]]
-; CHECK-NEXT: ret i1 [[F_1]]
+; CHECK-NEXT: ret i1 false
;
entry:
%add = add nuw i8 %start, 3
diff --git a/llvm/test/Transforms/ConstraintElimination/shl.ll b/llvm/test/Transforms/ConstraintElimination/shl.ll
index e0f414d79480e..e11fdacbd5497 100644
--- a/llvm/test/Transforms/ConstraintElimination/shl.ll
+++ b/llvm/test/Transforms/ConstraintElimination/shl.ll
@@ -220,7 +220,7 @@ define i1 @test_shl_const_nuw_unsigned_10(i8 %start, i8 %high) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]])
; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nuw i8 [[START]], 3
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_SHL_3]], [[START_SHL_5]]
-; CHECK-NEXT: ret i1 [[T_1]]
+; CHECK-NEXT: ret i1 true
;
entry:
%start.shl.5 = shl nuw i8 %start, 5
@@ -240,7 +240,7 @@ define i1 @test_shl_const_nuw_unsigned_11(i8 %start, i8 %high) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]])
; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nuw i8 [[START]], 3
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[START_SHL_5]], [[START_SHL_3]]
-; CHECK-NEXT: ret i1 [[C_1]]
+; CHECK-NEXT: ret i1 false
;
entry:
%start.shl.5 = shl nuw i8 %start, 5
@@ -260,7 +260,7 @@ define i1 @test_shl_const_nuw_unsigned_12(i8 %start) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
; CHECK-NEXT: [[START_SHL_5:%.*]] = shl nuw i8 [[START]], 5
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_SHL_3]], [[START_SHL_5]]
-; CHECK-NEXT: ret i1 [[T_1]]
+; CHECK-NEXT: ret i1 true
;
entry:
%start.shl.3 = shl nuw i8 %start, 3
More information about the llvm-commits
mailing list