[llvm] a10fd16 - [CVP] Add test coverage for an upcoming generalization of expandUDivOrURem
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 7 12:02:17 PST 2024
Author: Philip Reames
Date: 2024-03-07T12:02:09-08:00
New Revision: a10fd16270b6fecf99b793318872e208c8b1abab
URL: https://github.com/llvm/llvm-project/commit/a10fd16270b6fecf99b793318872e208c8b1abab
DIFF: https://github.com/llvm/llvm-project/commit/a10fd16270b6fecf99b793318872e208c8b1abab.diff
LOG: [CVP] Add test coverage for an upcoming generalization of expandUDivOrURem
Added:
Modified:
llvm/test/Transforms/CorrelatedValuePropagation/udiv-expansion.ll
llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/udiv-expansion.ll b/llvm/test/Transforms/CorrelatedValuePropagation/udiv-expansion.ll
index a2a767084fbff6..a5fc26ebab00f5 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 cd0ba2f189dc83..2af8c8f23bbd3e 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) {
More information about the llvm-commits
mailing list