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 000000000000..8aa4b6825b09 --- /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 a434c1f9c1d5..93b8bbd30809 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 +}