xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/combine-icmp-to-lhs-known-bits.mir (revision ac321cbb0350996ceef4e6d9e8a1035880609288)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2
3# RUN: llc -mtriple aarch64 -run-pass=aarch64-prelegalizer-combiner --aarch64prelegalizercombiner-only-enable-rule="icmp_to_lhs_known_bits" -global-isel -verify-machineinstrs %s -o - | FileCheck %s
4# REQUIRES: asserts
5
6...
7---
8name:            apply_ne
9alignment:       4
10tracksRegLiveness: true
11machineFunctionInfo: {}
12body:             |
13  bb.0:
14    liveins: $w0
15    ; CHECK-LABEL: name: apply_ne
16    ; CHECK: liveins: $w0
17    ; CHECK: %x:_(s32) = COPY $w0
18    ; CHECK: %one:_(s32) = G_CONSTANT i32 1
19    ; CHECK: %known_zero_or_one:_(s32) = G_AND %x, %one
20    ; CHECK: %cmp:_(s1) = G_TRUNC %known_zero_or_one(s32)
21    ; CHECK: %ext:_(s32) = G_ZEXT %cmp(s1)
22    ; CHECK: $w0 = COPY %ext(s32)
23    ; CHECK: RET_ReallyLR implicit $w0
24    %x:_(s32) = COPY $w0
25    %one:_(s32) = G_CONSTANT i32 1
26    %known_zero_or_one:_(s32) = G_AND %x, %one
27    %zero:_(s32) = G_CONSTANT i32 0
28    %cmp:_(s1) = G_ICMP intpred(ne), %known_zero_or_one(s32), %zero
29    %ext:_(s32) = G_ZEXT %cmp(s1)
30    $w0 = COPY %ext(s32)
31    RET_ReallyLR implicit $w0
32
33...
34---
35name:            apply_eq
36alignment:       4
37tracksRegLiveness: true
38machineFunctionInfo: {}
39body:             |
40  bb.0:
41    liveins: $w0
42    ; CHECK-LABEL: name: apply_eq
43    ; CHECK: liveins: $w0
44    ; CHECK: %x:_(s32) = COPY $w0
45    ; CHECK: %one:_(s32) = G_CONSTANT i32 1
46    ; CHECK: %known_zero_or_one:_(s32) = G_AND %x, %one
47    ; CHECK: %cmp:_(s1) = G_TRUNC %known_zero_or_one(s32)
48    ; CHECK: %ext:_(s32) = G_ZEXT %cmp(s1)
49    ; CHECK: $w0 = COPY %ext(s32)
50    ; CHECK: RET_ReallyLR implicit $w0
51    %x:_(s32) = COPY $w0
52    %one:_(s32) = G_CONSTANT i32 1
53    %known_zero_or_one:_(s32) = G_AND %x, %one
54    %cmp:_(s1) = G_ICMP intpred(eq), %known_zero_or_one(s32), %one
55    %ext:_(s32) = G_ZEXT %cmp(s1)
56    $w0 = COPY %ext(s32)
57    RET_ReallyLR implicit $w0
58
59...
60---
61name:            dont_apply_wrong_cst_eq
62alignment:       4
63tracksRegLiveness: true
64machineFunctionInfo: {}
65body:             |
66  bb.0:
67    liveins: $w0
68    ; Wrong constant on the RHS of the compare.
69
70    ; CHECK-LABEL: name: dont_apply_wrong_cst_eq
71    ; CHECK: liveins: $w0
72    ; CHECK: %x:_(s32) = COPY $w0
73    ; CHECK: %one:_(s32) = G_CONSTANT i32 1
74    ; CHECK: %known_zero_or_one:_(s32) = G_AND %x, %one
75    ; CHECK: %wrong_cst:_(s32) = G_CONSTANT i32 10
76    ; CHECK: %cmp:_(s1) = G_ICMP intpred(eq), %known_zero_or_one(s32), %wrong_cst
77    ; CHECK: %ext:_(s32) = G_ZEXT %cmp(s1)
78    ; CHECK: $w0 = COPY %ext(s32)
79    ; CHECK: RET_ReallyLR implicit $w0
80    %x:_(s32) = COPY $w0
81    %one:_(s32) = G_CONSTANT i32 1
82    %known_zero_or_one:_(s32) = G_AND %x, %one
83    %wrong_cst:_(s32) = G_CONSTANT i32 10
84    %cmp:_(s1) = G_ICMP intpred(eq), %known_zero_or_one(s32), %wrong_cst
85    %ext:_(s32) = G_ZEXT %cmp(s1)
86    $w0 = COPY %ext(s32)
87    RET_ReallyLR implicit $w0
88
89...
90---
91name:            dont_apply_wrong_cst_ne
92alignment:       4
93tracksRegLiveness: true
94machineFunctionInfo: {}
95body:             |
96  bb.0:
97    liveins: $w0
98    ; Wrong constant on the RHS of the compare.
99
100    ; CHECK-LABEL: name: dont_apply_wrong_cst_ne
101    ; CHECK: liveins: $w0
102    ; CHECK: %x:_(s32) = COPY $w0
103    ; CHECK: %one:_(s32) = G_CONSTANT i32 1
104    ; CHECK: %known_zero_or_one:_(s32) = G_AND %x, %one
105    ; CHECK: %wrong_cst:_(s32) = G_CONSTANT i32 10
106    ; CHECK: %cmp:_(s1) = G_ICMP intpred(ne), %known_zero_or_one(s32), %wrong_cst
107    ; CHECK: %ext:_(s32) = G_ZEXT %cmp(s1)
108    ; CHECK: $w0 = COPY %ext(s32)
109    ; CHECK: RET_ReallyLR implicit $w0
110    %x:_(s32) = COPY $w0
111    %one:_(s32) = G_CONSTANT i32 1
112    %known_zero_or_one:_(s32) = G_AND %x, %one
113    %wrong_cst:_(s32) = G_CONSTANT i32 10
114    %cmp:_(s1) = G_ICMP intpred(ne), %known_zero_or_one(s32), %wrong_cst
115    %ext:_(s32) = G_ZEXT %cmp(s1)
116    $w0 = COPY %ext(s32)
117    RET_ReallyLR implicit $w0
118
119...
120---
121name:            dont_apply_vector
122alignment:       4
123tracksRegLiveness: true
124machineFunctionInfo: {}
125body:             |
126  bb.0:
127    liveins: $x0
128    ; True is -1 for vectors on AArch64 so we don't want to combine.
129
130    ; CHECK-LABEL: name: dont_apply_vector
131    ; CHECK: liveins: $x0
132    ; CHECK-NEXT: {{  $}}
133    ; CHECK-NEXT: %x:_(<2 x s32>) = COPY $x0
134    ; CHECK-NEXT: %one:_(s32) = G_CONSTANT i32 1
135    ; CHECK-NEXT: %one_vec:_(<2 x s32>) = G_BUILD_VECTOR %one(s32), %one(s32)
136    ; CHECK-NEXT: %vec_and:_(<2 x s32>) = G_AND %x, %one_vec
137    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
138    ; CHECK-NEXT: %zero64:_(s64) = G_CONSTANT i64 0
139    ; CHECK-NEXT: %zero_vec:_(<2 x s32>) = G_BUILD_VECTOR %zero(s32), %zero(s32)
140    ; CHECK-NEXT: %cmp:_(<2 x s1>) = G_ICMP intpred(ne), %vec_and(<2 x s32>), %zero_vec
141    ; CHECK-NEXT: %elt:_(s1) = G_EXTRACT_VECTOR_ELT %cmp(<2 x s1>), %zero64(s64)
142    ; CHECK-NEXT: %ext:_(s32) = G_ZEXT %elt(s1)
143    ; CHECK-NEXT: $w0 = COPY %ext(s32)
144    ; CHECK-NEXT: RET_ReallyLR implicit $w0
145    %x:_(<2 x s32>) = COPY $x0
146    %one:_(s32) = G_CONSTANT i32 1
147    %one_vec:_(<2 x s32>) = G_BUILD_VECTOR %one, %one
148    %vec_and:_(<2 x s32>) = G_AND %x, %one_vec
149    %zero:_(s32) = G_CONSTANT i32 0
150    %zero64:_(s64) = G_CONSTANT i64 0
151    %zero_vec:_(<2 x s32>) = G_BUILD_VECTOR %zero, %zero
152    %cmp:_(<2 x s1>) = G_ICMP intpred(ne), %vec_and(<2 x s32>), %zero_vec
153    %elt:_(s1) = G_EXTRACT_VECTOR_ELT %cmp, %zero64
154    %ext:_(s32) = G_ZEXT %elt(s1)
155    $w0 = COPY %ext(s32)
156    RET_ReallyLR implicit $w0
157
158...
159---
160name:            apply_no_zext_or_trunc
161alignment:       4
162tracksRegLiveness: true
163machineFunctionInfo: {}
164body:             |
165  bb.0:
166    liveins: $w0
167    ; CHECK-LABEL: name: apply_no_zext_or_trunc
168    ; CHECK: liveins: $w0
169    ; CHECK: %x:_(s32) = COPY $w0
170    ; CHECK: %one:_(s32) = G_CONSTANT i32 1
171    ; CHECK: %known_zero_or_one:_(s32) = G_AND %x, %one
172    ; CHECK: %cmp:_(s32) = COPY %known_zero_or_one(s32)
173    ; CHECK: $w0 = COPY %cmp(s32)
174    ; CHECK: RET_ReallyLR implicit $w0
175    %x:_(s32) = COPY $w0
176    %one:_(s32) = G_CONSTANT i32 1
177    %known_zero_or_one:_(s32) = G_AND %x, %one
178    %zero:_(s32) = G_CONSTANT i32 0
179    %cmp:_(s32) = G_ICMP intpred(ne), %known_zero_or_one(s32), %zero
180    $w0 = COPY %cmp(s32)
181    RET_ReallyLR implicit $w0
182
183...
184---
185name:            apply_wide_cmp
186alignment:       4
187tracksRegLiveness: true
188machineFunctionInfo: {}
189body:             |
190  bb.0:
191    liveins: $w0
192    ; CHECK-LABEL: name: apply_wide_cmp
193    ; CHECK: liveins: $w0
194    ; CHECK: %x:_(s64) = COPY $x0
195    ; CHECK: %one:_(s64) = G_CONSTANT i64 1
196    ; CHECK: %known_zero_or_one:_(s64) = G_AND %x, %one
197    ; CHECK: %cmp:_(s64) = COPY %known_zero_or_one(s64)
198    ; CHECK: %trunc:_(s32) = G_TRUNC %cmp(s64)
199    ; CHECK: $w0 = COPY %trunc(s32)
200    ; CHECK: RET_ReallyLR implicit $w0
201    %x:_(s64) = COPY $x0
202    %one:_(s64) = G_CONSTANT i64 1
203    %known_zero_or_one:_(s64) = G_AND %x, %one
204    %zero:_(s64) = G_CONSTANT i64 0
205    %cmp:_(s64) = G_ICMP intpred(ne), %known_zero_or_one(s64), %zero
206    %trunc:_(s32) = G_TRUNC %cmp
207    $w0 = COPY %trunc(s32)
208    RET_ReallyLR implicit $w0
209
210...
211---
212name:            apply_narrow_lhs
213alignment:       4
214tracksRegLiveness: true
215machineFunctionInfo: {}
216body:             |
217  bb.0:
218    liveins: $w0
219    ; CHECK-LABEL: name: apply_narrow_lhs
220    ; CHECK: liveins: $w0
221    ; CHECK: %x:_(s32) = COPY $w0
222    ; CHECK: %one:_(s32) = G_CONSTANT i32 1
223    ; CHECK: %known_zero_or_one:_(s32) = G_AND %x, %one
224    ; CHECK: %cmp:_(s64) = G_ZEXT %known_zero_or_one(s32)
225    ; CHECK: $x0 = COPY %cmp(s64)
226    ; CHECK: RET_ReallyLR implicit $x0
227    %x:_(s32) = COPY $w0
228    %one:_(s32) = G_CONSTANT i32 1
229    %known_zero_or_one:_(s32) = G_AND %x, %one
230    %zero:_(s32) = G_CONSTANT i32 0
231    %cmp:_(s64) = G_ICMP intpred(ne), %known_zero_or_one(s32), %zero
232    $x0 = COPY %cmp(s64)
233    RET_ReallyLR implicit $x0
234