blob: 6a020470f379d1599f016ef4af9dc43fed152709 [file] [log] [blame]
Duncan Sandsc038a782012-06-12 14:33:56 +00001; 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}