1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2 ; RUN: opt < %s -passes=reassociate -S | FileCheck %s
4 ; Tests involving repeated operations on the same value.
6 define i8 @nilpotent(i8 %x) {
7 ; CHECK-LABEL: define i8 @nilpotent(
8 ; CHECK-SAME: i8 [[X:%.*]]) {
15 define i2 @idempotent(i2 %x) {
16 ; CHECK-LABEL: define i2 @idempotent(
17 ; CHECK-SAME: i2 [[X:%.*]]) {
18 ; CHECK-NEXT: ret i2 [[X]]
21 %tmp2 = and i2 %tmp1, %x
22 %tmp3 = and i2 %tmp2, %x
26 define i2 @add(i2 %x) {
27 ; CHECK-LABEL: define i2 @add(
28 ; CHECK-SAME: i2 [[X:%.*]]) {
29 ; CHECK-NEXT: ret i2 0
32 %tmp2 = add i2 %tmp1, %x
33 %tmp3 = add i2 %tmp2, %x
37 define i2 @cst_add() {
38 ; CHECK-LABEL: define i2 @cst_add() {
39 ; CHECK-NEXT: ret i2 -1
42 %tmp2 = add i2 %tmp1, 1
46 define i8 @cst_mul() {
47 ; CHECK-LABEL: define i8 @cst_mul() {
48 ; CHECK-NEXT: ret i8 -13
51 %tmp2 = mul i8 %tmp1, 3
52 %tmp3 = mul i8 %tmp2, 3
53 %tmp4 = mul i8 %tmp3, 3
57 define i3 @foo3x5(i3 %x) {
58 ; Can be done with two multiplies.
59 ; CHECK-LABEL: define i3 @foo3x5(
60 ; CHECK-SAME: i3 [[X:%.*]]) {
61 ; CHECK-NEXT: [[TMP3:%.*]] = mul i3 [[X]], [[X]]
62 ; CHECK-NEXT: [[TMP4:%.*]] = mul i3 [[TMP3]], [[X]]
63 ; CHECK-NEXT: [[TMP5:%.*]] = mul i3 [[TMP4]], [[TMP3]]
64 ; CHECK-NEXT: ret i3 [[TMP5]]
67 %tmp2 = mul i3 %tmp1, %x
68 %tmp3 = mul i3 %tmp2, %x
69 %tmp4 = mul i3 %tmp3, %x
73 define i3 @foo3x5_nsw(i3 %x) {
74 ; Can be done with two multiplies.
75 ; CHECK-LABEL: define i3 @foo3x5_nsw(
76 ; CHECK-SAME: i3 [[X:%.*]]) {
77 ; CHECK-NEXT: [[TMP3:%.*]] = mul i3 [[X]], [[X]]
78 ; CHECK-NEXT: [[TMP2:%.*]] = mul i3 [[TMP3]], [[X]]
79 ; CHECK-NEXT: [[TMP4:%.*]] = mul i3 [[TMP2]], [[TMP3]]
80 ; CHECK-NEXT: ret i3 [[TMP4]]
83 %tmp2 = mul i3 %tmp1, %x
84 %tmp3 = mul i3 %tmp2, %x
85 %tmp4 = mul nsw i3 %tmp3, %x
89 define i3 @foo3x6(i3 %x) {
90 ; Can be done with two multiplies.
91 ; CHECK-LABEL: define i3 @foo3x6(
92 ; CHECK-SAME: i3 [[X:%.*]]) {
93 ; CHECK-NEXT: [[TMP1:%.*]] = mul i3 [[X]], [[X]]
94 ; CHECK-NEXT: [[TMP3:%.*]] = mul i3 [[TMP1]], [[X]]
95 ; CHECK-NEXT: [[TMP2:%.*]] = mul i3 [[TMP3]], [[TMP3]]
96 ; CHECK-NEXT: ret i3 [[TMP2]]
99 %tmp2 = mul i3 %tmp1, %x
100 %tmp3 = mul i3 %tmp2, %x
101 %tmp4 = mul i3 %tmp3, %x
102 %tmp5 = mul i3 %tmp4, %x
106 define i3 @foo3x7(i3 %x) {
107 ; Can be done with two multiplies.
108 ; CHECK-LABEL: define i3 @foo3x7(
109 ; CHECK-SAME: i3 [[X:%.*]]) {
110 ; CHECK-NEXT: [[TMP5:%.*]] = mul i3 [[X]], [[X]]
111 ; CHECK-NEXT: [[TMP6:%.*]] = mul i3 [[TMP5]], [[X]]
112 ; CHECK-NEXT: [[TMP3:%.*]] = mul i3 [[TMP6]], [[X]]
113 ; CHECK-NEXT: [[TMP7:%.*]] = mul i3 [[TMP3]], [[TMP6]]
114 ; CHECK-NEXT: ret i3 [[TMP7]]
116 %tmp1 = mul i3 %x, %x
117 %tmp2 = mul i3 %tmp1, %x
118 %tmp3 = mul i3 %tmp2, %x
119 %tmp4 = mul i3 %tmp3, %x
120 %tmp5 = mul i3 %tmp4, %x
121 %tmp6 = mul i3 %tmp5, %x
125 define i4 @foo4x8(i4 %x) {
126 ; Can be done with two multiplies.
127 ; CHECK-LABEL: define i4 @foo4x8(
128 ; CHECK-SAME: i4 [[X:%.*]]) {
129 ; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]]
130 ; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP1]], [[TMP1]]
131 ; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP4]], [[TMP4]]
132 ; CHECK-NEXT: ret i4 [[TMP3]]
134 %tmp1 = mul i4 %x, %x
135 %tmp2 = mul i4 %tmp1, %x
136 %tmp3 = mul i4 %tmp2, %x
137 %tmp4 = mul i4 %tmp3, %x
138 %tmp5 = mul i4 %tmp4, %x
139 %tmp6 = mul i4 %tmp5, %x
140 %tmp7 = mul i4 %tmp6, %x
144 define i4 @foo4x9(i4 %x) {
145 ; Can be done with three multiplies.
146 ; CHECK-LABEL: define i4 @foo4x9(
147 ; CHECK-SAME: i4 [[X:%.*]]) {
148 ; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]]
149 ; CHECK-NEXT: [[TMP2:%.*]] = mul i4 [[TMP1]], [[TMP1]]
150 ; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP2]], [[X]]
151 ; CHECK-NEXT: [[TMP8:%.*]] = mul i4 [[TMP3]], [[TMP2]]
152 ; CHECK-NEXT: ret i4 [[TMP8]]
154 %tmp1 = mul i4 %x, %x
155 %tmp2 = mul i4 %tmp1, %x
156 %tmp3 = mul i4 %tmp2, %x
157 %tmp4 = mul i4 %tmp3, %x
158 %tmp5 = mul i4 %tmp4, %x
159 %tmp6 = mul i4 %tmp5, %x
160 %tmp7 = mul i4 %tmp6, %x
161 %tmp8 = mul i4 %tmp7, %x
165 define i4 @foo4x10(i4 %x) {
166 ; Can be done with three multiplies.
167 ; CHECK-LABEL: define i4 @foo4x10(
168 ; CHECK-SAME: i4 [[X:%.*]]) {
169 ; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]]
170 ; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP1]], [[TMP1]]
171 ; CHECK-NEXT: [[TMP2:%.*]] = mul i4 [[TMP4]], [[X]]
172 ; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP2]], [[TMP2]]
173 ; CHECK-NEXT: ret i4 [[TMP3]]
175 %tmp1 = mul i4 %x, %x
176 %tmp2 = mul i4 %tmp1, %x
177 %tmp3 = mul i4 %tmp2, %x
178 %tmp4 = mul i4 %tmp3, %x
179 %tmp5 = mul i4 %tmp4, %x
180 %tmp6 = mul i4 %tmp5, %x
181 %tmp7 = mul i4 %tmp6, %x
182 %tmp8 = mul i4 %tmp7, %x
183 %tmp9 = mul i4 %tmp8, %x
187 define i4 @foo4x11(i4 %x) {
188 ; Can be done with four multiplies.
189 ; CHECK-LABEL: define i4 @foo4x11(
190 ; CHECK-SAME: i4 [[X:%.*]]) {
191 ; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]]
192 ; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP1]], [[TMP1]]
193 ; CHECK-NEXT: [[TMP2:%.*]] = mul i4 [[TMP4]], [[X]]
194 ; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP2]], [[X]]
195 ; CHECK-NEXT: [[TMP10:%.*]] = mul i4 [[TMP3]], [[TMP2]]
196 ; CHECK-NEXT: ret i4 [[TMP10]]
198 %tmp1 = mul i4 %x, %x
199 %tmp2 = mul i4 %tmp1, %x
200 %tmp3 = mul i4 %tmp2, %x
201 %tmp4 = mul i4 %tmp3, %x
202 %tmp5 = mul i4 %tmp4, %x
203 %tmp6 = mul i4 %tmp5, %x
204 %tmp7 = mul i4 %tmp6, %x
205 %tmp8 = mul i4 %tmp7, %x
206 %tmp9 = mul i4 %tmp8, %x
207 %tmp10 = mul i4 %tmp9, %x
211 define i4 @foo4x12(i4 %x) {
212 ; Can be done with two multiplies.
213 ; CHECK-LABEL: define i4 @foo4x12(
214 ; CHECK-SAME: i4 [[X:%.*]]) {
215 ; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]]
216 ; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP1]], [[X]]
217 ; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP4]], [[TMP4]]
218 ; CHECK-NEXT: [[TMP2:%.*]] = mul i4 [[TMP3]], [[TMP3]]
219 ; CHECK-NEXT: ret i4 [[TMP2]]
221 %tmp1 = mul i4 %x, %x
222 %tmp2 = mul i4 %tmp1, %x
223 %tmp3 = mul i4 %tmp2, %x
224 %tmp4 = mul i4 %tmp3, %x
225 %tmp5 = mul i4 %tmp4, %x
226 %tmp6 = mul i4 %tmp5, %x
227 %tmp7 = mul i4 %tmp6, %x
228 %tmp8 = mul i4 %tmp7, %x
229 %tmp9 = mul i4 %tmp8, %x
230 %tmp10 = mul i4 %tmp9, %x
231 %tmp11 = mul i4 %tmp10, %x
235 define i4 @foo4x13(i4 %x) {
236 ; Can be done with three multiplies.
237 ; CHECK-LABEL: define i4 @foo4x13(
238 ; CHECK-SAME: i4 [[X:%.*]]) {
239 ; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]]
240 ; CHECK-NEXT: [[TMP2:%.*]] = mul i4 [[TMP1]], [[X]]
241 ; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP2]], [[TMP2]]
242 ; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP3]], [[X]]
243 ; CHECK-NEXT: [[TMP12:%.*]] = mul i4 [[TMP4]], [[TMP3]]
244 ; CHECK-NEXT: ret i4 [[TMP12]]
246 %tmp1 = mul i4 %x, %x
247 %tmp2 = mul i4 %tmp1, %x
248 %tmp3 = mul i4 %tmp2, %x
249 %tmp4 = mul i4 %tmp3, %x
250 %tmp5 = mul i4 %tmp4, %x
251 %tmp6 = mul i4 %tmp5, %x
252 %tmp7 = mul i4 %tmp6, %x
253 %tmp8 = mul i4 %tmp7, %x
254 %tmp9 = mul i4 %tmp8, %x
255 %tmp10 = mul i4 %tmp9, %x
256 %tmp11 = mul i4 %tmp10, %x
257 %tmp12 = mul i4 %tmp11, %x
261 define i4 @foo4x14(i4 %x) {
262 ; Can be done with three multiplies.
263 ; CHECK-LABEL: define i4 @foo4x14(
264 ; CHECK-SAME: i4 [[X:%.*]]) {
265 ; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]]
266 ; CHECK-NEXT: [[TMP6:%.*]] = mul i4 [[TMP1]], [[X]]
267 ; CHECK-NEXT: [[TMP7:%.*]] = mul i4 [[TMP6]], [[TMP6]]
268 ; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP7]], [[X]]
269 ; CHECK-NEXT: [[TMP5:%.*]] = mul i4 [[TMP4]], [[TMP4]]
270 ; CHECK-NEXT: ret i4 [[TMP5]]
272 %tmp1 = mul i4 %x, %x
273 %tmp2 = mul i4 %tmp1, %x
274 %tmp3 = mul i4 %tmp2, %x
275 %tmp4 = mul i4 %tmp3, %x
276 %tmp5 = mul i4 %tmp4, %x
277 %tmp6 = mul i4 %tmp5, %x
278 %tmp7 = mul i4 %tmp6, %x
279 %tmp8 = mul i4 %tmp7, %x
280 %tmp9 = mul i4 %tmp8, %x
281 %tmp10 = mul i4 %tmp9, %x
282 %tmp11 = mul i4 %tmp10, %x
283 %tmp12 = mul i4 %tmp11, %x
284 %tmp13 = mul i4 %tmp12, %x
288 define i4 @foo4x15(i4 %x) {
289 ; Can be done with four multiplies.
290 ; CHECK-LABEL: define i4 @foo4x15(
291 ; CHECK-SAME: i4 [[X:%.*]]) {
292 ; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]]
293 ; CHECK-NEXT: [[TMP6:%.*]] = mul i4 [[TMP1]], [[X]]
294 ; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP6]], [[TMP6]]
295 ; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP3]], [[X]]
296 ; CHECK-NEXT: [[TMP5:%.*]] = mul i4 [[TMP4]], [[X]]
297 ; CHECK-NEXT: [[TMP14:%.*]] = mul i4 [[TMP5]], [[TMP4]]
298 ; CHECK-NEXT: ret i4 [[TMP14]]
300 %tmp1 = mul i4 %x, %x
301 %tmp2 = mul i4 %tmp1, %x
302 %tmp3 = mul i4 %tmp2, %x
303 %tmp4 = mul i4 %tmp3, %x
304 %tmp5 = mul i4 %tmp4, %x
305 %tmp6 = mul i4 %tmp5, %x
306 %tmp7 = mul i4 %tmp6, %x
307 %tmp8 = mul i4 %tmp7, %x
308 %tmp9 = mul i4 %tmp8, %x
309 %tmp10 = mul i4 %tmp9, %x
310 %tmp11 = mul i4 %tmp10, %x
311 %tmp12 = mul i4 %tmp11, %x
312 %tmp13 = mul i4 %tmp12, %x
313 %tmp14 = mul i4 %tmp13, %x