Revert "[AArch64] Add DAG combine for extract extend pattern"
[oota-llvm.git] / test / CodeGen / AArch64 / rm_redundant_cmp.ll
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
11 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.gt
15 ; CHECK-NOT: cmp
16 ; CHECK: b.ne
17 entry:
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
23 if.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
27 if.else:                                          ; preds = %entry
28   %cmp5 = icmp eq i16 %0, %1
29   br i1 %cmp5, label %if.then7, label %if.end8
30
31 if.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
35 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
36   ret void
37 }
38
39 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.le
43 ; CHECK-NOT: cmp
44 ; CHECK: b.ge
45 entry:
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
51 if.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
55 if.else:                                          ; preds = %entry
56   %cmp5 = icmp slt i16 %0, %1
57   br i1 %cmp5, label %if.then7, label %if.end8
58
59 if.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
63 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
64   ret void
65 }
66
67 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.hi
71 ; CHECK-NOT: cmp
72 ; CHECK: b.ne
73 entry:
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
79 if.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
83 if.else:                                          ; preds = %entry
84   %cmp5 = icmp eq i16 %0, %1
85   br i1 %cmp5, label %if.then7, label %if.end8
86
87 if.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
91 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
92   ret void
93 }
94
95 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.ls
99 ; CHECK-NOT: cmp
100 ; CHECK: b.hs
101 entry:
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
107 if.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
111 if.else:                                          ; preds = %entry
112   %cmp5 = icmp ult i16 %0, %1
113   br i1 %cmp5, label %if.then7, label %if.end8
114
115 if.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
119 if.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
132 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.gt
136 ; CHECK-NOT: cmp
137 ; CHECK: b.ne
138 entry:
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
144 if.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
148 if.else:                                          ; preds = %entry
149   %cmp5 = icmp eq i8 %0, %1
150   br i1 %cmp5, label %if.then7, label %if.end8
151
152 if.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
156 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
157   ret void
158 }
159
160 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.le
164 ; CHECK-NOT: cmp
165 ; CHECK: b.ge
166 entry:
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
172 if.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
176 if.else:                                          ; preds = %entry
177   %cmp5 = icmp slt i8 %0, %1
178   br i1 %cmp5, label %if.then7, label %if.end8
179
180 if.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
184 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
185   ret void
186 }
187
188 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.hi
192 ; CHECK-NOT: cmp
193 ; CHECK: b.ne
194 entry:
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
200 if.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
204 if.else:                                          ; preds = %entry
205   %cmp5 = icmp eq i8 %0, %1
206   br i1 %cmp5, label %if.then7, label %if.end8
207
208 if.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
212 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
213   ret void
214 }
215
216 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.ls
220 ; CHECK-NOT: cmp
221 ; CHECK: b.hs
222 entry:
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
228 if.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
232 if.else:                                          ; preds = %entry
233   %cmp5 = icmp ult i8 %0, %1
234   br i1 %cmp5, label %if.then7, label %if.end8
235
236 if.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
240 if.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
249 define 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 }