Mercurial > hg > CbC > CbC_llvm
comparison test/Transforms/InstCombine/canonicalize-constant-low-bit-mask-and-icmp-ugt-to-icmp-ugt.ll @ 147:c2174574ed3a
LLVM 10
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Aug 2019 16:55:33 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
134:3a76565eade5 | 147:c2174574ed3a |
---|---|
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | |
2 ; RUN: opt < %s -instcombine -S | FileCheck %s | |
3 | |
4 ; https://bugs.llvm.org/show_bug.cgi?id=38123 | |
5 | |
6 ; Pattern: | |
7 ; x u> x & C | |
8 ; Should be transformed into: | |
9 ; x u> C | |
10 ; Iff: isPowerOf2(C + 1) | |
11 ; C can be 0 and -1. | |
12 | |
13 declare i8 @gen8() | |
14 declare <2 x i8> @gen2x8() | |
15 declare <3 x i8> @gen3x8() | |
16 | |
17 ; ============================================================================ ; | |
18 ; Basic positive tests | |
19 ; ============================================================================ ; | |
20 | |
21 define i1 @p0() { | |
22 ; CHECK-LABEL: @p0( | |
23 ; CHECK-NEXT: [[X:%.*]] = call i8 @gen8() | |
24 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i8 [[X]], 3 | |
25 ; CHECK-NEXT: ret i1 [[TMP1]] | |
26 ; | |
27 %x = call i8 @gen8() | |
28 %tmp0 = and i8 %x, 3 | |
29 %ret = icmp ugt i8 %x, %tmp0 | |
30 ret i1 %ret | |
31 } | |
32 | |
33 define i1 @pv(i8 %y) { | |
34 ; CHECK-LABEL: @pv( | |
35 ; CHECK-NEXT: [[X:%.*]] = call i8 @gen8() | |
36 ; CHECK-NEXT: [[TMP0:%.*]] = lshr i8 -1, [[Y:%.*]] | |
37 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i8 [[X]], [[TMP0]] | |
38 ; CHECK-NEXT: ret i1 [[TMP1]] | |
39 ; | |
40 %x = call i8 @gen8() | |
41 %tmp0 = lshr i8 -1, %y | |
42 %tmp1 = and i8 %tmp0, %x | |
43 %ret = icmp ugt i8 %x, %tmp1 | |
44 ret i1 %ret | |
45 } | |
46 | |
47 ; ============================================================================ ; | |
48 ; Vector tests | |
49 ; ============================================================================ ; | |
50 | |
51 define <2 x i1> @p1_vec_splat() { | |
52 ; CHECK-LABEL: @p1_vec_splat( | |
53 ; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @gen2x8() | |
54 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt <2 x i8> [[X]], <i8 3, i8 3> | |
55 ; CHECK-NEXT: ret <2 x i1> [[TMP1]] | |
56 ; | |
57 %x = call <2 x i8> @gen2x8() | |
58 %tmp0 = and <2 x i8> %x, <i8 3, i8 3> | |
59 %ret = icmp ugt <2 x i8> %x, %tmp0 | |
60 ret <2 x i1> %ret | |
61 } | |
62 | |
63 define <2 x i1> @p2_vec_nonsplat() { | |
64 ; CHECK-LABEL: @p2_vec_nonsplat( | |
65 ; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @gen2x8() | |
66 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt <2 x i8> [[X]], <i8 3, i8 15> | |
67 ; CHECK-NEXT: ret <2 x i1> [[TMP1]] | |
68 ; | |
69 %x = call <2 x i8> @gen2x8() | |
70 %tmp0 = and <2 x i8> %x, <i8 3, i8 15> ; doesn't have to be splat. | |
71 %ret = icmp ugt <2 x i8> %x, %tmp0 | |
72 ret <2 x i1> %ret | |
73 } | |
74 | |
75 define <2 x i1> @p2_vec_nonsplat_edgecase0() { | |
76 ; CHECK-LABEL: @p2_vec_nonsplat_edgecase0( | |
77 ; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @gen2x8() | |
78 ; CHECK-NEXT: [[TMP0:%.*]] = and <2 x i8> [[X]], <i8 3, i8 0> | |
79 ; CHECK-NEXT: [[RET:%.*]] = icmp ugt <2 x i8> [[X]], [[TMP0]] | |
80 ; CHECK-NEXT: ret <2 x i1> [[RET]] | |
81 ; | |
82 %x = call <2 x i8> @gen2x8() | |
83 %tmp0 = and <2 x i8> %x, <i8 3, i8 0> | |
84 %ret = icmp ugt <2 x i8> %x, %tmp0 | |
85 ret <2 x i1> %ret | |
86 } | |
87 define <2 x i1> @p2_vec_nonsplat_edgecase1() { | |
88 ; CHECK-LABEL: @p2_vec_nonsplat_edgecase1( | |
89 ; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @gen2x8() | |
90 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt <2 x i8> [[X]], <i8 3, i8 -1> | |
91 ; CHECK-NEXT: ret <2 x i1> [[TMP1]] | |
92 ; | |
93 %x = call <2 x i8> @gen2x8() | |
94 %tmp0 = and <2 x i8> %x, <i8 3, i8 -1> | |
95 %ret = icmp ugt <2 x i8> %x, %tmp0 | |
96 ret <2 x i1> %ret | |
97 } | |
98 | |
99 define <3 x i1> @p3_vec_splat_undef() { | |
100 ; CHECK-LABEL: @p3_vec_splat_undef( | |
101 ; CHECK-NEXT: [[X:%.*]] = call <3 x i8> @gen3x8() | |
102 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt <3 x i8> [[X]], <i8 3, i8 undef, i8 3> | |
103 ; CHECK-NEXT: ret <3 x i1> [[TMP1]] | |
104 ; | |
105 %x = call <3 x i8> @gen3x8() | |
106 %tmp0 = and <3 x i8> %x, <i8 3, i8 undef, i8 3> | |
107 %ret = icmp ugt <3 x i8> %x, %tmp0 | |
108 ret <3 x i1> %ret | |
109 } | |
110 | |
111 ; ============================================================================ ; | |
112 ; Commutativity tests. | |
113 ; ============================================================================ ; | |
114 | |
115 define i1 @c0(i8 %x) { | |
116 ; CHECK-LABEL: @c0( | |
117 ; CHECK-NEXT: ret i1 false | |
118 ; | |
119 %tmp0 = and i8 %x, 3 | |
120 %ret = icmp ugt i8 %tmp0, %x ; swapped order | |
121 ret i1 %ret | |
122 } | |
123 | |
124 ; ============================================================================ ; | |
125 ; Commutativity tests with variable | |
126 ; ============================================================================ ; | |
127 | |
128 define i1 @cv0(i8 %y) { | |
129 ; CHECK-LABEL: @cv0( | |
130 ; CHECK-NEXT: [[X:%.*]] = call i8 @gen8() | |
131 ; CHECK-NEXT: [[TMP0:%.*]] = lshr i8 -1, [[Y:%.*]] | |
132 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i8 [[X]], [[TMP0]] | |
133 ; CHECK-NEXT: ret i1 [[TMP1]] | |
134 ; | |
135 %x = call i8 @gen8() | |
136 %tmp0 = lshr i8 -1, %y | |
137 %tmp1 = and i8 %tmp0, %x ; swapped order | |
138 %ret = icmp ugt i8 %x, %tmp1 | |
139 ret i1 %ret | |
140 } | |
141 | |
142 define i1 @cv1(i8 %y) { | |
143 ; CHECK-LABEL: @cv1( | |
144 ; CHECK-NEXT: [[X:%.*]] = call i8 @gen8() | |
145 ; CHECK-NEXT: ret i1 false | |
146 ; | |
147 %x = call i8 @gen8() | |
148 %tmp0 = lshr i8 -1, %y | |
149 %tmp1 = and i8 %x, %tmp0 | |
150 %ret = icmp ugt i8 %tmp1, %x ; swapped order | |
151 ret i1 %ret | |
152 } | |
153 | |
154 define i1 @cv2(i8 %x, i8 %y) { | |
155 ; CHECK-LABEL: @cv2( | |
156 ; CHECK-NEXT: ret i1 false | |
157 ; | |
158 %tmp0 = lshr i8 -1, %y | |
159 %tmp1 = and i8 %tmp0, %x ; swapped order | |
160 %ret = icmp ugt i8 %tmp1, %x ; swapped order | |
161 ret i1 %ret | |
162 } | |
163 | |
164 ; ============================================================================ ; | |
165 ; One-use tests. We don't care about multi-uses here. | |
166 ; ============================================================================ ; | |
167 | |
168 declare void @use8(i8) | |
169 | |
170 define i1 @oneuse0() { | |
171 ; CHECK-LABEL: @oneuse0( | |
172 ; CHECK-NEXT: [[X:%.*]] = call i8 @gen8() | |
173 ; CHECK-NEXT: [[TMP0:%.*]] = and i8 [[X]], 3 | |
174 ; CHECK-NEXT: call void @use8(i8 [[TMP0]]) | |
175 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i8 [[X]], 3 | |
176 ; CHECK-NEXT: ret i1 [[TMP1]] | |
177 ; | |
178 %x = call i8 @gen8() | |
179 %tmp0 = and i8 %x, 3 | |
180 call void @use8(i8 %tmp0) | |
181 %ret = icmp ugt i8 %x, %tmp0 | |
182 ret i1 %ret | |
183 } | |
184 | |
185 ; ============================================================================ ; | |
186 ; Negative tests | |
187 ; ============================================================================ ; | |
188 | |
189 define i1 @n0() { | |
190 ; CHECK-LABEL: @n0( | |
191 ; CHECK-NEXT: [[X:%.*]] = call i8 @gen8() | |
192 ; CHECK-NEXT: [[TMP0:%.*]] = and i8 [[X]], 4 | |
193 ; CHECK-NEXT: [[RET:%.*]] = icmp ugt i8 [[X]], [[TMP0]] | |
194 ; CHECK-NEXT: ret i1 [[RET]] | |
195 ; | |
196 %x = call i8 @gen8() | |
197 %tmp0 = and i8 %x, 4 ; power-of-two, but invalid. | |
198 %ret = icmp ugt i8 %x, %tmp0 | |
199 ret i1 %ret | |
200 } | |
201 | |
202 define i1 @n1(i8 %y, i8 %notx) { | |
203 ; CHECK-LABEL: @n1( | |
204 ; CHECK-NEXT: [[X:%.*]] = call i8 @gen8() | |
205 ; CHECK-NEXT: [[TMP0:%.*]] = and i8 [[X]], 3 | |
206 ; CHECK-NEXT: [[RET:%.*]] = icmp ugt i8 [[TMP0]], [[NOTX:%.*]] | |
207 ; CHECK-NEXT: ret i1 [[RET]] | |
208 ; | |
209 %x = call i8 @gen8() | |
210 %tmp0 = and i8 %x, 3 | |
211 %ret = icmp ugt i8 %tmp0, %notx ; not %x | |
212 ret i1 %ret | |
213 } | |
214 | |
215 define <2 x i1> @n2() { | |
216 ; CHECK-LABEL: @n2( | |
217 ; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @gen2x8() | |
218 ; CHECK-NEXT: [[TMP0:%.*]] = and <2 x i8> [[X]], <i8 3, i8 16> | |
219 ; CHECK-NEXT: [[RET:%.*]] = icmp ugt <2 x i8> [[X]], [[TMP0]] | |
220 ; CHECK-NEXT: ret <2 x i1> [[RET]] | |
221 ; | |
222 %x = call <2 x i8> @gen2x8() | |
223 %tmp0 = and <2 x i8> %x, <i8 3, i8 16> ; only the first one is valid. | |
224 %ret = icmp ugt <2 x i8> %x, %tmp0 | |
225 ret <2 x i1> %ret | |
226 } |