• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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