xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/shift-combine.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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