1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=i686-unknown < %s | FileCheck %s --check-prefix=X32 3; RUN: llc -mtriple=x86_64-unknown < %s | FileCheck %s --check-prefix=X64 4 5@array = weak global [4 x i32] zeroinitializer 6 7define i32 @test_lshr_and(i32 %x) { 8; X32-LABEL: test_lshr_and: 9; X32: # %bb.0: 10; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 11; X32-NEXT: andl $12, %eax 12; X32-NEXT: movl array(%eax), %eax 13; X32-NEXT: retl 14; 15; X64-LABEL: test_lshr_and: 16; X64: # %bb.0: 17; X64-NEXT: # kill: def $edi killed $edi def $rdi 18; X64-NEXT: shrl $2, %edi 19; X64-NEXT: andl $3, %edi 20; X64-NEXT: movl array(,%rdi,4), %eax 21; X64-NEXT: retq 22 %tmp2 = lshr i32 %x, 2 23 %tmp3 = and i32 %tmp2, 3 24 %tmp4 = getelementptr [4 x i32], [4 x i32]* @array, i32 0, i32 %tmp3 25 %tmp5 = load i32, i32* %tmp4, align 4 26 ret i32 %tmp5 27} 28 29define i32* @test_exact1(i32 %a, i32 %b, i32* %x) { 30; X32-LABEL: test_exact1: 31; X32: # %bb.0: 32; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 33; X32-NEXT: subl {{[0-9]+}}(%esp), %eax 34; X32-NEXT: sarl %eax 35; X32-NEXT: addl {{[0-9]+}}(%esp), %eax 36; X32-NEXT: retl 37; 38; X64-LABEL: test_exact1: 39; X64: # %bb.0: 40; X64-NEXT: subl %edi, %esi 41; X64-NEXT: sarl $3, %esi 42; X64-NEXT: movslq %esi, %rax 43; X64-NEXT: leaq (%rdx,%rax,4), %rax 44; X64-NEXT: retq 45 %sub = sub i32 %b, %a 46 %shr = ashr exact i32 %sub, 3 47 %gep = getelementptr inbounds i32, i32* %x, i32 %shr 48 ret i32* %gep 49} 50 51define i32* @test_exact2(i32 %a, i32 %b, i32* %x) { 52; X32-LABEL: test_exact2: 53; X32: # %bb.0: 54; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 55; X32-NEXT: subl {{[0-9]+}}(%esp), %eax 56; X32-NEXT: sarl %eax 57; X32-NEXT: addl {{[0-9]+}}(%esp), %eax 58; X32-NEXT: retl 59; 60; X64-LABEL: test_exact2: 61; X64: # %bb.0: 62; X64-NEXT: subl %edi, %esi 63; X64-NEXT: sarl $3, %esi 64; X64-NEXT: movslq %esi, %rax 65; X64-NEXT: leaq (%rdx,%rax,4), %rax 66; X64-NEXT: retq 67 %sub = sub i32 %b, %a 68 %shr = ashr exact i32 %sub, 3 69 %gep = getelementptr inbounds i32, i32* %x, i32 %shr 70 ret i32* %gep 71} 72 73define i32* @test_exact3(i32 %a, i32 %b, i32* %x) { 74; X32-LABEL: test_exact3: 75; X32: # %bb.0: 76; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 77; X32-NEXT: subl {{[0-9]+}}(%esp), %eax 78; X32-NEXT: addl {{[0-9]+}}(%esp), %eax 79; X32-NEXT: retl 80; 81; X64-LABEL: test_exact3: 82; X64: # %bb.0: 83; X64-NEXT: subl %edi, %esi 84; X64-NEXT: sarl $2, %esi 85; X64-NEXT: movslq %esi, %rax 86; X64-NEXT: leaq (%rdx,%rax,4), %rax 87; X64-NEXT: retq 88 %sub = sub i32 %b, %a 89 %shr = ashr exact i32 %sub, 2 90 %gep = getelementptr inbounds i32, i32* %x, i32 %shr 91 ret i32* %gep 92} 93 94define i32* @test_exact4(i32 %a, i32 %b, i32* %x) { 95; X32-LABEL: test_exact4: 96; X32: # %bb.0: 97; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 98; X32-NEXT: subl {{[0-9]+}}(%esp), %eax 99; X32-NEXT: shrl %eax 100; X32-NEXT: addl {{[0-9]+}}(%esp), %eax 101; X32-NEXT: retl 102; 103; X64-LABEL: test_exact4: 104; X64: # %bb.0: 105; X64-NEXT: # kill: def $esi killed $esi def $rsi 106; X64-NEXT: subl %edi, %esi 107; X64-NEXT: shrl $3, %esi 108; X64-NEXT: leaq (%rdx,%rsi,4), %rax 109; X64-NEXT: retq 110 %sub = sub i32 %b, %a 111 %shr = lshr exact i32 %sub, 3 112 %gep = getelementptr inbounds i32, i32* %x, i32 %shr 113 ret i32* %gep 114} 115 116define i32* @test_exact5(i32 %a, i32 %b, i32* %x) { 117; X32-LABEL: test_exact5: 118; X32: # %bb.0: 119; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 120; X32-NEXT: subl {{[0-9]+}}(%esp), %eax 121; X32-NEXT: shrl %eax 122; X32-NEXT: addl {{[0-9]+}}(%esp), %eax 123; X32-NEXT: retl 124; 125; X64-LABEL: test_exact5: 126; X64: # %bb.0: 127; X64-NEXT: # kill: def $esi killed $esi def $rsi 128; X64-NEXT: subl %edi, %esi 129; X64-NEXT: shrl $3, %esi 130; X64-NEXT: leaq (%rdx,%rsi,4), %rax 131; X64-NEXT: retq 132 %sub = sub i32 %b, %a 133 %shr = lshr exact i32 %sub, 3 134 %gep = getelementptr inbounds i32, i32* %x, i32 %shr 135 ret i32* %gep 136} 137 138define i32* @test_exact6(i32 %a, i32 %b, i32* %x) { 139; X32-LABEL: test_exact6: 140; X32: # %bb.0: 141; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 142; X32-NEXT: subl {{[0-9]+}}(%esp), %eax 143; X32-NEXT: addl {{[0-9]+}}(%esp), %eax 144; X32-NEXT: retl 145; 146; X64-LABEL: test_exact6: 147; X64: # %bb.0: 148; X64-NEXT: # kill: def $esi killed $esi def $rsi 149; X64-NEXT: subl %edi, %esi 150; X64-NEXT: leaq (%rsi,%rdx), %rax 151; X64-NEXT: retq 152 %sub = sub i32 %b, %a 153 %shr = lshr exact i32 %sub, 2 154 %gep = getelementptr inbounds i32, i32* %x, i32 %shr 155 ret i32* %gep 156} 157