1; RUN: opt -instsimplify -S < %s | FileCheck %s
2
3; @test0
4; CHECK: ret i64 undef
5define i64 @test0() {
6  %r = mul i64 undef, undef
7  ret i64 %r
8}
9
10; @test1
11; CHECK: ret i64 undef
12define i64 @test1() {
13  %r = mul i64 3, undef
14  ret i64 %r
15}
16
17; @test2
18; CHECK: ret i64 undef
19define i64 @test2() {
20  %r = mul i64 undef, 3
21  ret i64 %r
22}
23
24; @test3
25; CHECK: ret i64 0
26define i64 @test3() {
27  %r = mul i64 undef, 6
28  ret i64 %r
29}
30
31; @test4
32; CHECK: ret i64 0
33define i64 @test4() {
34  %r = mul i64 6, undef
35  ret i64 %r
36}
37
38; @test5
39; CHECK: ret i64 undef
40define i64 @test5() {
41  %r = and i64 undef, undef
42  ret i64 %r
43}
44
45; @test6
46; CHECK: ret i64 undef
47define i64 @test6() {
48  %r = or i64 undef, undef
49  ret i64 %r
50}
51
52; @test7
53; CHECK: ret i64 undef
54define i64 @test7() {
55  %r = udiv i64 undef, 1
56  ret i64 %r
57}
58
59; @test8
60; CHECK: ret i64 undef
61define i64 @test8() {
62  %r = sdiv i64 undef, 1
63  ret i64 %r
64}
65
66; @test9
67; CHECK: ret i64 0
68define i64 @test9() {
69  %r = urem i64 undef, 1
70  ret i64 %r
71}
72
73; @test10
74; CHECK: ret i64 0
75define i64 @test10() {
76  %r = srem i64 undef, 1
77  ret i64 %r
78}
79
80; @test11
81; CHECK: ret i64 undef
82define i64 @test11() {
83  %r = shl i64 undef, undef
84  ret i64 %r
85}
86
87; @test11b
88; CHECK: ret i64 undef
89define i64 @test11b(i64 %a) {
90  %r = shl i64 %a, undef
91  ret i64 %r
92}
93
94; @test12
95; CHECK: ret i64 undef
96define i64 @test12() {
97  %r = ashr i64 undef, undef
98  ret i64 %r
99}
100
101; @test12b
102; CHECK: ret i64 undef
103define i64 @test12b(i64 %a) {
104  %r = ashr i64 %a, undef
105  ret i64 %r
106}
107
108; @test13
109; CHECK: ret i64 undef
110define i64 @test13() {
111  %r = lshr i64 undef, undef
112  ret i64 %r
113}
114
115; @test13b
116; CHECK: ret i64 undef
117define i64 @test13b(i64 %a) {
118  %r = lshr i64 %a, undef
119  ret i64 %r
120}
121
122; @test14
123; CHECK: ret i1 undef
124define i1 @test14() {
125  %r = icmp slt i64 undef, undef
126  ret i1 %r
127}
128
129; @test15
130; CHECK: ret i1 undef
131define i1 @test15() {
132  %r = icmp ult i64 undef, undef
133  ret i1 %r
134}
135
136; @test16
137; CHECK: ret i64 undef
138define i64 @test16(i64 %a) {
139  %r = select i1 undef, i64 %a, i64 undef
140  ret i64 %r
141}
142
143; @test17
144; CHECK: ret i64 undef
145define i64 @test17(i64 %a) {
146  %r = select i1 undef, i64 undef, i64 %a
147  ret i64 %r
148}
149
150; @test18
151; CHECK: ret i64 undef
152define i64 @test18(i64 %a) {
153  %r = call i64 (i64) undef(i64 %a)
154  ret i64 %r
155}
156
157; CHECK-LABEL: @test19
158; CHECK: ret <4 x i8> undef
159define <4 x i8> @test19(<4 x i8> %a) {
160  %b = shl <4 x i8> %a, <i8 8, i8 9, i8 undef, i8 -1>
161  ret <4 x i8> %b
162}
163
164; CHECK-LABEL: @test20
165; CHECK: ret i32 undef
166define i32 @test20(i32 %a) {
167  %b = udiv i32 %a, 0
168  ret i32 %b
169}
170
171; CHECK-LABEL: @test21
172; CHECK: ret i32 undef
173define i32 @test21(i32 %a) {
174  %b = sdiv i32 %a, 0
175  ret i32 %b
176}
177
178; CHECK-LABEL: @test22
179; CHECK: ret i32 undef
180define i32 @test22(i32 %a) {
181  %b = ashr exact i32 undef, %a
182  ret i32 %b
183}
184
185; CHECK-LABEL: @test23
186; CHECK: ret i32 undef
187define i32 @test23(i32 %a) {
188  %b = lshr exact i32 undef, %a
189  ret i32 %b
190}
191
192; CHECK-LABEL: @test24
193; CHECK: ret i32 undef
194define i32 @test24() {
195  %b = udiv i32 undef, 0
196  ret i32 %b
197}
198
199; CHECK-LABEL: @test25
200; CHECK: ret i32 undef
201define i32 @test25() {
202  %b = lshr i32 0, undef
203  ret i32 %b
204}
205
206; CHECK-LABEL: @test26
207; CHECK: ret i32 undef
208define i32 @test26() {
209  %b = ashr i32 0, undef
210  ret i32 %b
211}
212
213; CHECK-LABEL: @test27
214; CHECK: ret i32 undef
215define i32 @test27() {
216  %b = shl i32 0, undef
217  ret i32 %b
218}
219
220; CHECK-LABEL: @test28
221; CHECK: ret i32 undef
222define i32 @test28(i32 %a) {
223  %b = shl nsw i32 undef, %a
224  ret i32 %b
225}
226
227; CHECK-LABEL: @test29
228; CHECK: ret i32 undef
229define i32 @test29(i32 %a) {
230  %b = shl nuw i32 undef, %a
231  ret i32 %b
232}
233
234; CHECK-LABEL: @test30
235; CHECK: ret i32 undef
236define i32 @test30(i32 %a) {
237  %b = shl nsw nuw i32 undef, %a
238  ret i32 %b
239}
240
241; CHECK-LABEL: @test31
242; CHECK: ret i32 0
243define i32 @test31(i32 %a) {
244  %b = shl i32 undef, %a
245  ret i32 %b
246}
247
248; CHECK-LABEL: @test32
249; CHECK: ret i32 undef
250define i32 @test32(i32 %a) {
251  %b = shl i32 undef, 0
252  ret i32 %b
253}
254
255; CHECK-LABEL: @test33
256; CHECK: ret i32 undef
257define i32 @test33(i32 %a) {
258  %b = ashr i32 undef, 0
259  ret i32 %b
260}
261
262; CHECK-LABEL: @test34
263; CHECK: ret i32 undef
264define i32 @test34(i32 %a) {
265  %b = lshr i32 undef, 0
266  ret i32 %b
267}
268
269; CHECK-LABEL: @test35
270; CHECK: ret i32 undef
271define i32 @test35(<4 x i32> %V) {
272  %b = extractelement <4 x i32> %V, i32 4
273  ret i32 %b
274}
275
276; CHECK-LABEL: @test36
277; CHECK: ret i32 undef
278define i32 @test36(i32 %V) {
279  %b = extractelement <4 x i32> undef, i32 %V
280  ret i32 %b
281}
282