1; RUN: llc < %s -mtriple=aarch64-linux-gnuabi -O2 | FileCheck %s
2
3; The following cases are for i16
4
5%struct.s_signed_i16 = type { i16, i16, i16 }
6%struct.s_unsigned_i16 = type { i16, i16, i16 }
7
8@cost_s_i8_i16 = common global %struct.s_signed_i16 zeroinitializer, align 2
9@cost_u_i16 = common global %struct.s_unsigned_i16 zeroinitializer, align 2
10
11define 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.gt
15; CHECK-NOT: cmp
16; CHECK: b.ne
17entry:
18  %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  %1 = load i16, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 2), align 2
20  %cmp = icmp sgt i16 %0, %1
21  br i1 %cmp, label %if.then, label %if.else
22
23if.then:                                          ; preds = %entry
24  store i16 %0, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 0), align 2
25  br label %if.end8
26
27if.else:                                          ; preds = %entry
28  %cmp5 = icmp eq i16 %0, %1
29  br i1 %cmp5, label %if.then7, label %if.end8
30
31if.then7:                                         ; preds = %if.else
32  store i16 %0, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 0), align 2
33  br label %if.end8
34
35if.end8:                                          ; preds = %if.else, %if.then7, %if.then
36  ret void
37}
38
39define 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.le
43; CHECK-NOT: cmp
44; CHECK: b.ge
45entry:
46  %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  %1 = load i16, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 2), align 2
48  %cmp = icmp sgt i16 %0, %1
49  br i1 %cmp, label %if.then, label %if.else
50
51if.then:                                          ; preds = %entry
52  store i16 %0, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 0), align 2
53  br label %if.end8
54
55if.else:                                          ; preds = %entry
56  %cmp5 = icmp slt i16 %0, %1
57  br i1 %cmp5, label %if.then7, label %if.end8
58
59if.then7:                                         ; preds = %if.else
60  store i16 %1, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 0), align 2
61  br label %if.end8
62
63if.end8:                                          ; preds = %if.else, %if.then7, %if.then
64  ret void
65}
66
67define 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.hi
71; CHECK-NOT: cmp
72; CHECK: b.ne
73entry:
74  %0 = load i16, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 1), align 2
75  %1 = load i16, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 2), align 2
76  %cmp = icmp ugt i16 %0, %1
77  br i1 %cmp, label %if.then, label %if.else
78
79if.then:                                          ; preds = %entry
80  store i16 %0, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 0), align 2
81  br label %if.end8
82
83if.else:                                          ; preds = %entry
84  %cmp5 = icmp eq i16 %0, %1
85  br i1 %cmp5, label %if.then7, label %if.end8
86
87if.then7:                                         ; preds = %if.else
88  store i16 %0, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 0), align 2
89  br label %if.end8
90
91if.end8:                                          ; preds = %if.else, %if.then7, %if.then
92  ret void
93}
94
95define 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.ls
99; CHECK-NOT: cmp
100; CHECK: b.hs
101entry:
102  %0 = load i16, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 1), align 2
103  %1 = load i16, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 2), align 2
104  %cmp = icmp ugt i16 %0, %1
105  br i1 %cmp, label %if.then, label %if.else
106
107if.then:                                          ; preds = %entry
108  store i16 %0, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 0), align 2
109  br label %if.end8
110
111if.else:                                          ; preds = %entry
112  %cmp5 = icmp ult i16 %0, %1
113  br i1 %cmp5, label %if.then7, label %if.end8
114
115if.then7:                                         ; preds = %if.else
116  store i16 %1, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 0), align 2
117  br label %if.end8
118
119if.end8:                                          ; preds = %if.else, %if.then7, %if.then
120  ret void
121}
122
123; The following cases are for i8
124
125%struct.s_signed_i8 = type { i8, i8, i8 }
126%struct.s_unsigned_i8 = type { i8, i8, i8 }
127
128@cost_s = common global %struct.s_signed_i8 zeroinitializer, align 2
129@cost_u_i8 = common global %struct.s_unsigned_i8 zeroinitializer, align 2
130
131
132define 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.gt
136; CHECK-NOT: cmp
137; CHECK: b.ne
138entry:
139  %0 = load i8, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 1), align 2
140  %1 = load i8, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 2), align 2
141  %cmp = icmp sgt i8 %0, %1
142  br i1 %cmp, label %if.then, label %if.else
143
144if.then:                                          ; preds = %entry
145  store i8 %0, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 0), align 2
146  br label %if.end8
147
148if.else:                                          ; preds = %entry
149  %cmp5 = icmp eq i8 %0, %1
150  br i1 %cmp5, label %if.then7, label %if.end8
151
152if.then7:                                         ; preds = %if.else
153  store i8 %0, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 0), align 2
154  br label %if.end8
155
156if.end8:                                          ; preds = %if.else, %if.then7, %if.then
157  ret void
158}
159
160define 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.le
164; CHECK-NOT: cmp
165; CHECK: b.ge
166entry:
167  %0 = load i8, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 1), align 2
168  %1 = load i8, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 2), align 2
169  %cmp = icmp sgt i8 %0, %1
170  br i1 %cmp, label %if.then, label %if.else
171
172if.then:                                          ; preds = %entry
173  store i8 %0, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 0), align 2
174  br label %if.end8
175
176if.else:                                          ; preds = %entry
177  %cmp5 = icmp slt i8 %0, %1
178  br i1 %cmp5, label %if.then7, label %if.end8
179
180if.then7:                                         ; preds = %if.else
181  store i8 %1, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 0), align 2
182  br label %if.end8
183
184if.end8:                                          ; preds = %if.else, %if.then7, %if.then
185  ret void
186}
187
188define 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.hi
192; CHECK-NOT: cmp
193; CHECK: b.ne
194entry:
195  %0 = load i8, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 1), align 2
196  %1 = load i8, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 2), align 2
197  %cmp = icmp ugt i8 %0, %1
198  br i1 %cmp, label %if.then, label %if.else
199
200if.then:                                          ; preds = %entry
201  store i8 %0, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 0), align 2
202  br label %if.end8
203
204if.else:                                          ; preds = %entry
205  %cmp5 = icmp eq i8 %0, %1
206  br i1 %cmp5, label %if.then7, label %if.end8
207
208if.then7:                                         ; preds = %if.else
209  store i8 %0, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 0), align 2
210  br label %if.end8
211
212if.end8:                                          ; preds = %if.else, %if.then7, %if.then
213  ret void
214}
215
216define 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.ls
220; CHECK-NOT: cmp
221; CHECK: b.hs
222entry:
223  %0 = load i8, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 1), align 2
224  %1 = load i8, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 2), align 2
225  %cmp = icmp ugt i8 %0, %1
226  br i1 %cmp, label %if.then, label %if.else
227
228if.then:                                          ; preds = %entry
229  store i8 %0, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 0), align 2
230  br label %if.end8
231
232if.else:                                          ; preds = %entry
233  %cmp5 = icmp ult i8 %0, %1
234  br i1 %cmp5, label %if.then7, label %if.end8
235
236if.then7:                                         ; preds = %if.else
237  store i8 %1, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 0), align 2
238  br label %if.end8
239
240if.end8:                                          ; preds = %if.else, %if.then7, %if.then
241  ret void
242}
243
244; Make sure the case below won't crash.
245
246; The optimization of ZERO_EXTEND and SIGN_EXTEND in type legalization stage can't assert
247; the operand of a set_cc is always a TRUNCATE.
248
249define i1 @foo(float %inl, float %inr) {
250  %lval = fptosi float %inl to i8
251  %rval = fptosi float %inr to i8
252  %sum = icmp eq i8 %lval, %rval
253  ret i1 %sum
254}
255