summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorJustin Lebar <jlebar@google.com>2018-03-21 14:08:21 +0000
committerJustin Lebar <jlebar@google.com>2018-03-21 14:08:21 +0000
commit038cbc5c13e33052c1b7dad1112c2a062e7c565e (patch)
tree7e0dc8c207bb211bb0e63ffc1185ae1b179b0edd /llvm/test
parentdaf69ac2b2a87198f811eab02d650824af4e0f51 (diff)
downloadbcm5719-llvm-038cbc5c13e33052c1b7dad1112c2a062e7c565e.tar.gz
bcm5719-llvm-038cbc5c13e33052c1b7dad1112c2a062e7c565e.zip
Re-re-land: Teach CorrelatedValuePropagation to reduce the width of udiv/urem instructions.
Summary: If the operands of a udiv/urem can be proved to fit within a smaller power-of-two-sized type, reduce the width of the udiv/urem. Backed out for causing performance regressions. Re-landing because we've determined that these regressions were noise. Original Differential Revision: https://reviews.llvm.org/D44102 llvm-svn: 328096
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Transforms/CorrelatedValuePropagation/udiv.ll95
-rw-r--r--llvm/test/Transforms/CorrelatedValuePropagation/urem.ll101
2 files changed, 196 insertions, 0 deletions
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/udiv.ll b/llvm/test/Transforms/CorrelatedValuePropagation/udiv.ll
new file mode 100644
index 00000000000..19078134e6f
--- /dev/null
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/udiv.ll
@@ -0,0 +1,95 @@
+; RUN: opt < %s -correlated-propagation -S | FileCheck %s
+
+; CHECK-LABEL: @test_nop
+define void @test_nop(i32 %n) {
+; CHECK udiv i32 %n, 100
+ %div = udiv i32 %n, 100
+ ret void
+}
+
+; CHECK-LABEL: @test1(
+define void @test1(i32 %n) {
+entry:
+ %cmp = icmp ule i32 %n, 65535
+ br i1 %cmp, label %bb, label %exit
+
+bb:
+; CHECK: udiv i16
+ %div = udiv i32 %n, 100
+ br label %exit
+
+exit:
+ ret void
+}
+
+; CHECK-LABEL: @test2(
+define void @test2(i32 %n) {
+entry:
+ %cmp = icmp ule i32 %n, 65536
+ br i1 %cmp, label %bb, label %exit
+
+bb:
+; CHECK: udiv i32 %n, 100
+ %div = udiv i32 %n, 100
+ br label %exit
+
+exit:
+ ret void
+}
+
+; CHECK-LABEL: @test3(
+define void @test3(i32 %m, i32 %n) {
+entry:
+ %cmp1 = icmp ult i32 %m, 65535
+ %cmp2 = icmp ult i32 %n, 65535
+ %cmp = and i1 %cmp1, %cmp2
+ br i1 %cmp, label %bb, label %exit
+
+bb:
+; CHECK: udiv i16
+ %div = udiv i32 %m, %n
+ br label %exit
+
+exit:
+ ret void
+}
+
+; CHECK-LABEL: @test4(
+define void @test4(i32 %m, i32 %n) {
+entry:
+ %cmp1 = icmp ult i32 %m, 65535
+ %cmp2 = icmp ule i32 %n, 65536
+ %cmp = and i1 %cmp1, %cmp2
+ br i1 %cmp, label %bb, label %exit
+
+bb:
+; CHECK: udiv i32 %m, %n
+ %div = udiv i32 %m, %n
+ br label %exit
+
+exit:
+ ret void
+}
+
+; CHECK-LABEL: @test5
+define void @test5(i32 %n) {
+ %trunc = and i32 %n, 65535
+ ; CHECK: udiv i16
+ %div = udiv i32 %trunc, 42
+ ret void
+}
+
+; CHECK-LABEL: @test6
+define void @test6(i32 %n) {
+entry:
+ %cmp = icmp ule i32 %n, 255
+ br i1 %cmp, label %bb, label %exit
+
+bb:
+; CHECK: udiv i8
+ %div = sdiv i32 %n, 100
+ br label %exit
+
+exit:
+ ret void
+}
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/urem.ll b/llvm/test/Transforms/CorrelatedValuePropagation/urem.ll
new file mode 100644
index 00000000000..b01e9c5723e
--- /dev/null
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/urem.ll
@@ -0,0 +1,101 @@
+; RUN: opt < %s -correlated-propagation -S | FileCheck %s
+
+; CHECK-LABEL: @test_nop
+define void @test_nop(i32 %n) {
+; CHECK udiv i32 %n, 100
+ %div = udiv i32 %n, 100
+ ret void
+}
+
+; CHECK-LABEL: @test1(
+define void @test1(i32 %n) {
+entry:
+ %cmp = icmp ule i32 %n, 65535
+ br i1 %cmp, label %bb, label %exit
+
+bb:
+; CHECK: urem i16
+ %div = urem i32 %n, 100
+ br label %exit
+
+exit:
+ ret void
+}
+
+; CHECK-LABEL: @test2(
+define void @test2(i32 %n) {
+entry:
+ %cmp = icmp ule i32 %n, 65536
+ br i1 %cmp, label %bb, label %exit
+
+bb:
+; CHECK: urem i32 %n, 100
+ %div = urem i32 %n, 100
+ br label %exit
+
+exit:
+ ret void
+}
+
+; CHECK-LABEL: @test3(
+define void @test3(i32 %m, i32 %n) {
+entry:
+ %cmp1 = icmp ult i32 %m, 65535
+ %cmp2 = icmp ult i32 %n, 65535
+ %cmp = and i1 %cmp1, %cmp2
+ br i1 %cmp, label %bb, label %exit
+
+bb:
+; CHECK: urem i16
+ %div = urem i32 %m, %n
+ br label %exit
+
+exit:
+ ret void
+}
+
+; CHECK-LABEL: @test4(
+define void @test4(i32 %m, i32 %n) {
+entry:
+ %cmp1 = icmp ult i32 %m, 65535
+ %cmp2 = icmp ule i32 %n, 65536
+ %cmp = and i1 %cmp1, %cmp2
+ br i1 %cmp, label %bb, label %exit
+
+bb:
+; CHECK: urem i32 %m, %n
+ %div = urem i32 %m, %n
+ br label %exit
+
+exit:
+ ret void
+}
+
+; CHECK-LABEL: @test5
+define void @test5(i32 %n) {
+ %trunc = and i32 %n, 63
+ ; CHECK: urem i8
+ %div = urem i32 %trunc, 42
+ ret void
+}
+
+; CHECK-LABEL: @test6
+define void @test6(i32 %n) {
+entry:
+ %cmp = icmp ule i32 %n, 255
+ br i1 %cmp, label %bb, label %exit
+
+bb:
+; CHECK: urem i8
+ %div = srem i32 %n, 100
+ br label %exit
+
+exit:
+ ret void
+}
+
+; CHECK-LABEL: @non_power_of_2
+define void @non_power_of_2(i24 %n) {
+ %div = urem i24 %n, 42
+ ret void
+}
OpenPOWER on IntegriCloud