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