xref: /llvm-project/llvm/test/tools/llvm-reduce/reduce-flags.ll (revision 3356eb3b15f391b9b4f62b0157fede16bd8cd5b3)
1; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=instruction-flags --test FileCheck --test-arg --check-prefixes=INTERESTING,CHECK --test-arg %s --test-arg --input-file %s -o %t
2; RUN: FileCheck -check-prefixes=RESULT,CHECK %s < %t
3
4; CHECK-LABEL: @add_nuw_nsw_none(
5; INTERESTING: = add
6; RESULT: add i32
7define i32 @add_nuw_nsw_none(i32 %a, i32 %b) {
8  %op = add nuw nsw i32 %a, %b
9  ret i32 %op
10}
11
12; CHECK-LABEL: @add_nuw_nsw_keep_nuw(
13; INTERESTING: nuw
14; RESULT: add nuw i32
15define i32 @add_nuw_nsw_keep_nuw(i32 %a, i32 %b) {
16  %op = add nuw nsw i32 %a, %b
17  ret i32 %op
18}
19
20; CHECK-LABEL: @add_nuw_nsw_keep_nsw(
21; INTERESTING: nuw
22; RESULT: add nuw i32
23define i32 @add_nuw_nsw_keep_nsw(i32 %a, i32 %b) {
24  %op = add nuw nsw i32 %a, %b
25  ret i32 %op
26}
27
28; CHECK-LABEL: @add_nuw_keep_nuw(
29; INTERESTING: nuw
30; RESULT: add nuw i32
31define i32 @add_nuw_keep_nuw(i32 %a, i32 %b) {
32  %op = add nuw i32 %a, %b
33  ret i32 %op
34}
35
36; CHECK-LABEL: @add_nsw_keep_nsw(
37; INTERESTING: nsw
38; RESULT: add nsw i32
39define i32 @add_nsw_keep_nsw(i32 %a, i32 %b) {
40  %op = add nsw i32 %a, %b
41  ret i32 %op
42}
43
44; CHECK-LABEL: @ashr_exact_drop(
45; INTERESTING: = ashr
46; RESULT: ashr i32
47define i32 @ashr_exact_drop(i32 %a, i32 %b) {
48  %op = ashr exact i32 %a, %b
49  ret i32 %op
50}
51
52; CHECK-LABEL: @ashr_exact_keep(
53; INTERESTING: exact
54; RESULT: ashr exact i32
55define i32 @ashr_exact_keep(i32 %a, i32 %b) {
56  %op = ashr exact i32 %a, %b
57  ret i32 %op
58}
59
60; CHECK-LABEL: @getelementptr_inbounds_nuw_drop_both(
61; INTERESTING: getelementptr
62; RESULT: getelementptr i32, ptr %a, i64 %b
63define ptr @getelementptr_inbounds_nuw_drop_both(ptr %a, i64 %b) {
64  %op = getelementptr inbounds nuw i32, ptr %a, i64 %b
65  ret ptr %op
66}
67
68; CHECK-LABEL: @getelementptr_inbounds_keep_only_inbounds(
69; INTERESTING: inbounds
70; RESULT: getelementptr inbounds i32, ptr %a, i64 %b
71define ptr @getelementptr_inbounds_keep_only_inbounds(ptr %a, i64 %b) {
72  %op = getelementptr inbounds nuw i32, ptr %a, i64 %b
73  ret ptr %op
74}
75
76; CHECK-LABEL: @getelementptr_inbounds_relax_to_nusw(
77; INTERESTING: getelementptr {{inbounds|nusw}}
78; RESULT: getelementptr nusw i32, ptr %a, i64 %b
79define ptr @getelementptr_inbounds_relax_to_nusw(ptr %a, i64 %b) {
80  %op = getelementptr inbounds i32, ptr %a, i64 %b
81  ret ptr %op
82}
83
84; CHECK-LABEL: @fadd_reassoc_none(
85; INTERESTING: = fadd
86; RESULT: fadd float
87define float @fadd_reassoc_none(float %a, float %b) {
88  %op = fadd reassoc float %a, %b
89  ret float %op
90}
91
92; CHECK-LABEL: @fadd_reassoc_keep(
93; INTERESTING: fadd reassoc
94; RESULT: fadd reassoc float
95define float @fadd_reassoc_keep(float %a, float %b) {
96  %op = fadd reassoc float %a, %b
97  ret float %op
98}
99
100; CHECK-LABEL: @fadd_nnan_none(
101; INTERESTING: = fadd
102; RESULT: fadd float
103define float @fadd_nnan_none(float %a, float %b) {
104  %op = fadd nnan float %a, %b
105  ret float %op
106}
107
108; CHECK-LABEL: @fadd_nnan_keep(
109; INTERESTING: fadd nnan
110; RESULT: fadd nnan float
111define float @fadd_nnan_keep(float %a, float %b) {
112  %op = fadd nnan float %a, %b
113  ret float %op
114}
115
116; CHECK-LABEL: @fadd_ninf_none(
117; INTERESTING: = fadd
118; RESULT: fadd float
119define float @fadd_ninf_none(float %a, float %b) {
120  %op = fadd ninf float %a, %b
121  ret float %op
122}
123
124; CHECK-LABEL: @fadd_ninf_keep(
125; INTERESTING: fadd ninf
126; RESULT: fadd ninf float
127define float @fadd_ninf_keep(float %a, float %b) {
128  %op = fadd ninf float %a, %b
129  ret float %op
130}
131
132; CHECK-LABEL: @fadd_nsz_none(
133; INTERESTING: = fadd
134; RESULT: fadd float
135define float @fadd_nsz_none(float %a, float %b) {
136  %op = fadd nsz float %a, %b
137  ret float %op
138}
139
140; CHECK-LABEL: @fadd_nsz_keep(
141; INTERESTING: fadd nsz
142; RESULT: fadd nsz float
143define float @fadd_nsz_keep(float %a, float %b) {
144  %op = fadd nsz float %a, %b
145  ret float %op
146}
147
148; CHECK-LABEL: @fadd_arcp_none(
149; INTERESTING: = fadd
150; RESULT: fadd float
151define float @fadd_arcp_none(float %a, float %b) {
152  %op = fadd arcp float %a, %b
153  ret float %op
154}
155
156; CHECK-LABEL: @fadd_arcp_keep(
157; INTERESTING: fadd arcp
158; RESULT: fadd arcp float
159define float @fadd_arcp_keep(float %a, float %b) {
160  %op = fadd arcp float %a, %b
161  ret float %op
162}
163
164; CHECK-LABEL: @fadd_contract_none(
165; INTERESTING: = fadd
166; RESULT: fadd float
167define float @fadd_contract_none(float %a, float %b) {
168  %op = fadd contract float %a, %b
169  ret float %op
170}
171
172; CHECK-LABEL: @fadd_contract_keep(
173; INTERESTING: fadd contract
174; RESULT: fadd contract float
175define float @fadd_contract_keep(float %a, float %b) {
176  %op = fadd contract float %a, %b
177  ret float %op
178}
179
180; CHECK-LABEL: @fadd_afn_none(
181; INTERESTING: = fadd
182; RESULT: fadd float
183define float @fadd_afn_none(float %a, float %b) {
184  %op = fadd afn float %a, %b
185  ret float %op
186}
187
188; CHECK-LABEL: @fadd_afn_keep(
189; INTERESTING: fadd afn
190; RESULT: fadd afn float
191define float @fadd_afn_keep(float %a, float %b) {
192  %op = fadd afn float %a, %b
193  ret float %op
194}
195
196; CHECK-LABEL: @fadd_fast_none(
197; INTERESTING: = fadd
198; RESULT: fadd float
199define float @fadd_fast_none(float %a, float %b) {
200  %op = fadd fast float %a, %b
201  ret float %op
202}
203
204; CHECK-LABEL: @fadd_nnan_ninf_keep_nnan(
205; INTERESTING: nnan
206; RESULT: fadd nnan float
207define float @fadd_nnan_ninf_keep_nnan(float %a, float %b) {
208  %op = fadd nnan ninf float %a, %b
209  ret float %op
210}
211
212; CHECK-LABEL: @zext_nneg_drop(
213; INTERESTING: = zext
214; RESULT: zext i32
215define i64 @zext_nneg_drop(i32 %a) {
216  %op = zext nneg i32 %a to i64
217  ret i64 %op
218}
219
220; CHECK-LABEL: @zext_nneg_keep(
221; INTERESTING: = zext nneg
222; RESULT: zext nneg i32
223define i64 @zext_nneg_keep(i32 %a) {
224  %op = zext nneg i32 %a to i64
225  ret i64 %op
226}
227
228; CHECK-LABEL: @or_disjoint_drop(
229; INTERESTING: = or
230; RESULT: or i32
231define i32 @or_disjoint_drop(i32 %a, i32 %b) {
232  %op = or disjoint i32 %a, %b
233  ret i32 %op
234}
235
236; CHECK-LABEL: @or_disjoint_keep(
237; INTERESTING: = or disjoint
238; RESULT: or disjoint i32
239define i32 @or_disjoint_keep(i32 %a, i32 %b) {
240  %op = or disjoint i32 %a, %b
241  ret i32 %op
242}
243
244; CHECK-LABEL: @trunc_nuw_drop(
245; INTERESTING: = trunc
246; RESULT: trunc i64
247define i32 @trunc_nuw_drop(i64 %a) {
248  %op = trunc nuw i64 %a to i32
249  ret i32 %op
250}
251
252; CHECK-LABEL: @trunc_nuw_keep(
253; INTERESTING: = trunc nuw
254; RESULT: trunc nuw i64
255define i32 @trunc_nuw_keep(i64 %a) {
256  %op = trunc nuw i64 %a to i32
257  ret i32 %op
258}
259
260; CHECK-LABEL: @trunc_nsw_drop(
261; INTERESTING: = trunc
262; RESULT: trunc i64
263define i32 @trunc_nsw_drop(i64 %a) {
264  %op = trunc nsw i64 %a to i32
265  ret i32 %op
266}
267
268; CHECK-LABEL: @trunc_nsw_keep(
269; INTERESTING: = trunc nsw
270; RESULT: trunc nsw i64
271define i32 @trunc_nsw_keep(i64 %a) {
272  %op = trunc nsw i64 %a to i32
273  ret i32 %op
274}
275
276; CHECK-LABEL: @icmp_samesign_drop(
277; INTERESTING: = icmp
278; RESULT: icmp ult i32
279define i1 @icmp_samesign_drop(i32 %a) {
280  %op = icmp samesign ult i32 %a, 10
281  ret i1 %op
282}
283
284; CHECK-LABEL: @icmp_samesign_keep(
285; INTERESTING: = icmp samesign
286; RESULT: icmp samesign ult i32
287define i1 @icmp_samesign_keep(i32 %a) {
288  %op = icmp samesign ult i32 %a, 10
289  ret i1 %op
290}
291