summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/test/CodeGen/X86/fold-and-shift-x86_64.ll79
-rw-r--r--llvm/test/CodeGen/X86/fold-and-shift.ll34
2 files changed, 113 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/fold-and-shift-x86_64.ll b/llvm/test/CodeGen/X86/fold-and-shift-x86_64.ll
new file mode 100644
index 00000000000..8aa4b6825b0
--- /dev/null
+++ b/llvm/test/CodeGen/X86/fold-and-shift-x86_64.ll
@@ -0,0 +1,79 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
+
+define i8 @t1(i8* %X, i64 %i) {
+; CHECK-LABEL: t1:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: movabsq $4611686018427387649, %rax # imm = 0x3FFFFFFFFFFFFF01
+; CHECK-NEXT: andq %rsi, %rax
+; CHECK-NEXT: movb (%rdi,%rax,4), %al
+; CHECK-NEXT: retq
+
+entry:
+ %tmp2 = shl i64 %i, 2
+ %tmp4 = and i64 %tmp2, -1020
+ %tmp7 = getelementptr i8, i8* %X, i64 %tmp4
+ %tmp9 = load i8, i8* %tmp7
+ ret i8 %tmp9
+}
+
+define i8 @t2(i8* %X, i64 %i) {
+; CHECK-LABEL: t2:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: movabsq $4611686018427387890, %rax # imm = 0x3FFFFFFFFFFFFFF2
+; CHECK-NEXT: andq %rsi, %rax
+; CHECK-NEXT: movb (%rdi,%rax,4), %al
+; CHECK-NEXT: retq
+
+entry:
+ %tmp2 = shl i64 %i, 2
+ %tmp4 = and i64 %tmp2, -56
+ %tmp7 = getelementptr i8, i8* %X, i64 %tmp4
+ %tmp9 = load i8, i8* %tmp7
+ ret i8 %tmp9
+}
+
+define i8 @t3(i8* %X, i64 %i) {
+; CHECK-LABEL: t3:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: movl %esi, %eax
+; CHECK-NEXT: movb (%rdi,%rax,4), %al
+; CHECK-NEXT: retq
+
+entry:
+ %tmp2 = shl i64 %i, 2
+ %tmp4 = and i64 %tmp2, 17179869180
+ %tmp7 = getelementptr i8, i8* %X, i64 %tmp4
+ %tmp9 = load i8, i8* %tmp7
+ ret i8 %tmp9
+}
+
+define i8 @t4(i8* %X, i64 %i) {
+; CHECK-LABEL: t4:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: andl $-2, %esi
+; CHECK-NEXT: movb (%rdi,%rsi,4), %al
+; CHECK-NEXT: retq
+
+entry:
+ %tmp2 = shl i64 %i, 2
+ %tmp4 = and i64 %tmp2, 17179869176
+ %tmp7 = getelementptr i8, i8* %X, i64 %tmp4
+ %tmp9 = load i8, i8* %tmp7
+ ret i8 %tmp9
+}
+
+define i8 @t5(i8* %X, i64 %i) {
+; CHECK-LABEL: t5:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: andl $-250002, %esi # imm = 0xFFFC2F6E
+; CHECK-NEXT: movb (%rdi,%rsi,4), %al
+; CHECK-NEXT: retq
+
+entry:
+ %tmp2 = shl i64 %i, 2
+ %tmp4 = and i64 %tmp2, 17178869176
+ %tmp7 = getelementptr i8, i8* %X, i64 %tmp4
+ %tmp9 = load i8, i8* %tmp7
+ ret i8 %tmp9
+}
diff --git a/llvm/test/CodeGen/X86/fold-and-shift.ll b/llvm/test/CodeGen/X86/fold-and-shift.ll
index a434c1f9c1d..93b8bbd3080 100644
--- a/llvm/test/CodeGen/X86/fold-and-shift.ll
+++ b/llvm/test/CodeGen/X86/fold-and-shift.ll
@@ -89,3 +89,37 @@ entry:
%sum.2 = add i32 %sum.1, %index
ret i32 %sum.2
}
+
+define i8 @t5(i8* %X, i32 %i) {
+; CHECK-LABEL: t5:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
+; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; CHECK-NEXT: andl $1073741810, %ecx # imm = 0x3FFFFFF2
+; CHECK-NEXT: movb (%eax,%ecx,4), %al
+; CHECK-NEXT: retl
+
+entry:
+ %tmp2 = shl i32 %i, 2
+ %tmp4 = and i32 %tmp2, -56
+ %tmp7 = getelementptr i8, i8* %X, i32 %tmp4
+ %tmp9 = load i8, i8* %tmp7
+ ret i8 %tmp9
+}
+
+define i8 @t6(i8* %X, i32 %i) {
+; CHECK-LABEL: t6:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
+; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; CHECK-NEXT: andl $1073741569, %ecx # imm = 0x3FFFFF01
+; CHECK-NEXT: movb (%eax,%ecx,4), %al
+; CHECK-NEXT: retl
+
+entry:
+ %tmp2 = shl i32 %i, 2
+ %tmp4 = and i32 %tmp2, -1020
+ %tmp7 = getelementptr i8, i8* %X, i32 %tmp4
+ %tmp9 = load i8, i8* %tmp7
+ ret i8 %tmp9
+}
OpenPOWER on IntegriCloud