1 ; RUN: llc -march=x86 < %s | FileCheck %s 2 3 @array = weak global [4 x i32] zeroinitializer 4 5 define i32 @test_lshr_and(i32 %x) { 6 ; CHECK-LABEL: test_lshr_and: 7 ; CHECK-NOT: shrl 8 ; CHECK: andl $12, 9 ; CHECK: movl {{.*}}array{{.*}}, 10 ; CHECK: ret 11 12 entry: 13 %tmp2 = lshr i32 %x, 2 14 %tmp3 = and i32 %tmp2, 3 15 %tmp4 = getelementptr [4 x i32], [4 x i32]* @array, i32 0, i32 %tmp3 16 %tmp5 = load i32, i32* %tmp4, align 4 17 ret i32 %tmp5 18 } 19 20 define i32* @test_exact1(i32 %a, i32 %b, i32* %x) { 21 ; CHECK-LABEL: test_exact1: 22 ; CHECK: sarl % 23 24 %sub = sub i32 %b, %a 25 %shr = ashr exact i32 %sub, 3 26 %gep = getelementptr inbounds i32, i32* %x, i32 %shr 27 ret i32* %gep 28 } 29 30 define i32* @test_exact2(i32 %a, i32 %b, i32* %x) { 31 ; CHECK-LABEL: test_exact2: 32 ; CHECK: sarl % 33 34 %sub = sub i32 %b, %a 35 %shr = ashr exact i32 %sub, 3 36 %gep = getelementptr inbounds i32, i32* %x, i32 %shr 37 ret i32* %gep 38 } 39 40 define i32* @test_exact3(i32 %a, i32 %b, i32* %x) { 41 ; CHECK-LABEL: test_exact3: 42 ; CHECK-NOT: sarl 43 44 %sub = sub i32 %b, %a 45 %shr = ashr exact i32 %sub, 2 46 %gep = getelementptr inbounds i32, i32* %x, i32 %shr 47 ret i32* %gep 48 } 49 50 define i32* @test_exact4(i32 %a, i32 %b, i32* %x) { 51 ; CHECK-LABEL: test_exact4: 52 ; CHECK: shrl % 53 54 %sub = sub i32 %b, %a 55 %shr = lshr exact i32 %sub, 3 56 %gep = getelementptr inbounds i32, i32* %x, i32 %shr 57 ret i32* %gep 58 } 59 60 define i32* @test_exact5(i32 %a, i32 %b, i32* %x) { 61 ; CHECK-LABEL: test_exact5: 62 ; CHECK: shrl % 63 64 %sub = sub i32 %b, %a 65 %shr = lshr exact i32 %sub, 3 66 %gep = getelementptr inbounds i32, i32* %x, i32 %shr 67 ret i32* %gep 68 } 69 70 define i32* @test_exact6(i32 %a, i32 %b, i32* %x) { 71 ; CHECK-LABEL: test_exact6: 72 ; CHECK-NOT: shrl 73 74 %sub = sub i32 %b, %a 75 %shr = lshr exact i32 %sub, 2 76 %gep = getelementptr inbounds i32, i32* %x, i32 %shr 77 ret i32* %gep 78 } 79