xref: /llvm-project/llvm/test/CodeGen/X86/fixup-lea.ll (revision e6bf48d11047e970cb24554a01b65b566d6b5d22)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2;RUN: llc < %s -mtriple=i686-- -mattr=-slow-incdec | FileCheck %s -check-prefixes=CHECK,SLOW
3;RUN: llc < %s -mtriple=i686-- -mattr=+slow-incdec | FileCheck %s -check-prefixes=CHECK,FAST
4
5define void @foo(i32 inreg %dns) minsize {
6; CHECK-LABEL: foo:
7; CHECK:       # %bb.0: # %entry
8; CHECK-NEXT:    xorl %ecx, %ecx
9; CHECK-NEXT:    decl %ecx
10; CHECK-NEXT:  .LBB0_1: # %for.body
11; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
12; CHECK-NEXT:    movzwl %cx, %edx
13; CHECK-NEXT:    decl %ecx
14; CHECK-NEXT:    cmpl %eax, %edx
15; CHECK-NEXT:    jl .LBB0_1
16; CHECK-NEXT:  # %bb.2: # %for.end
17; CHECK-NEXT:    retl
18entry:
19  br label %for.body
20
21for.body:
22  %i.05 = phi i16 [ %dec, %for.body ], [ 0, %entry ]
23  %dec = add i16 %i.05, -1
24  %conv = zext i16 %dec to i32
25  %cmp = icmp slt i32 %conv, %dns
26  br i1 %cmp, label %for.body, label %for.end
27
28for.end:
29  ret void
30}
31
32define void @bar(i32 inreg %dns) minsize {
33; CHECK-LABEL: bar:
34; CHECK:       # %bb.0: # %entry
35; CHECK-NEXT:    xorl %ecx, %ecx
36; CHECK-NEXT:    incl %ecx
37; CHECK-NEXT:  .LBB1_1: # %for.body
38; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
39; CHECK-NEXT:    movzwl %cx, %edx
40; CHECK-NEXT:    incl %ecx
41; CHECK-NEXT:    cmpl %eax, %edx
42; CHECK-NEXT:    jl .LBB1_1
43; CHECK-NEXT:  # %bb.2: # %for.end
44; CHECK-NEXT:    retl
45entry:
46  br label %for.body
47
48for.body:
49  %i.05 = phi i16 [ %inc, %for.body ], [ 0, %entry ]
50  %inc = add i16 %i.05, 1
51  %conv = zext i16 %inc to i32
52  %cmp = icmp slt i32 %conv, %dns
53  br i1 %cmp, label %for.body, label %for.end
54for.end:
55  ret void
56}
57
58define void @foo_optsize(i32 inreg %dns) optsize {
59; CHECK-LABEL: foo_optsize:
60; CHECK:       # %bb.0: # %entry
61; CHECK-NEXT:    xorl %ecx, %ecx
62; CHECK-NEXT:    decl %ecx
63; CHECK-NEXT:  .LBB2_1: # %for.body
64; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
65; CHECK-NEXT:    movzwl %cx, %edx
66; CHECK-NEXT:    decl %ecx
67; CHECK-NEXT:    cmpl %eax, %edx
68; CHECK-NEXT:    jl .LBB2_1
69; CHECK-NEXT:  # %bb.2: # %for.end
70; CHECK-NEXT:    retl
71entry:
72  br label %for.body
73
74for.body:
75  %i.05 = phi i16 [ %dec, %for.body ], [ 0, %entry ]
76  %dec = add i16 %i.05, -1
77  %conv = zext i16 %dec to i32
78  %cmp = icmp slt i32 %conv, %dns
79  br i1 %cmp, label %for.body, label %for.end
80
81for.end:
82  ret void
83}
84
85define void @bar_optsize(i32 inreg %dns) optsize {
86; CHECK-LABEL: bar_optsize:
87; CHECK:       # %bb.0: # %entry
88; CHECK-NEXT:    xorl %ecx, %ecx
89; CHECK-NEXT:    incl %ecx
90; CHECK-NEXT:  .LBB3_1: # %for.body
91; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
92; CHECK-NEXT:    movzwl %cx, %edx
93; CHECK-NEXT:    incl %ecx
94; CHECK-NEXT:    cmpl %eax, %edx
95; CHECK-NEXT:    jl .LBB3_1
96; CHECK-NEXT:  # %bb.2: # %for.end
97; CHECK-NEXT:    retl
98entry:
99  br label %for.body
100
101for.body:
102  %i.05 = phi i16 [ %inc, %for.body ], [ 0, %entry ]
103  %inc = add i16 %i.05, 1
104  %conv = zext i16 %inc to i32
105  %cmp = icmp slt i32 %conv, %dns
106  br i1 %cmp, label %for.body, label %for.end
107for.end:
108  ret void
109}
110
111define void @foo_pgso(i32 inreg %dns) !prof !14 {
112; CHECK-LABEL: foo_pgso:
113; CHECK:       # %bb.0: # %entry
114; CHECK-NEXT:    xorl %ecx, %ecx
115; CHECK-NEXT:    decl %ecx
116; CHECK-NEXT:  .LBB4_1: # %for.body
117; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
118; CHECK-NEXT:    movzwl %cx, %edx
119; CHECK-NEXT:    decl %ecx
120; CHECK-NEXT:    cmpl %eax, %edx
121; CHECK-NEXT:    jl .LBB4_1
122; CHECK-NEXT:  # %bb.2: # %for.end
123; CHECK-NEXT:    retl
124entry:
125  br label %for.body
126
127for.body:
128  %i.05 = phi i16 [ %dec, %for.body ], [ 0, %entry ]
129  %dec = add i16 %i.05, -1
130  %conv = zext i16 %dec to i32
131  %cmp = icmp slt i32 %conv, %dns
132  br i1 %cmp, label %for.body, label %for.end
133
134for.end:
135  ret void
136}
137
138define void @bar_pgso(i32 inreg %dns) !prof !14 {
139; CHECK-LABEL: bar_pgso:
140; CHECK:       # %bb.0: # %entry
141; CHECK-NEXT:    xorl %ecx, %ecx
142; CHECK-NEXT:    incl %ecx
143; CHECK-NEXT:  .LBB5_1: # %for.body
144; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
145; CHECK-NEXT:    movzwl %cx, %edx
146; CHECK-NEXT:    incl %ecx
147; CHECK-NEXT:    cmpl %eax, %edx
148; CHECK-NEXT:    jl .LBB5_1
149; CHECK-NEXT:  # %bb.2: # %for.end
150; CHECK-NEXT:    retl
151entry:
152  br label %for.body
153
154for.body:
155  %i.05 = phi i16 [ %inc, %for.body ], [ 0, %entry ]
156  %inc = add i16 %i.05, 1
157  %conv = zext i16 %inc to i32
158  %cmp = icmp slt i32 %conv, %dns
159  br i1 %cmp, label %for.body, label %for.end
160for.end:
161  ret void
162}
163
164define void @foo_nosize(i32 inreg %dns) {
165; SLOW-LABEL: foo_nosize:
166; SLOW:       # %bb.0: # %entry
167; SLOW-NEXT:    movw $-1, %cx
168; SLOW-NEXT:    .p2align 4
169; SLOW-NEXT:  .LBB6_1: # %for.body
170; SLOW-NEXT:    # =>This Inner Loop Header: Depth=1
171; SLOW-NEXT:    movzwl %cx, %edx
172; SLOW-NEXT:    decl %ecx
173; SLOW-NEXT:    cmpl %eax, %edx
174; SLOW-NEXT:    jl .LBB6_1
175; SLOW-NEXT:  # %bb.2: # %for.end
176; SLOW-NEXT:    retl
177;
178; FAST-LABEL: foo_nosize:
179; FAST:       # %bb.0: # %entry
180; FAST-NEXT:    movw $-1, %cx
181; FAST-NEXT:    .p2align 4
182; FAST-NEXT:  .LBB6_1: # %for.body
183; FAST-NEXT:    # =>This Inner Loop Header: Depth=1
184; FAST-NEXT:    movzwl %cx, %edx
185; FAST-NEXT:    addl $-1, %ecx
186; FAST-NEXT:    cmpl %eax, %edx
187; FAST-NEXT:    jl .LBB6_1
188; FAST-NEXT:  # %bb.2: # %for.end
189; FAST-NEXT:    retl
190entry:
191  br label %for.body
192
193for.body:
194  %i.05 = phi i16 [ %dec, %for.body ], [ 0, %entry ]
195  %dec = add i16 %i.05, -1
196  %conv = zext i16 %dec to i32
197  %cmp = icmp slt i32 %conv, %dns
198  br i1 %cmp, label %for.body, label %for.end
199
200for.end:
201  ret void
202}
203
204define void @bar_nosize(i32 inreg %dns) {
205; SLOW-LABEL: bar_nosize:
206; SLOW:       # %bb.0: # %entry
207; SLOW-NEXT:    movw $1, %cx
208; SLOW-NEXT:    .p2align 4
209; SLOW-NEXT:  .LBB7_1: # %for.body
210; SLOW-NEXT:    # =>This Inner Loop Header: Depth=1
211; SLOW-NEXT:    movzwl %cx, %edx
212; SLOW-NEXT:    incl %ecx
213; SLOW-NEXT:    cmpl %eax, %edx
214; SLOW-NEXT:    jl .LBB7_1
215; SLOW-NEXT:  # %bb.2: # %for.end
216; SLOW-NEXT:    retl
217;
218; FAST-LABEL: bar_nosize:
219; FAST:       # %bb.0: # %entry
220; FAST-NEXT:    movw $1, %cx
221; FAST-NEXT:    .p2align 4
222; FAST-NEXT:  .LBB7_1: # %for.body
223; FAST-NEXT:    # =>This Inner Loop Header: Depth=1
224; FAST-NEXT:    movzwl %cx, %edx
225; FAST-NEXT:    addl $1, %ecx
226; FAST-NEXT:    cmpl %eax, %edx
227; FAST-NEXT:    jl .LBB7_1
228; FAST-NEXT:  # %bb.2: # %for.end
229; FAST-NEXT:    retl
230entry:
231  br label %for.body
232
233for.body:
234  %i.05 = phi i16 [ %inc, %for.body ], [ 0, %entry ]
235  %inc = add i16 %i.05, 1
236  %conv = zext i16 %inc to i32
237  %cmp = icmp slt i32 %conv, %dns
238  br i1 %cmp, label %for.body, label %for.end
239for.end:
240  ret void
241}
242
243!llvm.module.flags = !{!0}
244!0 = !{i32 1, !"ProfileSummary", !1}
245!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}
246!2 = !{!"ProfileFormat", !"InstrProf"}
247!3 = !{!"TotalCount", i64 10000}
248!4 = !{!"MaxCount", i64 10}
249!5 = !{!"MaxInternalCount", i64 1}
250!6 = !{!"MaxFunctionCount", i64 1000}
251!7 = !{!"NumCounts", i64 3}
252!8 = !{!"NumFunctions", i64 3}
253!9 = !{!"DetailedSummary", !10}
254!10 = !{!11, !12, !13}
255!11 = !{i32 10000, i64 100, i32 1}
256!12 = !{i32 999000, i64 100, i32 1}
257!13 = !{i32 999999, i64 1, i32 2}
258!14 = !{!"function_entry_count", i64 0}
259