• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -reassociate -S | FileCheck %s
2
3; Tests involving repeated operations on the same value.
4
5define i8 @nilpotent(i8 %x) {
6; CHECK: @nilpotent
7  %tmp = xor i8 %x, %x
8  ret i8 %tmp
9; CHECK: ret i8 0
10}
11
12define i2 @idempotent(i2 %x) {
13; CHECK: @idempotent
14  %tmp1 = and i2 %x, %x
15  %tmp2 = and i2 %tmp1, %x
16  %tmp3 = and i2 %tmp2, %x
17  ret i2 %tmp3
18; CHECK: ret i2 %x
19}
20
21define i2 @add(i2 %x) {
22; CHECK: @add
23  %tmp1 = add i2 %x, %x
24  %tmp2 = add i2 %tmp1, %x
25  %tmp3 = add i2 %tmp2, %x
26  ret i2 %tmp3
27; CHECK: ret i2 0
28}
29
30define i2 @cst_add() {
31; CHECK: @cst_add
32  %tmp1 = add i2 1, 1
33  %tmp2 = add i2 %tmp1, 1
34  ret i2 %tmp2
35; CHECK: ret i2 -1
36}
37
38define i8 @cst_mul() {
39; CHECK: @cst_mul
40  %tmp1 = mul i8 3, 3
41  %tmp2 = mul i8 %tmp1, 3
42  %tmp3 = mul i8 %tmp2, 3
43  %tmp4 = mul i8 %tmp3, 3
44  ret i8 %tmp4
45; CHECK: ret i8 -13
46}
47
48define i3 @foo3x5(i3 %x) {
49; Can be done with two multiplies.
50; CHECK: @foo3x5
51; CHECK-NEXT: mul
52; CHECK-NEXT: mul
53; CHECK-NEXT: ret
54  %tmp1 = mul i3 %x, %x
55  %tmp2 = mul i3 %tmp1, %x
56  %tmp3 = mul i3 %tmp2, %x
57  %tmp4 = mul i3 %tmp3, %x
58  ret i3 %tmp4
59}
60
61define i3 @foo3x6(i3 %x) {
62; Can be done with two multiplies.
63; CHECK: @foo3x6
64; CHECK-NEXT: mul
65; CHECK-NEXT: mul
66; CHECK-NEXT: ret
67  %tmp1 = mul i3 %x, %x
68  %tmp2 = mul i3 %tmp1, %x
69  %tmp3 = mul i3 %tmp2, %x
70  %tmp4 = mul i3 %tmp3, %x
71  %tmp5 = mul i3 %tmp4, %x
72  ret i3 %tmp5
73}
74
75define i3 @foo3x7(i3 %x) {
76; Can be done with two multiplies.
77; CHECK: @foo3x7
78; CHECK-NEXT: mul
79; CHECK-NEXT: mul
80; CHECK-NEXT: ret
81  %tmp1 = mul i3 %x, %x
82  %tmp2 = mul i3 %tmp1, %x
83  %tmp3 = mul i3 %tmp2, %x
84  %tmp4 = mul i3 %tmp3, %x
85  %tmp5 = mul i3 %tmp4, %x
86  %tmp6 = mul i3 %tmp5, %x
87  ret i3 %tmp6
88}
89
90define i4 @foo4x8(i4 %x) {
91; Can be done with two multiplies.
92; CHECK: @foo4x8
93; CHECK-NEXT: mul
94; CHECK-NEXT: mul
95; CHECK-NEXT: ret
96  %tmp1 = mul i4 %x, %x
97  %tmp2 = mul i4 %tmp1, %x
98  %tmp3 = mul i4 %tmp2, %x
99  %tmp4 = mul i4 %tmp3, %x
100  %tmp5 = mul i4 %tmp4, %x
101  %tmp6 = mul i4 %tmp5, %x
102  %tmp7 = mul i4 %tmp6, %x
103  ret i4 %tmp7
104}
105
106define i4 @foo4x9(i4 %x) {
107; Can be done with three multiplies.
108; CHECK: @foo4x9
109; CHECK-NEXT: mul
110; CHECK-NEXT: mul
111; CHECK-NEXT: mul
112; CHECK-NEXT: ret
113  %tmp1 = mul i4 %x, %x
114  %tmp2 = mul i4 %tmp1, %x
115  %tmp3 = mul i4 %tmp2, %x
116  %tmp4 = mul i4 %tmp3, %x
117  %tmp5 = mul i4 %tmp4, %x
118  %tmp6 = mul i4 %tmp5, %x
119  %tmp7 = mul i4 %tmp6, %x
120  %tmp8 = mul i4 %tmp7, %x
121  ret i4 %tmp8
122}
123
124define i4 @foo4x10(i4 %x) {
125; Can be done with three multiplies.
126; CHECK: @foo4x10
127; CHECK-NEXT: mul
128; CHECK-NEXT: mul
129; CHECK-NEXT: mul
130; CHECK-NEXT: ret
131  %tmp1 = mul i4 %x, %x
132  %tmp2 = mul i4 %tmp1, %x
133  %tmp3 = mul i4 %tmp2, %x
134  %tmp4 = mul i4 %tmp3, %x
135  %tmp5 = mul i4 %tmp4, %x
136  %tmp6 = mul i4 %tmp5, %x
137  %tmp7 = mul i4 %tmp6, %x
138  %tmp8 = mul i4 %tmp7, %x
139  %tmp9 = mul i4 %tmp8, %x
140  ret i4 %tmp9
141}
142
143define i4 @foo4x11(i4 %x) {
144; Can be done with four multiplies.
145; CHECK: @foo4x11
146; CHECK-NEXT: mul
147; CHECK-NEXT: mul
148; CHECK-NEXT: mul
149; CHECK-NEXT: mul
150; CHECK-NEXT: ret
151  %tmp1 = mul i4 %x, %x
152  %tmp2 = mul i4 %tmp1, %x
153  %tmp3 = mul i4 %tmp2, %x
154  %tmp4 = mul i4 %tmp3, %x
155  %tmp5 = mul i4 %tmp4, %x
156  %tmp6 = mul i4 %tmp5, %x
157  %tmp7 = mul i4 %tmp6, %x
158  %tmp8 = mul i4 %tmp7, %x
159  %tmp9 = mul i4 %tmp8, %x
160  %tmp10 = mul i4 %tmp9, %x
161  ret i4 %tmp10
162}
163
164define i4 @foo4x12(i4 %x) {
165; Can be done with two multiplies.
166; CHECK: @foo4x12
167; CHECK-NEXT: mul
168; CHECK-NEXT: mul
169; CHECK-NEXT: ret
170  %tmp1 = mul i4 %x, %x
171  %tmp2 = mul i4 %tmp1, %x
172  %tmp3 = mul i4 %tmp2, %x
173  %tmp4 = mul i4 %tmp3, %x
174  %tmp5 = mul i4 %tmp4, %x
175  %tmp6 = mul i4 %tmp5, %x
176  %tmp7 = mul i4 %tmp6, %x
177  %tmp8 = mul i4 %tmp7, %x
178  %tmp9 = mul i4 %tmp8, %x
179  %tmp10 = mul i4 %tmp9, %x
180  %tmp11 = mul i4 %tmp10, %x
181  ret i4 %tmp11
182}
183
184define i4 @foo4x13(i4 %x) {
185; Can be done with three multiplies.
186; CHECK: @foo4x13
187; CHECK-NEXT: mul
188; CHECK-NEXT: mul
189; CHECK-NEXT: mul
190; CHECK-NEXT: ret
191  %tmp1 = mul i4 %x, %x
192  %tmp2 = mul i4 %tmp1, %x
193  %tmp3 = mul i4 %tmp2, %x
194  %tmp4 = mul i4 %tmp3, %x
195  %tmp5 = mul i4 %tmp4, %x
196  %tmp6 = mul i4 %tmp5, %x
197  %tmp7 = mul i4 %tmp6, %x
198  %tmp8 = mul i4 %tmp7, %x
199  %tmp9 = mul i4 %tmp8, %x
200  %tmp10 = mul i4 %tmp9, %x
201  %tmp11 = mul i4 %tmp10, %x
202  %tmp12 = mul i4 %tmp11, %x
203  ret i4 %tmp12
204}
205
206define i4 @foo4x14(i4 %x) {
207; Can be done with three multiplies.
208; CHECK: @foo4x14
209; CHECK-NEXT: mul
210; CHECK-NEXT: mul
211; CHECK-NEXT: mul
212; CHECK-NEXT: ret
213  %tmp1 = mul i4 %x, %x
214  %tmp2 = mul i4 %tmp1, %x
215  %tmp3 = mul i4 %tmp2, %x
216  %tmp4 = mul i4 %tmp3, %x
217  %tmp5 = mul i4 %tmp4, %x
218  %tmp6 = mul i4 %tmp5, %x
219  %tmp7 = mul i4 %tmp6, %x
220  %tmp8 = mul i4 %tmp7, %x
221  %tmp9 = mul i4 %tmp8, %x
222  %tmp10 = mul i4 %tmp9, %x
223  %tmp11 = mul i4 %tmp10, %x
224  %tmp12 = mul i4 %tmp11, %x
225  %tmp13 = mul i4 %tmp12, %x
226  ret i4 %tmp13
227}
228
229define i4 @foo4x15(i4 %x) {
230; Can be done with four multiplies.
231; CHECK: @foo4x15
232; CHECK-NEXT: mul
233; CHECK-NEXT: mul
234; CHECK-NEXT: mul
235; CHECK-NEXT: mul
236; CHECK-NEXT: ret
237  %tmp1 = mul i4 %x, %x
238  %tmp2 = mul i4 %tmp1, %x
239  %tmp3 = mul i4 %tmp2, %x
240  %tmp4 = mul i4 %tmp3, %x
241  %tmp5 = mul i4 %tmp4, %x
242  %tmp6 = mul i4 %tmp5, %x
243  %tmp7 = mul i4 %tmp6, %x
244  %tmp8 = mul i4 %tmp7, %x
245  %tmp9 = mul i4 %tmp8, %x
246  %tmp10 = mul i4 %tmp9, %x
247  %tmp11 = mul i4 %tmp10, %x
248  %tmp12 = mul i4 %tmp11, %x
249  %tmp13 = mul i4 %tmp12, %x
250  %tmp14 = mul i4 %tmp13, %x
251  ret i4 %tmp14
252}
253