1
; RUN: llc < %s -march=x86-64 > %t
3
; RUN: not grep movz %t
6
; RUN: grep add %t | count 2
7
; RUN: grep inc %t | count 4
8
; RUN: grep dec %t | count 2
9
; RUN: grep lea %t | count 2
11
; Optimize away zext-inreg and sext-inreg on the loop induction
12
; variable using trip-count information.
14
define void @count_up(double* %d, i64 %n) nounwind {
19
%indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
20
%indvar.i8 = and i64 %indvar, 255
21
%t0 = getelementptr double* %d, i64 %indvar.i8
22
%t1 = load double* %t0
23
%t2 = fmul double %t1, 0.1
24
store double %t2, double* %t0
25
%indvar.i24 = and i64 %indvar, 16777215
26
%t3 = getelementptr double* %d, i64 %indvar.i24
27
%t4 = load double* %t3
28
%t5 = fmul double %t4, 2.3
29
store double %t5, double* %t3
30
%t6 = getelementptr double* %d, i64 %indvar
31
%t7 = load double* %t6
32
%t8 = fmul double %t7, 4.5
33
store double %t8, double* %t6
34
%indvar.next = add i64 %indvar, 1
35
%exitcond = icmp eq i64 %indvar.next, 10
36
br i1 %exitcond, label %return, label %loop
42
define void @count_down(double* %d, i64 %n) nounwind {
47
%indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
48
%indvar.i8 = and i64 %indvar, 255
49
%t0 = getelementptr double* %d, i64 %indvar.i8
50
%t1 = load double* %t0
51
%t2 = fmul double %t1, 0.1
52
store double %t2, double* %t0
53
%indvar.i24 = and i64 %indvar, 16777215
54
%t3 = getelementptr double* %d, i64 %indvar.i24
55
%t4 = load double* %t3
56
%t5 = fmul double %t4, 2.3
57
store double %t5, double* %t3
58
%t6 = getelementptr double* %d, i64 %indvar
59
%t7 = load double* %t6
60
%t8 = fmul double %t7, 4.5
61
store double %t8, double* %t6
62
%indvar.next = sub i64 %indvar, 1
63
%exitcond = icmp eq i64 %indvar.next, 0
64
br i1 %exitcond, label %return, label %loop
70
define void @count_up_signed(double* %d, i64 %n) nounwind {
75
%indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
76
%s0 = shl i64 %indvar, 8
77
%indvar.i8 = ashr i64 %s0, 8
78
%t0 = getelementptr double* %d, i64 %indvar.i8
79
%t1 = load double* %t0
80
%t2 = fmul double %t1, 0.1
81
store double %t2, double* %t0
82
%s1 = shl i64 %indvar, 24
83
%indvar.i24 = ashr i64 %s1, 24
84
%t3 = getelementptr double* %d, i64 %indvar.i24
85
%t4 = load double* %t3
86
%t5 = fmul double %t4, 2.3
87
store double %t5, double* %t3
88
%t6 = getelementptr double* %d, i64 %indvar
89
%t7 = load double* %t6
90
%t8 = fmul double %t7, 4.5
91
store double %t8, double* %t6
92
%indvar.next = add i64 %indvar, 1
93
%exitcond = icmp eq i64 %indvar.next, 10
94
br i1 %exitcond, label %return, label %loop
100
define void @count_down_signed(double* %d, i64 %n) nounwind {
105
%indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
106
%s0 = shl i64 %indvar, 8
107
%indvar.i8 = ashr i64 %s0, 8
108
%t0 = getelementptr double* %d, i64 %indvar.i8
109
%t1 = load double* %t0
110
%t2 = fmul double %t1, 0.1
111
store double %t2, double* %t0
112
%s1 = shl i64 %indvar, 24
113
%indvar.i24 = ashr i64 %s1, 24
114
%t3 = getelementptr double* %d, i64 %indvar.i24
115
%t4 = load double* %t3
116
%t5 = fmul double %t4, 2.3
117
store double %t5, double* %t3
118
%t6 = getelementptr double* %d, i64 %indvar
119
%t7 = load double* %t6
120
%t8 = fmul double %t7, 4.5
121
store double %t8, double* %t6
122
%indvar.next = sub i64 %indvar, 1
123
%exitcond = icmp eq i64 %indvar.next, 0
124
br i1 %exitcond, label %return, label %loop
130
define void @another_count_up(double* %d, i64 %n) nounwind {
135
%indvar = phi i64 [ 18446744073709551615, %entry ], [ %indvar.next, %loop ]
136
%indvar.i8 = and i64 %indvar, 255
137
%t0 = getelementptr double* %d, i64 %indvar.i8
138
%t1 = load double* %t0
139
%t2 = fmul double %t1, 0.1
140
store double %t2, double* %t0
141
%indvar.i24 = and i64 %indvar, 16777215
142
%t3 = getelementptr double* %d, i64 %indvar.i24
143
%t4 = load double* %t3
144
%t5 = fmul double %t4, 2.3
145
store double %t5, double* %t3
146
%t6 = getelementptr double* %d, i64 %indvar
147
%t7 = load double* %t6
148
%t8 = fmul double %t7, 4.5
149
store double %t8, double* %t6
150
%indvar.next = add i64 %indvar, 1
151
%exitcond = icmp eq i64 %indvar.next, 0
152
br i1 %exitcond, label %return, label %loop
158
define void @another_count_down(double* %d, i64 %n) nounwind {
163
%indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
164
%indvar.i8 = and i64 %indvar, 255
165
%t0 = getelementptr double* %d, i64 %indvar.i8
166
%t1 = load double* %t0
167
%t2 = fmul double %t1, 0.1
168
store double %t2, double* %t0
169
%indvar.i24 = and i64 %indvar, 16777215
170
%t3 = getelementptr double* %d, i64 %indvar.i24
171
%t4 = load double* %t3
172
%t5 = fdiv double %t4, 2.3
173
store double %t5, double* %t3
174
%t6 = getelementptr double* %d, i64 %indvar
175
%t7 = load double* %t6
176
%t8 = fmul double %t7, 4.5
177
store double %t8, double* %t6
178
%indvar.next = sub i64 %indvar, 1
179
%exitcond = icmp eq i64 %indvar.next, 18446744073709551615
180
br i1 %exitcond, label %return, label %loop
186
define void @another_count_up_signed(double* %d, i64 %n) nounwind {
191
%indvar = phi i64 [ 18446744073709551615, %entry ], [ %indvar.next, %loop ]
192
%s0 = shl i64 %indvar, 8
193
%indvar.i8 = ashr i64 %s0, 8
194
%t0 = getelementptr double* %d, i64 %indvar.i8
195
%t1 = load double* %t0
196
%t2 = fmul double %t1, 0.1
197
store double %t2, double* %t0
198
%s1 = shl i64 %indvar, 24
199
%indvar.i24 = ashr i64 %s1, 24
200
%t3 = getelementptr double* %d, i64 %indvar.i24
201
%t4 = load double* %t3
202
%t5 = fdiv double %t4, 2.3
203
store double %t5, double* %t3
204
%t6 = getelementptr double* %d, i64 %indvar
205
%t7 = load double* %t6
206
%t8 = fmul double %t7, 4.5
207
store double %t8, double* %t6
208
%indvar.next = add i64 %indvar, 1
209
%exitcond = icmp eq i64 %indvar.next, 0
210
br i1 %exitcond, label %return, label %loop
216
define void @another_count_down_signed(double* %d, i64 %n) nounwind {
221
%indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
222
%s0 = shl i64 %indvar, 8
223
%indvar.i8 = ashr i64 %s0, 8
224
%t0 = getelementptr double* %d, i64 %indvar.i8
225
%t1 = load double* %t0
226
%t2 = fmul double %t1, 0.1
227
store double %t2, double* %t0
228
%s1 = shl i64 %indvar, 24
229
%indvar.i24 = ashr i64 %s1, 24
230
%t3 = getelementptr double* %d, i64 %indvar.i24
231
%t4 = load double* %t3
232
%t5 = fdiv double %t4, 2.3
233
store double %t5, double* %t3
234
%t6 = getelementptr double* %d, i64 %indvar
235
%t7 = load double* %t6
236
%t8 = fmul double %t7, 4.5
237
store double %t8, double* %t6
238
%indvar.next = sub i64 %indvar, 1
239
%exitcond = icmp eq i64 %indvar.next, 18446744073709551615
240
br i1 %exitcond, label %return, label %loop