summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorEli Friedman <efriedma@codeaurora.org>2018-07-25 18:22:22 +0000
committerEli Friedman <efriedma@codeaurora.org>2018-07-25 18:22:22 +0000
commit733f4ed1bb42d2080fd24dd5c4155e7277abafc4 (patch)
treec3209bcf4c2cf0a92802add7e895af6feaf24176 /llvm/test
parentc9588578c49e0d61924c33b1082dc5cf1cd96aac (diff)
downloadbcm5719-llvm-733f4ed1bb42d2080fd24dd5c4155e7277abafc4.tar.gz
bcm5719-llvm-733f4ed1bb42d2080fd24dd5c4155e7277abafc4.zip
[ARM] Prefer lsls+lsrs over lsls+ands or lsrs+ands in Thumb1.
Saves materializing the immediate for the "ands". Corresponding patterns exist for lsrs+lsls, but that seems less common in practice. Now implemented as a DAGCombine. Differential Revision: https://reviews.llvm.org/D49585 llvm-svn: 337945
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/Thumb/shift-and.ll125
1 files changed, 125 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/Thumb/shift-and.ll b/llvm/test/CodeGen/Thumb/shift-and.ll
new file mode 100644
index 00000000000..fa6ee1db5e2
--- /dev/null
+++ b/llvm/test/CodeGen/Thumb/shift-and.ll
@@ -0,0 +1,125 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=thumbv6-eabi %s -o - | FileCheck %s
+
+define i32 @test1(i32 %x) {
+; CHECK-LABEL: test1:
+; CHECK: @ %bb.0: @ %entry
+; CHECK-NEXT: lsls r0, r0, #20
+; CHECK-NEXT: lsrs r0, r0, #22
+; CHECK-NEXT: bx lr
+entry:
+ %0 = lshr i32 %x, 2
+ %shr = and i32 %0, 1023
+ ret i32 %shr
+}
+
+define i32 @test2(i32 %x) {
+; CHECK-LABEL: test2:
+; CHECK: @ %bb.0: @ %entry
+; CHECK-NEXT: lsrs r1, r0, #2
+; CHECK-NEXT: ldr r0, .LCPI1_0
+; CHECK-NEXT: ands r0, r1
+; CHECK-NEXT: bx lr
+; CHECK-NEXT: .p2align 2
+; CHECK-NEXT: @ %bb.1:
+; CHECK-NEXT: .LCPI1_0:
+; CHECK-NEXT: .long 1022 @ 0x3fe
+entry:
+ %0 = lshr i32 %x, 2
+ %shr = and i32 %0, 1022
+ ret i32 %shr
+}
+
+define i32 @test3(i32 %x) {
+; CHECK-LABEL: test3:
+; CHECK: @ %bb.0: @ %entry
+; CHECK-NEXT: lsrs r0, r0, #2
+; CHECK-NEXT: uxtb r0, r0
+; CHECK-NEXT: bx lr
+entry:
+ %0 = lshr i32 %x, 2
+ %shr = and i32 %0, 255
+ ret i32 %shr
+}
+
+define i32 @test4(i32 %x) {
+; CHECK-LABEL: test4:
+; CHECK: @ %bb.0: @ %entry
+; CHECK-NEXT: lsls r0, r0, #4
+; CHECK-NEXT: movs r1, #127
+; CHECK-NEXT: bics r0, r1
+; CHECK-NEXT: bx lr
+entry:
+ %0 = shl i32 %x, 4
+ %shr = and i32 %0, -128
+ ret i32 %shr
+}
+
+define i32 @test5(i32 %x) {
+; CHECK-LABEL: test5:
+; CHECK: @ %bb.0: @ %entry
+; CHECK-NEXT: lsls r0, r0, #31
+; CHECK-NEXT: lsrs r0, r0, #2
+; CHECK-NEXT: bx lr
+entry:
+ %0 = shl i32 %x, 29
+ %shr = and i32 %0, 536870912
+ ret i32 %shr
+}
+
+define i32 @test6(i32 %x) {
+; CHECK-LABEL: test6:
+; CHECK: @ %bb.0: @ %entry
+; CHECK-NEXT: movs r1, #5
+; CHECK-NEXT: lsls r1, r1, #29
+; CHECK-NEXT: lsls r0, r0, #29
+; CHECK-NEXT: ands r0, r1
+; CHECK-NEXT: bx lr
+entry:
+ %0 = shl i32 %x, 29
+ %shr = and i32 %0, 2684354560
+ ret i32 %shr
+}
+
+define i32 @test7(i32 %x) {
+; CHECK-LABEL: test7:
+; CHECK: @ %bb.0: @ %entry
+; CHECK-NEXT: lsrs r1, r0, #29
+; CHECK-NEXT: movs r0, #4
+; CHECK-NEXT: ands r0, r1
+; CHECK-NEXT: bx lr
+entry:
+ %0 = lshr i32 %x, 29
+ %shr = and i32 %0, 4
+ ret i32 %shr
+}
+
+define i32 @test8(i32 %x) {
+; CHECK-LABEL: test8:
+; CHECK: @ %bb.0: @ %entry
+; CHECK-NEXT: lsrs r1, r0, #29
+; CHECK-NEXT: movs r0, #5
+; CHECK-NEXT: ands r0, r1
+; CHECK-NEXT: bx lr
+entry:
+ %0 = lshr i32 %x, 29
+ %shr = and i32 %0, 5
+ ret i32 %shr
+}
+
+define i32 @test9(i32 %x) {
+; CHECK-LABEL: test9:
+; CHECK: @ %bb.0: @ %entry
+; CHECK-NEXT: lsrs r1, r0, #2
+; CHECK-NEXT: ldr r0, .LCPI8_0
+; CHECK-NEXT: ands r0, r1
+; CHECK-NEXT: bx lr
+; CHECK-NEXT: .p2align 2
+; CHECK-NEXT: @ %bb.1:
+; CHECK-NEXT: .LCPI8_0:
+; CHECK-NEXT: .long 1073741822 @ 0x3ffffffe
+entry:
+ %and = lshr i32 %x, 2
+ %shr = and i32 %and, 1073741822
+ ret i32 %shr
+}
OpenPOWER on IntegriCloud