[llvm] 36cb258 - [NFC][CVP] Add tests for urem expansion

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 30 08:41:16 PST 2022


Author: Roman Lebedev
Date: 2022-12-30T19:40:46+03:00
New Revision: 36cb258cdf940e539db2bbc8737c57ee94fb8d5d

URL: https://github.com/llvm/llvm-project/commit/36cb258cdf940e539db2bbc8737c57ee94fb8d5d
DIFF: https://github.com/llvm/llvm-project/commit/36cb258cdf940e539db2bbc8737c57ee94fb8d5d.diff

LOG: [NFC][CVP] Add tests for urem expansion

Added: 
    llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll b/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
new file mode 100644
index 0000000000000..41a651929a24e
--- /dev/null
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
@@ -0,0 +1,276 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s
+
+declare void @llvm.assume(i1)
+
+; Divisor is constant. X's range is known
+
+define i8 @constant.divisor.v3(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v3(
+; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], 3
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT:    ret i8 [[X]]
+;
+  %cmp.x.upper = icmp ult i8 %x, 3
+  call void @llvm.assume(i1 %cmp.x.upper)
+  %rem = urem i8 %x, 3
+  ret i8 %rem
+}
+define i8 @constant.divisor.v4(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v4(
+; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], 4
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 3
+; CHECK-NEXT:    ret i8 [[REM]]
+;
+  %cmp.x.upper = icmp ult i8 %x, 4
+  call void @llvm.assume(i1 %cmp.x.upper)
+  %rem = urem i8 %x, 3
+  ret i8 %rem
+}
+define i8 @constant.divisor.x.range.v4(ptr %x.ptr) {
+; CHECK-LABEL: @constant.divisor.x.range.v4(
+; CHECK-NEXT:    [[X:%.*]] = load i8, ptr [[X_PTR:%.*]], align 1, !range [[RNG0:![0-9]+]]
+; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 3
+; CHECK-NEXT:    ret i8 [[REM]]
+;
+  %x = load i8, ptr %x.ptr, !range !{ i8 0, i8 4 }
+  %rem = urem i8 %x, 3
+  ret i8 %rem
+}
+define i8 @constant.divisor.v5(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v5(
+; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], 5
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 3
+; CHECK-NEXT:    ret i8 [[REM]]
+;
+  %cmp.x.upper = icmp ult i8 %x, 5
+  call void @llvm.assume(i1 %cmp.x.upper)
+  %rem = urem i8 %x, 3
+  ret i8 %rem
+}
+define i8 @constant.divisor.v6(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v6(
+; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], 6
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 3
+; CHECK-NEXT:    ret i8 [[REM]]
+;
+  %cmp.x.upper = icmp ult i8 %x, 6
+  call void @llvm.assume(i1 %cmp.x.upper)
+  %rem = urem i8 %x, 3
+  ret i8 %rem
+}
+define i8 @constant.divisor.v7(i8 %x) {
+; CHECK-LABEL: @constant.divisor.v7(
+; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], 7
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 3
+; CHECK-NEXT:    ret i8 [[REM]]
+;
+  %cmp.x.upper = icmp ult i8 %x, 7
+  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) {
+; CHECK-LABEL: @variable.v3(
+; CHECK-NEXT:    [[CMP_X:%.*]] = icmp ult i8 [[X:%.*]], 3
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X]])
+; 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:    ret i8 [[X]]
+;
+  %cmp.x = icmp ult i8 %x, 3
+  call void @llvm.assume(i1 %cmp.x)
+  %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
+}
+define i8 @variable.v4(i8 %x, i8 %y) {
+; CHECK-LABEL: @variable.v4(
+; CHECK-NEXT:    [[CMP_X:%.*]] = icmp ult i8 [[X:%.*]], 4
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X]])
+; 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 = icmp ult i8 %x, 4
+  call void @llvm.assume(i1 %cmp.x)
+  %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
+}
+define i8 @variable.v4.range(ptr %x.ptr, ptr %y.ptr) {
+; CHECK-LABEL: @variable.v4.range(
+; CHECK-NEXT:    [[X:%.*]] = load i8, ptr [[X_PTR:%.*]], align 1, !range [[RNG0]]
+; CHECK-NEXT:    [[Y:%.*]] = load i8, ptr [[Y_PTR:%.*]], align 1, !range [[RNG1:![0-9]+]]
+; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], [[Y]]
+; CHECK-NEXT:    ret i8 [[REM]]
+;
+  %x = load i8, ptr %x.ptr, !range !{ i8 0, i8 4 }
+  %y = load i8, ptr %y.ptr, !range !{ i8 3, i8 5 }
+  %rem = urem i8 %x, %y
+  ret i8 %rem
+}
+define i8 @variable.v5(i8 %x, i8 %y) {
+; CHECK-LABEL: @variable.v5(
+; CHECK-NEXT:    [[CMP_X:%.*]] = icmp ult i8 [[X:%.*]], 5
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X]])
+; 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 = icmp ult i8 %x, 5
+  call void @llvm.assume(i1 %cmp.x)
+  %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
+}
+define i8 @variable.v6(i8 %x, i8 %y) {
+; CHECK-LABEL: @variable.v6(
+; CHECK-NEXT:    [[CMP_X:%.*]] = icmp ult i8 [[X:%.*]], 6
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X]])
+; 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 = icmp ult i8 %x, 6
+  call void @llvm.assume(i1 %cmp.x)
+  %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
+}
+define i8 @variable.v7(i8 %x, i8 %y) {
+; CHECK-LABEL: @variable.v7(
+; CHECK-NEXT:    [[CMP_X:%.*]] = icmp ult i8 [[X:%.*]], 7
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X]])
+; 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 = icmp ult i8 %x, 7
+  call void @llvm.assume(i1 %cmp.x)
+  %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) {
+; CHECK-LABEL: @large.divisor.v0(
+; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], 127
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT:    ret i8 [[X]]
+;
+  %cmp.x.upper = icmp ult i8 %x, 127
+  call void @llvm.assume(i1 %cmp.x.upper)
+  %rem = urem i8 %x, 127
+  ret i8 %rem
+}
+define i8 @large.divisor.v1(i8 %x) {
+; CHECK-LABEL: @large.divisor.v1(
+; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], -128
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 127
+; CHECK-NEXT:    ret i8 [[REM]]
+;
+  %cmp.x.upper = icmp ult i8 %x, 128
+  call void @llvm.assume(i1 %cmp.x.upper)
+  %rem = urem i8 %x, 127
+  ret i8 %rem
+}
+define i8 @large.divisor.v1.range(ptr %x.ptr) {
+; CHECK-LABEL: @large.divisor.v1.range(
+; CHECK-NEXT:    [[X:%.*]] = load i8, ptr [[X_PTR:%.*]], align 1, !range [[RNG2:![0-9]+]]
+; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], 127
+; CHECK-NEXT:    ret i8 [[REM]]
+;
+  %x = load i8, ptr %x.ptr, !range !{ i8 0, i8 128 }
+  %rem = urem i8 %x, 127
+  ret i8 %rem
+}
+define i8 @large.divisor.v2.unbound.x(i8 %x) {
+; CHECK-LABEL: @large.divisor.v2.unbound.x(
+; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X:%.*]], 127
+; CHECK-NEXT:    ret i8 [[REM]]
+;
+  %rem = urem i8 %x, 127
+  ret i8 %rem
+}
+
+define i8 @large.divisor.with.overflow.v0(i8 %x) {
+; CHECK-LABEL: @large.divisor.with.overflow.v0(
+; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], -128
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT:    ret i8 [[X]]
+;
+  %cmp.x.upper = icmp ult i8 %x, 128
+  call void @llvm.assume(i1 %cmp.x.upper)
+  %rem = urem i8 %x, 128
+  ret i8 %rem
+}
+define i8 @large.divisor.with.overflow.v1(i8 %x) {
+; CHECK-LABEL: @large.divisor.with.overflow.v1(
+; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], -127
+; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])
+; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], -128
+; CHECK-NEXT:    ret i8 [[REM]]
+;
+  %cmp.x.upper = icmp ult i8 %x, 129
+  call void @llvm.assume(i1 %cmp.x.upper)
+  %rem = urem i8 %x, 128
+  ret i8 %rem
+}
+define i8 @large.divisor.with.overflow.v1.range(ptr %x.ptr) {
+; CHECK-LABEL: @large.divisor.with.overflow.v1.range(
+; CHECK-NEXT:    [[X:%.*]] = load i8, ptr [[X_PTR:%.*]], align 1, !range [[RNG3:![0-9]+]]
+; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], -128
+; CHECK-NEXT:    ret i8 [[REM]]
+;
+  %x = load i8, ptr %x.ptr, !range !{ i8 0, i8 129 }
+  %rem = urem i8 %x, 128
+  ret i8 %rem
+}
+define i8 @large.divisor.with.overflow.v2.unbound.x(i8 %x) {
+; CHECK-LABEL: @large.divisor.with.overflow.v2.unbound.x(
+; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X:%.*]], -128
+; CHECK-NEXT:    ret i8 [[REM]]
+;
+  %rem = urem i8 %x, 128
+  ret i8 %rem
+}


        


More information about the llvm-commits mailing list