[llvm] c8abf1c - [CVP] Pass context instruction when narrowing div/rem
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 27 08:51:43 PDT 2020
Author: Nikita Popov
Date: 2020-09-27T17:51:30+02:00
New Revision: c8abf1c12dc39f3b07b887808da4bb09d5ddbe3e
URL: https://github.com/llvm/llvm-project/commit/c8abf1c12dc39f3b07b887808da4bb09d5ddbe3e
DIFF: https://github.com/llvm/llvm-project/commit/c8abf1c12dc39f3b07b887808da4bb09d5ddbe3e.diff
LOG: [CVP] Pass context instruction when narrowing div/rem
This fold was the only place not passing the context instruction.
The tests worked around that fact by introducing a basic block split,
which is now no longer necessary.
Added:
Modified:
llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
llvm/test/Transforms/CorrelatedValuePropagation/sdiv.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
index 0aacff0508ce..8b130984ba99 100644
--- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -643,7 +643,8 @@ static bool narrowSDivOrSRem(BinaryOperator *Instr, LazyValueInfo *LVI) {
std::array<Optional<ConstantRange>, 2> CRs;
unsigned MinSignedBits = 0;
for (auto I : zip(Instr->operands(), CRs)) {
- std::get<1>(I) = LVI->getConstantRange(std::get<0>(I), Instr->getParent());
+ std::get<1>(I) =
+ LVI->getConstantRange(std::get<0>(I), Instr->getParent(), Instr);
MinSignedBits = std::max(std::get<1>(I)->getMinSignedBits(), MinSignedBits);
}
@@ -695,7 +696,8 @@ static bool processUDivOrURem(BinaryOperator *Instr, LazyValueInfo *LVI) {
// of both of the operands?
unsigned MaxActiveBits = 0;
for (Value *Operand : Instr->operands()) {
- ConstantRange CR = LVI->getConstantRange(Operand, Instr->getParent());
+ ConstantRange CR =
+ LVI->getConstantRange(Operand, Instr->getParent(), Instr);
MaxActiveBits = std::max(CR.getActiveBits(), MaxActiveBits);
}
// Don't shrink below 8 bits wide.
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/sdiv.ll b/llvm/test/Transforms/CorrelatedValuePropagation/sdiv.ll
index 3f533030a11c..9150e8170cc2 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/sdiv.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/sdiv.ll
@@ -236,8 +236,6 @@ define i32 @test10_narrow(i32 %x, i32 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C0]])
; CHECK-NEXT: [[C1:%.*]] = icmp ult i32 [[Y:%.*]], 128
; CHECK-NEXT: call void @llvm.assume(i1 [[C1]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV1_LHS_TRUNC:%.*]] = trunc i32 [[X]] to i8
; CHECK-NEXT: [[DIV1_RHS_TRUNC:%.*]] = trunc i32 [[Y]] to i8
; CHECK-NEXT: [[DIV12:%.*]] = udiv i8 [[DIV1_LHS_TRUNC]], [[DIV1_RHS_TRUNC]]
@@ -248,9 +246,7 @@ define i32 @test10_narrow(i32 %x, i32 %y) {
call void @llvm.assume(i1 %c0)
%c1 = icmp ult i32 %y, 128
call void @llvm.assume(i1 %c1)
- br label %end
-end:
%div = sdiv i32 %x, %y
ret i32 %div
}
@@ -269,8 +265,6 @@ define i64 @test11_i15_i15(i64 %x, i64 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
; CHECK-NEXT: [[C3:%.*]] = icmp sge i64 [[Y]], -16384
; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV_LHS_TRUNC:%.*]] = trunc i64 [[X]] to i16
; CHECK-NEXT: [[DIV_RHS_TRUNC:%.*]] = trunc i64 [[Y]] to i16
; CHECK-NEXT: [[DIV1:%.*]] = sdiv i16 [[DIV_LHS_TRUNC]], [[DIV_RHS_TRUNC]]
@@ -287,9 +281,7 @@ entry:
call void @llvm.assume(i1 %c2)
%c3 = icmp sge i64 %y, -16384
call void @llvm.assume(i1 %c3)
- br label %end
-end:
%div = sdiv i64 %x, %y
ret i64 %div
}
@@ -307,8 +299,6 @@ define i64 @test12_i16_i16(i64 %x, i64 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
; CHECK-NEXT: [[C3:%.*]] = icmp sge i64 [[Y]], -32768
; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV_LHS_TRUNC:%.*]] = trunc i64 [[X]] to i32
; CHECK-NEXT: [[DIV_RHS_TRUNC:%.*]] = trunc i64 [[Y]] to i32
; CHECK-NEXT: [[DIV1:%.*]] = sdiv i32 [[DIV_LHS_TRUNC]], [[DIV_RHS_TRUNC]]
@@ -325,9 +315,7 @@ entry:
call void @llvm.assume(i1 %c2)
%c3 = icmp sge i64 %y, -32768
call void @llvm.assume(i1 %c3)
- br label %end
-end:
%div = sdiv i64 %x, %y
ret i64 %div
}
@@ -342,8 +330,6 @@ define i64 @test13_i16_u15(i64 %x, i64 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C1]])
; CHECK-NEXT: [[C2:%.*]] = icmp ule i64 [[Y:%.*]], 32767
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV_LHS_TRUNC:%.*]] = trunc i64 [[X]] to i16
; CHECK-NEXT: [[DIV_RHS_TRUNC:%.*]] = trunc i64 [[Y]] to i16
; CHECK-NEXT: [[DIV1:%.*]] = sdiv i16 [[DIV_LHS_TRUNC]], [[DIV_RHS_TRUNC]]
@@ -358,9 +344,7 @@ entry:
%c2 = icmp ule i64 %y, 32767
call void @llvm.assume(i1 %c2)
- br label %end
-end:
%div = sdiv i64 %x, %y
ret i64 %div
}
@@ -378,8 +362,6 @@ define i64 @test14_i16safe_i16(i64 %x, i64 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
; CHECK-NEXT: [[C3:%.*]] = icmp sge i64 [[Y]], -32768
; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV_LHS_TRUNC:%.*]] = trunc i64 [[X]] to i16
; CHECK-NEXT: [[DIV_RHS_TRUNC:%.*]] = trunc i64 [[Y]] to i16
; CHECK-NEXT: [[DIV1:%.*]] = sdiv i16 [[DIV_LHS_TRUNC]], [[DIV_RHS_TRUNC]]
@@ -396,9 +378,7 @@ entry:
call void @llvm.assume(i1 %c2)
%c3 = icmp sge i64 %y, -32768
call void @llvm.assume(i1 %c3)
- br label %end
-end:
%div = sdiv i64 %x, %y
ret i64 %div
}
@@ -413,8 +393,6 @@ define i64 @test15_i16safe_u15(i64 %x, i64 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C1]])
; CHECK-NEXT: [[C2:%.*]] = icmp ule i64 [[Y:%.*]], 32767
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV_LHS_TRUNC:%.*]] = trunc i64 [[X]] to i16
; CHECK-NEXT: [[DIV_RHS_TRUNC:%.*]] = trunc i64 [[Y]] to i16
; CHECK-NEXT: [[DIV1:%.*]] = sdiv i16 [[DIV_LHS_TRUNC]], [[DIV_RHS_TRUNC]]
@@ -429,9 +407,7 @@ entry:
%c2 = icmp ule i64 %y, 32767
call void @llvm.assume(i1 %c2)
- br label %end
-end:
%div = sdiv i64 %x, %y
ret i64 %div
}
@@ -448,8 +424,6 @@ define i64 @test16_i4_i4(i64 %x, i64 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
; CHECK-NEXT: [[C3:%.*]] = icmp sge i64 [[Y]], -4
; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV_LHS_TRUNC:%.*]] = trunc i64 [[X]] to i8
; CHECK-NEXT: [[DIV_RHS_TRUNC:%.*]] = trunc i64 [[Y]] to i8
; CHECK-NEXT: [[DIV1:%.*]] = sdiv i8 [[DIV_LHS_TRUNC]], [[DIV_RHS_TRUNC]]
@@ -466,9 +440,7 @@ entry:
call void @llvm.assume(i1 %c2)
%c3 = icmp sge i64 %y, -4
call void @llvm.assume(i1 %c3)
- br label %end
-end:
%div = sdiv i64 %x, %y
ret i64 %div
}
@@ -485,8 +457,6 @@ define i64 @test17_i9_i9(i64 %x, i64 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
; CHECK-NEXT: [[C3:%.*]] = icmp sge i64 [[Y]], -256
; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV_LHS_TRUNC:%.*]] = trunc i64 [[X]] to i16
; CHECK-NEXT: [[DIV_RHS_TRUNC:%.*]] = trunc i64 [[Y]] to i16
; CHECK-NEXT: [[DIV1:%.*]] = sdiv i16 [[DIV_LHS_TRUNC]], [[DIV_RHS_TRUNC]]
@@ -503,9 +473,7 @@ entry:
call void @llvm.assume(i1 %c2)
%c3 = icmp sge i64 %y, -256
call void @llvm.assume(i1 %c3)
- br label %end
-end:
%div = sdiv i64 %x, %y
ret i64 %div
}
@@ -522,8 +490,6 @@ define i9 @test18_i9_i9(i9 %x, i9 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
; CHECK-NEXT: [[C3:%.*]] = icmp sge i9 [[Y]], -256
; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV:%.*]] = sdiv i9 [[X]], [[Y]]
; CHECK-NEXT: ret i9 [[DIV]]
;
@@ -537,9 +503,7 @@ entry:
call void @llvm.assume(i1 %c2)
%c3 = icmp sge i9 %y, -256
call void @llvm.assume(i1 %c3)
- br label %end
-end:
%div = sdiv i9 %x, %y
ret i9 %div
}
@@ -554,8 +518,6 @@ define i10 @test19_i10_i10(i10 %x, i10 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
; CHECK-NEXT: [[C3:%.*]] = icmp sge i10 [[Y]], -256
; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV:%.*]] = sdiv i10 [[X]], [[Y]]
; CHECK-NEXT: ret i10 [[DIV]]
;
@@ -569,9 +531,7 @@ entry:
call void @llvm.assume(i1 %c2)
%c3 = icmp sge i10 %y, -256
call void @llvm.assume(i1 %c3)
- br label %end
-end:
%div = sdiv i10 %x, %y
ret i10 %div
}
@@ -588,8 +548,6 @@ define i64 @test20_i16_i18(i64 %x, i64 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
; CHECK-NEXT: [[C3:%.*]] = icmp sge i64 [[Y]], -65536
; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV_LHS_TRUNC:%.*]] = trunc i64 [[X]] to i32
; CHECK-NEXT: [[DIV_RHS_TRUNC:%.*]] = trunc i64 [[Y]] to i32
; CHECK-NEXT: [[DIV1:%.*]] = sdiv i32 [[DIV_LHS_TRUNC]], [[DIV_RHS_TRUNC]]
@@ -606,9 +564,7 @@ entry:
call void @llvm.assume(i1 %c2)
%c3 = icmp sge i64 %y, -65536
call void @llvm.assume(i1 %c3)
- br label %end
-end:
%div = sdiv i64 %x, %y
ret i64 %div
}
@@ -623,8 +579,6 @@ define i64 @test21_i18_i16(i64 %x, i64 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
; CHECK-NEXT: [[C3:%.*]] = icmp sge i64 [[Y]], -16384
; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV_LHS_TRUNC:%.*]] = trunc i64 [[X]] to i32
; CHECK-NEXT: [[DIV_RHS_TRUNC:%.*]] = trunc i64 [[Y]] to i32
; CHECK-NEXT: [[DIV1:%.*]] = sdiv i32 [[DIV_LHS_TRUNC]], [[DIV_RHS_TRUNC]]
@@ -641,9 +595,7 @@ entry:
call void @llvm.assume(i1 %c2)
%c3 = icmp sge i64 %y, -16384
call void @llvm.assume(i1 %c3)
- br label %end
-end:
%div = sdiv i64 %x, %y
ret i64 %div
}
@@ -660,8 +612,6 @@ define i64 @test22_i16_i16(i64 %x, i64 %y) {
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
; CHECK-NEXT: [[C3:%.*]] = icmp sge i64 [[Y]], -32768
; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])
-; CHECK-NEXT: br label [[END:%.*]]
-; CHECK: end:
; CHECK-NEXT: [[DIV_LHS_TRUNC:%.*]] = trunc i64 [[X]] to i32
; CHECK-NEXT: [[DIV_RHS_TRUNC:%.*]] = trunc i64 [[Y]] to i32
; CHECK-NEXT: [[DIV1:%.*]] = sdiv exact i32 [[DIV_LHS_TRUNC]], [[DIV_RHS_TRUNC]]
@@ -678,9 +628,7 @@ entry:
call void @llvm.assume(i1 %c2)
%c3 = icmp sge i64 %y, -32768
call void @llvm.assume(i1 %c3)
- br label %end
-end:
%div = sdiv exact i64 %x, %y
ret i64 %div
}
More information about the llvm-commits
mailing list