1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
1
2
; RUN: llc < %s -mtriple=aarch64-linux-gnuabi -O2 | FileCheck %s
2
3
3
4
; The following cases are for i16
9
10
@cost_u_i16 = common global %struct.s_unsigned_i16 zeroinitializer , align 2
10
11
11
12
define void @test_i16_2cmp_signed_1 () {
12
- ; CHECK-LABEL: test_i16_2cmp_signed_1
13
- ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
14
- ; CHECK-NEXT: b.lt
15
- ; CHECK-NOT: cmp
16
- ; CHECK: ret
13
+ ; CHECK-LABEL: test_i16_2cmp_signed_1:
14
+ ; CHECK: // %bb.0: // %entry
15
+ ; CHECK-NEXT: adrp x8, :got:cost_s_i8_i16
16
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:cost_s_i8_i16]
17
+ ; CHECK-NEXT: ldrsh w9, [x8, #2]
18
+ ; CHECK-NEXT: ldrsh w10, [x8, #4]
19
+ ; CHECK-NEXT: cmp w9, w10
20
+ ; CHECK-NEXT: b.lt .LBB0_2
21
+ ; CHECK-NEXT: // %bb.1: // %if.end8.sink.split
22
+ ; CHECK-NEXT: strh w9, [x8]
23
+ ; CHECK-NEXT: .LBB0_2: // %if.end8
24
+ ; CHECK-NEXT: ret
17
25
entry:
18
26
%0 = load i16 , i16* getelementptr inbounds (%struct.s_signed_i16 , %struct.s_signed_i16* @cost_s_i8_i16 , i64 0 , i32 1 ), align 2
19
27
%1 = load i16 , i16* getelementptr inbounds (%struct.s_signed_i16 , %struct.s_signed_i16* @cost_s_i8_i16 , i64 0 , i32 2 ), align 2
@@ -37,11 +45,21 @@ if.end8: ; preds = %if.else, %if.then7,
37
45
}
38
46
39
47
define void @test_i16_2cmp_signed_2 () {
40
- ; CHECK-LABEL: test_i16_2cmp_signed_2
41
- ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
42
- ; CHECK-NEXT: b.gt
43
- ; CHECK-NOT: cmp
44
- ; CHECK: b.ge
48
+ ; CHECK-LABEL: test_i16_2cmp_signed_2:
49
+ ; CHECK: // %bb.0: // %entry
50
+ ; CHECK-NEXT: adrp x8, :got:cost_s_i8_i16
51
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:cost_s_i8_i16]
52
+ ; CHECK-NEXT: ldrsh w9, [x8, #2]
53
+ ; CHECK-NEXT: ldrsh w10, [x8, #4]
54
+ ; CHECK-NEXT: cmp w9, w10
55
+ ; CHECK-NEXT: b.gt .LBB1_2
56
+ ; CHECK-NEXT: // %bb.1: // %if.else
57
+ ; CHECK-NEXT: mov w9, w10
58
+ ; CHECK-NEXT: b.ge .LBB1_3
59
+ ; CHECK-NEXT: .LBB1_2: // %if.end8.sink.split
60
+ ; CHECK-NEXT: strh w9, [x8]
61
+ ; CHECK-NEXT: .LBB1_3: // %if.end8
62
+ ; CHECK-NEXT: ret
45
63
entry:
46
64
%0 = load i16 , i16* getelementptr inbounds (%struct.s_signed_i16 , %struct.s_signed_i16* @cost_s_i8_i16 , i64 0 , i32 1 ), align 2
47
65
%1 = load i16 , i16* getelementptr inbounds (%struct.s_signed_i16 , %struct.s_signed_i16* @cost_s_i8_i16 , i64 0 , i32 2 ), align 2
@@ -65,11 +83,18 @@ if.end8: ; preds = %if.else, %if.then7,
65
83
}
66
84
67
85
define void @test_i16_2cmp_unsigned_1 () {
68
- ; CHECK-LABEL: test_i16_2cmp_unsigned_1
69
- ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
70
- ; CHECK-NEXT: b.lo
71
- ; CHECK-NOT: cmp
72
- ; CHECK: ret
86
+ ; CHECK-LABEL: test_i16_2cmp_unsigned_1:
87
+ ; CHECK: // %bb.0: // %entry
88
+ ; CHECK-NEXT: adrp x8, :got:cost_u_i16
89
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:cost_u_i16]
90
+ ; CHECK-NEXT: ldrh w9, [x8, #2]
91
+ ; CHECK-NEXT: ldrh w10, [x8, #4]
92
+ ; CHECK-NEXT: cmp w9, w10
93
+ ; CHECK-NEXT: b.lo .LBB2_2
94
+ ; CHECK-NEXT: // %bb.1: // %if.end8.sink.split
95
+ ; CHECK-NEXT: strh w9, [x8]
96
+ ; CHECK-NEXT: .LBB2_2: // %if.end8
97
+ ; CHECK-NEXT: ret
73
98
entry:
74
99
%0 = load i16 , i16* getelementptr inbounds (%struct.s_unsigned_i16 , %struct.s_unsigned_i16* @cost_u_i16 , i64 0 , i32 1 ), align 2
75
100
%1 = load i16 , i16* getelementptr inbounds (%struct.s_unsigned_i16 , %struct.s_unsigned_i16* @cost_u_i16 , i64 0 , i32 2 ), align 2
@@ -93,11 +118,21 @@ if.end8: ; preds = %if.else, %if.then7,
93
118
}
94
119
95
120
define void @test_i16_2cmp_unsigned_2 () {
96
- ; CHECK-LABEL: test_i16_2cmp_unsigned_2
97
- ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
98
- ; CHECK-NEXT: b.hi
99
- ; CHECK-NOT: cmp
100
- ; CHECK: b.hs
121
+ ; CHECK-LABEL: test_i16_2cmp_unsigned_2:
122
+ ; CHECK: // %bb.0: // %entry
123
+ ; CHECK-NEXT: adrp x8, :got:cost_u_i16
124
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:cost_u_i16]
125
+ ; CHECK-NEXT: ldrh w9, [x8, #2]
126
+ ; CHECK-NEXT: ldrh w10, [x8, #4]
127
+ ; CHECK-NEXT: cmp w9, w10
128
+ ; CHECK-NEXT: b.hi .LBB3_2
129
+ ; CHECK-NEXT: // %bb.1: // %if.else
130
+ ; CHECK-NEXT: mov w9, w10
131
+ ; CHECK-NEXT: b.hs .LBB3_3
132
+ ; CHECK-NEXT: .LBB3_2: // %if.end8.sink.split
133
+ ; CHECK-NEXT: strh w9, [x8]
134
+ ; CHECK-NEXT: .LBB3_3: // %if.end8
135
+ ; CHECK-NEXT: ret
101
136
entry:
102
137
%0 = load i16 , i16* getelementptr inbounds (%struct.s_unsigned_i16 , %struct.s_unsigned_i16* @cost_u_i16 , i64 0 , i32 1 ), align 2
103
138
%1 = load i16 , i16* getelementptr inbounds (%struct.s_unsigned_i16 , %struct.s_unsigned_i16* @cost_u_i16 , i64 0 , i32 2 ), align 2
@@ -130,11 +165,18 @@ if.end8: ; preds = %if.else, %if.then7,
130
165
131
166
132
167
define void @test_i8_2cmp_signed_1 () {
133
- ; CHECK-LABEL: test_i8_2cmp_signed_1
134
- ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
135
- ; CHECK-NEXT: b.lt
136
- ; CHECK-NOT: cmp
137
- ; CHECK: ret
168
+ ; CHECK-LABEL: test_i8_2cmp_signed_1:
169
+ ; CHECK: // %bb.0: // %entry
170
+ ; CHECK-NEXT: adrp x8, :got:cost_s
171
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:cost_s]
172
+ ; CHECK-NEXT: ldrsb w9, [x8, #1]
173
+ ; CHECK-NEXT: ldrsb w10, [x8, #2]
174
+ ; CHECK-NEXT: cmp w9, w10
175
+ ; CHECK-NEXT: b.lt .LBB4_2
176
+ ; CHECK-NEXT: // %bb.1: // %if.end8.sink.split
177
+ ; CHECK-NEXT: strb w9, [x8]
178
+ ; CHECK-NEXT: .LBB4_2: // %if.end8
179
+ ; CHECK-NEXT: ret
138
180
entry:
139
181
%0 = load i8 , i8* getelementptr inbounds (%struct.s_signed_i8 , %struct.s_signed_i8* @cost_s , i64 0 , i32 1 ), align 2
140
182
%1 = load i8 , i8* getelementptr inbounds (%struct.s_signed_i8 , %struct.s_signed_i8* @cost_s , i64 0 , i32 2 ), align 2
@@ -158,11 +200,21 @@ if.end8: ; preds = %if.else, %if.then7,
158
200
}
159
201
160
202
define void @test_i8_2cmp_signed_2 () {
161
- ; CHECK-LABEL: test_i8_2cmp_signed_2
162
- ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
163
- ; CHECK-NEXT: b.gt
164
- ; CHECK-NOT: cmp
165
- ; CHECK: b.ge
203
+ ; CHECK-LABEL: test_i8_2cmp_signed_2:
204
+ ; CHECK: // %bb.0: // %entry
205
+ ; CHECK-NEXT: adrp x8, :got:cost_s
206
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:cost_s]
207
+ ; CHECK-NEXT: ldrsb w9, [x8, #1]
208
+ ; CHECK-NEXT: ldrsb w10, [x8, #2]
209
+ ; CHECK-NEXT: cmp w9, w10
210
+ ; CHECK-NEXT: b.gt .LBB5_2
211
+ ; CHECK-NEXT: // %bb.1: // %if.else
212
+ ; CHECK-NEXT: mov w9, w10
213
+ ; CHECK-NEXT: b.ge .LBB5_3
214
+ ; CHECK-NEXT: .LBB5_2: // %if.end8.sink.split
215
+ ; CHECK-NEXT: strb w9, [x8]
216
+ ; CHECK-NEXT: .LBB5_3: // %if.end8
217
+ ; CHECK-NEXT: ret
166
218
entry:
167
219
%0 = load i8 , i8* getelementptr inbounds (%struct.s_signed_i8 , %struct.s_signed_i8* @cost_s , i64 0 , i32 1 ), align 2
168
220
%1 = load i8 , i8* getelementptr inbounds (%struct.s_signed_i8 , %struct.s_signed_i8* @cost_s , i64 0 , i32 2 ), align 2
@@ -186,11 +238,18 @@ if.end8: ; preds = %if.else, %if.then7,
186
238
}
187
239
188
240
define void @test_i8_2cmp_unsigned_1 () {
189
- ; CHECK-LABEL: test_i8_2cmp_unsigned_1
190
- ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
191
- ; CHECK-NEXT: b.lo
192
- ; CHECK-NOT: cmp
193
- ; CHECK: ret
241
+ ; CHECK-LABEL: test_i8_2cmp_unsigned_1:
242
+ ; CHECK: // %bb.0: // %entry
243
+ ; CHECK-NEXT: adrp x8, :got:cost_u_i8
244
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:cost_u_i8]
245
+ ; CHECK-NEXT: ldrb w9, [x8, #1]
246
+ ; CHECK-NEXT: ldrb w10, [x8, #2]
247
+ ; CHECK-NEXT: cmp w9, w10
248
+ ; CHECK-NEXT: b.lo .LBB6_2
249
+ ; CHECK-NEXT: // %bb.1: // %if.end8.sink.split
250
+ ; CHECK-NEXT: strb w9, [x8]
251
+ ; CHECK-NEXT: .LBB6_2: // %if.end8
252
+ ; CHECK-NEXT: ret
194
253
entry:
195
254
%0 = load i8 , i8* getelementptr inbounds (%struct.s_unsigned_i8 , %struct.s_unsigned_i8* @cost_u_i8 , i64 0 , i32 1 ), align 2
196
255
%1 = load i8 , i8* getelementptr inbounds (%struct.s_unsigned_i8 , %struct.s_unsigned_i8* @cost_u_i8 , i64 0 , i32 2 ), align 2
@@ -214,11 +273,21 @@ if.end8: ; preds = %if.else, %if.then7,
214
273
}
215
274
216
275
define void @test_i8_2cmp_unsigned_2 () {
217
- ; CHECK-LABEL: test_i8_2cmp_unsigned_2
218
- ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
219
- ; CHECK-NEXT: b.hi
220
- ; CHECK-NOT: cmp
221
- ; CHECK: b.hs
276
+ ; CHECK-LABEL: test_i8_2cmp_unsigned_2:
277
+ ; CHECK: // %bb.0: // %entry
278
+ ; CHECK-NEXT: adrp x8, :got:cost_u_i8
279
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:cost_u_i8]
280
+ ; CHECK-NEXT: ldrb w9, [x8, #1]
281
+ ; CHECK-NEXT: ldrb w10, [x8, #2]
282
+ ; CHECK-NEXT: cmp w9, w10
283
+ ; CHECK-NEXT: b.hi .LBB7_2
284
+ ; CHECK-NEXT: // %bb.1: // %if.else
285
+ ; CHECK-NEXT: mov w9, w10
286
+ ; CHECK-NEXT: b.hs .LBB7_3
287
+ ; CHECK-NEXT: .LBB7_2: // %if.end8.sink.split
288
+ ; CHECK-NEXT: strb w9, [x8]
289
+ ; CHECK-NEXT: .LBB7_3: // %if.end8
290
+ ; CHECK-NEXT: ret
222
291
entry:
223
292
%0 = load i8 , i8* getelementptr inbounds (%struct.s_unsigned_i8 , %struct.s_unsigned_i8* @cost_u_i8 , i64 0 , i32 1 ), align 2
224
293
%1 = load i8 , i8* getelementptr inbounds (%struct.s_unsigned_i8 , %struct.s_unsigned_i8* @cost_u_i8 , i64 0 , i32 2 ), align 2
@@ -247,6 +316,13 @@ if.end8: ; preds = %if.else, %if.then7,
247
316
; the operand of a set_cc is always a TRUNCATE.
248
317
249
318
define i1 @foo (float %inl , float %inr ) {
319
+ ; CHECK-LABEL: foo:
320
+ ; CHECK: // %bb.0:
321
+ ; CHECK-NEXT: fcvtzs w8, s0
322
+ ; CHECK-NEXT: fcvtzs w9, s1
323
+ ; CHECK-NEXT: cmp w8, w9
324
+ ; CHECK-NEXT: cset w0, eq
325
+ ; CHECK-NEXT: ret
250
326
%lval = fptosi float %inl to i8
251
327
%rval = fptosi float %inr to i8
252
328
%sum = icmp eq i8 %lval , %rval
0 commit comments