aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Reames <preames@rivosinc.com>2024-03-07 11:43:35 -0800
committerPhilip Reames <listmail@philipreames.com>2024-03-07 12:02:09 -0800
commita10fd16270b6fecf99b793318872e208c8b1abab (patch)
tree15d09de19d484b9af712cb17738784fda3080b68
parent308a2360725948fd6c77d005110c169ab1a8322c (diff)
downloadllvm-a10fd16270b6fecf99b793318872e208c8b1abab.zip
llvm-a10fd16270b6fecf99b793318872e208c8b1abab.tar.gz
llvm-a10fd16270b6fecf99b793318872e208c8b1abab.tar.bz2
[CVP] Add test coverage for an upcoming generalization of expandUDivOrURem
-rw-r--r--llvm/test/Transforms/CorrelatedValuePropagation/udiv-expansion.ll68
-rw-r--r--llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll93
2 files changed, 161 insertions, 0 deletions
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/udiv-expansion.ll b/llvm/test/Transforms/CorrelatedValuePropagation/udiv-expansion.ll
index a2a7670..a5fc26e 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/udiv-expansion.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/udiv-expansion.ll
@@ -90,6 +90,74 @@ define i8 @constant.divisor.v7(i8 %x) {
ret i8 %div
}
+define i8 @constant.divisor.v6to8(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v6to8(
+; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
+; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 9
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT: [[DIV:%.*]] = udiv i8 [[X]], 3
+; CHECK-NEXT: ret i8 2
+;
+ %cmp.x.lower = icmp uge i8 %x, 6
+ call void @llvm.assume(i1 %cmp.x.lower)
+ %cmp.x.upper = icmp ult i8 %x, 9
+ call void @llvm.assume(i1 %cmp.x.upper)
+ %div = udiv i8 %x, 3
+ ret i8 %div
+}
+
+define i8 @constant.divisor.v9to11(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v9to11(
+; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 9
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
+; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 12
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT: [[DIV:%.*]] = udiv i8 [[X]], 3
+; CHECK-NEXT: ret i8 3
+;
+ %cmp.x.lower = icmp uge i8 %x, 9
+ call void @llvm.assume(i1 %cmp.x.lower)
+ %cmp.x.upper = icmp ult i8 %x, 12
+ call void @llvm.assume(i1 %cmp.x.upper)
+ %div = udiv i8 %x, 3
+ ret i8 %div
+}
+
+define i8 @constant.divisor.v12to14(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v12to14(
+; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 12
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
+; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 15
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT: [[DIV:%.*]] = udiv i8 [[X]], 3
+; CHECK-NEXT: ret i8 4
+;
+ %cmp.x.lower = icmp uge i8 %x, 12
+ call void @llvm.assume(i1 %cmp.x.lower)
+ %cmp.x.upper = icmp ult i8 %x, 15
+ call void @llvm.assume(i1 %cmp.x.upper)
+ %div = udiv i8 %x, 3
+ ret i8 %div
+}
+
+define i8 @constant.divisor.v6to11(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v6to11(
+; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
+; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 12
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT: [[DIV:%.*]] = udiv i8 [[X]], 3
+; CHECK-NEXT: ret i8 [[DIV]]
+;
+ %cmp.x.lower = icmp uge i8 %x, 6
+ call void @llvm.assume(i1 %cmp.x.lower)
+ %cmp.x.upper = icmp ult i8 %x, 12
+ call void @llvm.assume(i1 %cmp.x.upper)
+ %div = udiv i8 %x, 3
+ ret i8 %div
+}
+
; Both are variable. Bounds are known
define i8 @variable.v3(i8 %x, i8 %y) {
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll b/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
index cd0ba2f..2af8c8f 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
@@ -100,6 +100,74 @@ define i8 @constant.divisor.v7(i8 %x) {
ret i8 %rem
}
+define i8 @constant.divisor.v6to8(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v6to8(
+; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
+; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 9
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], 3
+; CHECK-NEXT: ret i8 [[REM]]
+;
+ %cmp.x.lower = icmp uge i8 %x, 6
+ call void @llvm.assume(i1 %cmp.x.lower)
+ %cmp.x.upper = icmp ult i8 %x, 9
+ call void @llvm.assume(i1 %cmp.x.upper)
+ %rem = urem i8 %x, 3
+ ret i8 %rem
+}
+
+define i8 @constant.divisor.v9to11(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v9to11(
+; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 9
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
+; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 12
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], 3
+; CHECK-NEXT: ret i8 [[REM]]
+;
+ %cmp.x.lower = icmp uge i8 %x, 9
+ call void @llvm.assume(i1 %cmp.x.lower)
+ %cmp.x.upper = icmp ult i8 %x, 12
+ call void @llvm.assume(i1 %cmp.x.upper)
+ %rem = urem i8 %x, 3
+ ret i8 %rem
+}
+
+define i8 @constant.divisor.v12to14(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v12to14(
+; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 12
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
+; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 15
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], 3
+; CHECK-NEXT: ret i8 [[REM]]
+;
+ %cmp.x.lower = icmp uge i8 %x, 12
+ call void @llvm.assume(i1 %cmp.x.lower)
+ %cmp.x.upper = icmp ult i8 %x, 15
+ call void @llvm.assume(i1 %cmp.x.upper)
+ %rem = urem i8 %x, 3
+ ret i8 %rem
+}
+
+define i8 @constant.divisor.v6to11(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v6to11(
+; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
+; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 12
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], 3
+; CHECK-NEXT: ret i8 [[REM]]
+;
+ %cmp.x.lower = icmp uge i8 %x, 6
+ call void @llvm.assume(i1 %cmp.x.lower)
+ %cmp.x.upper = icmp ult i8 %x, 12
+ call void @llvm.assume(i1 %cmp.x.upper)
+ %rem = urem i8 %x, 3
+ ret i8 %rem
+}
+
; Both are variable. Bounds are known
define i8 @variable.v3(i8 %x, i8 %y) {
@@ -226,6 +294,31 @@ define i8 @variable.v7(i8 %x, i8 %y) {
ret i8 %rem
}
+define i8 @variable.v6to8.v3to4(i8 %x, i8 %y) {
+; CHECK-LABEL: @variable.v6to8.v3to4(
+; CHECK-NEXT: [[CMP_X_LOWER:%.*]] = icmp uge i8 [[X:%.*]], 6
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_LOWER]])
+; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X]], 8
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT: [[CMP_Y_LOWER:%.*]] = icmp uge i8 [[Y:%.*]], 3
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_Y_LOWER]])
+; CHECK-NEXT: [[CMP_Y_UPPER:%.*]] = icmp ule i8 [[Y]], 4
+; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_Y_UPPER]])
+; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], [[Y]]
+; CHECK-NEXT: ret i8 [[REM]]
+;
+ %cmp.x.lower = icmp uge i8 %x, 6
+ call void @llvm.assume(i1 %cmp.x.lower)
+ %cmp.x.upper = icmp ult i8 %x, 8
+ call void @llvm.assume(i1 %cmp.x.upper)
+ %cmp.y.lower = icmp uge i8 %y, 3
+ call void @llvm.assume(i1 %cmp.y.lower)
+ %cmp.y.upper = icmp ule i8 %y, 4
+ call void @llvm.assume(i1 %cmp.y.upper)
+ %rem = urem i8 %x, %y
+ ret i8 %rem
+}
+
; Constant divisor
define i8 @large.divisor.v0(i8 %x) {