xref: /llvm-project/llvm/test/Analysis/ValueTracking/select-known-non-zero.ll (revision ab3fdbdfbe7edc62049c602d87be91c3ad3f5e3b)
1530bbc8fSNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2530bbc8fSNoah Goldstein; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3530bbc8fSNoah Goldstein
4530bbc8fSNoah Goldsteindeclare void @llvm.assume(i1)
5*ab3fdbdfSAllendeclare void @use(i64)
6*ab3fdbdfSAllendeclare void @use4(i4)
72622b2f4SNoah Goldstein
8530bbc8fSNoah Goldsteindefine i1 @select_v_ne_fail(i8 %v, i8 %C, i8 %y) {
9530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_ne_fail(
10530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
11530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
12530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[V:%.*]], [[C:%.*]]
13530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
14530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
15530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
16530bbc8fSNoah Goldstein;
17530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
18530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
19530bbc8fSNoah Goldstein  %cmp = icmp ne i8 %v, %C
20530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
21530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
22530bbc8fSNoah Goldstein  ret i1 %r
23530bbc8fSNoah Goldstein}
24530bbc8fSNoah Goldstein
25530bbc8fSNoah Goldsteindefine i1 @select_v_eq_nz(i8 %v, i8 %C, i8 %y) {
26530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_eq_nz(
27530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
28530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
29530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp ne i8 [[C:%.*]], 0
30530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
31530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[C]], [[V:%.*]]
32530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
33530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
34530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
35530bbc8fSNoah Goldstein;
36530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
37530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
38530bbc8fSNoah Goldstein  %pcond0 = icmp ne i8 %C, 0
39530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
40530bbc8fSNoah Goldstein  %cmp = icmp eq i8 %C, %v
41530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
42530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
43530bbc8fSNoah Goldstein  ret i1 %r
44530bbc8fSNoah Goldstein}
45530bbc8fSNoah Goldstein
46530bbc8fSNoah Goldsteindefine i1 @inv_select_v_ugt_nz(i8 %v, i8 %C, i8 %y) {
47530bbc8fSNoah Goldstein; CHECK-LABEL: @inv_select_v_ugt_nz(
48530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
49530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
50530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp ne i8 [[C:%.*]], 0
51530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
52530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[C]], [[V:%.*]]
53530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]
54530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
55530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
56530bbc8fSNoah Goldstein;
57530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
58530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
59530bbc8fSNoah Goldstein  %pcond0 = icmp ne i8 %C, 0
60530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
61530bbc8fSNoah Goldstein  %cmp = icmp ugt i8 %C, %v
62530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %y, i8 %v
63530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
64530bbc8fSNoah Goldstein  ret i1 %r
65530bbc8fSNoah Goldstein}
66530bbc8fSNoah Goldstein
67530bbc8fSNoah Goldsteindefine i1 @inv_select_v_ugt_fail(i8 %v, i8 %C, i8 %y) {
68530bbc8fSNoah Goldstein; CHECK-LABEL: @inv_select_v_ugt_fail(
69530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
70530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
71530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], -8
72530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
73530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[C]], [[V:%.*]]
74530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]
75530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
76530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
77530bbc8fSNoah Goldstein;
78530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
79530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
80530bbc8fSNoah Goldstein  %pcond0 = icmp sge i8 %C, -8
81530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
82530bbc8fSNoah Goldstein  %cmp = icmp ugt i8 %C, %v
83530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %y, i8 %v
84530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
85530bbc8fSNoah Goldstein  ret i1 %r
86530bbc8fSNoah Goldstein}
87530bbc8fSNoah Goldstein
88530bbc8fSNoah Goldsteindefine i1 @select_v_uge_nz(i8 %v, i8 %C, i8 %y) {
89530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_uge_nz(
90530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
91530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
92530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp ne i8 [[C:%.*]], 0
93530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
94530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i8 [[V:%.*]], [[C]]
95530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
96530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
97530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
98530bbc8fSNoah Goldstein;
99530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
100530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
101530bbc8fSNoah Goldstein  %pcond0 = icmp ne i8 %C, 0
102530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
103530bbc8fSNoah Goldstein  %cmp = icmp uge i8 %v, %C
104530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
105530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
106530bbc8fSNoah Goldstein  ret i1 %r
107530bbc8fSNoah Goldstein}
108530bbc8fSNoah Goldstein
109530bbc8fSNoah Goldsteindefine i1 @select_v_sgt_nonneg(i8 %v, i8 %C, i8 %y) {
110530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sgt_nonneg(
111530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
112530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
113530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0
114530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
115530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], [[C]]
116530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
117530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
118530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
119530bbc8fSNoah Goldstein;
120530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
121530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
122530bbc8fSNoah Goldstein  %pcond0 = icmp sge i8 %C, 0
123530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
124530bbc8fSNoah Goldstein  %cmp = icmp sgt i8 %v, %C
125530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
126530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
127530bbc8fSNoah Goldstein  ret i1 %r
128530bbc8fSNoah Goldstein}
129530bbc8fSNoah Goldstein
130530bbc8fSNoah Goldsteindefine i1 @select_v_sgt_fail(i8 %v, i8 %C, i8 %y) {
131530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sgt_fail(
132530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
133530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
134530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], -4
135530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
136530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], [[C]]
137530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
138530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
139530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
140530bbc8fSNoah Goldstein;
141530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
142530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
143530bbc8fSNoah Goldstein  %pcond0 = icmp sge i8 %C, -4
144530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
145530bbc8fSNoah Goldstein  %cmp = icmp sgt i8 %v, %C
146530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
147530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
148530bbc8fSNoah Goldstein  ret i1 %r
149530bbc8fSNoah Goldstein}
150530bbc8fSNoah Goldstein
151530bbc8fSNoah Goldsteindefine i1 @inv_select_v_sgt_neg(i8 %v, i8 %C, i8 %y) {
152530bbc8fSNoah Goldstein; CHECK-LABEL: @inv_select_v_sgt_neg(
153530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
154530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
155530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0
156530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
157530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], [[C]]
158530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]
159530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
160530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
161530bbc8fSNoah Goldstein;
162530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
163530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
164530bbc8fSNoah Goldstein  %pcond0 = icmp slt i8 %C, 0
165530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
166530bbc8fSNoah Goldstein  %cmp = icmp sgt i8 %v, %C
167530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %y, i8 %v
168530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
169530bbc8fSNoah Goldstein  ret i1 %r
170530bbc8fSNoah Goldstein}
171530bbc8fSNoah Goldstein
172530bbc8fSNoah Goldsteindefine i1 @inv_select_v_sgt_nonneg_nz(i8 %v, i8 %C, i8 %y) {
173530bbc8fSNoah Goldstein; CHECK-LABEL: @inv_select_v_sgt_nonneg_nz(
174530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
175530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
176530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sgt i8 [[C:%.*]], 0
177530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
178530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[C]], [[V:%.*]]
179530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]
180530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
181530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
182530bbc8fSNoah Goldstein;
183530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
184530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
185530bbc8fSNoah Goldstein  %pcond0 = icmp sgt i8 %C, 0
186530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
187530bbc8fSNoah Goldstein  %cmp = icmp sgt i8 %C, %v
188530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %y, i8 %v
189530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
190530bbc8fSNoah Goldstein  ret i1 %r
191530bbc8fSNoah Goldstein}
192530bbc8fSNoah Goldstein
193530bbc8fSNoah Goldsteindefine i1 @select_v_slt_nonneg(i8 %v, i8 %C, i8 %y) {
194530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_slt_nonneg(
195530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
196530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
197530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0
198530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
199530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[C]], [[V:%.*]]
200530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
201530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
202530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
203530bbc8fSNoah Goldstein;
204530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
205530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
206530bbc8fSNoah Goldstein  %pcond0 = icmp sge i8 %C, 0
207530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
208530bbc8fSNoah Goldstein  %cmp = icmp slt i8 %C, %v
209530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
210530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
211530bbc8fSNoah Goldstein  ret i1 %r
212530bbc8fSNoah Goldstein}
213530bbc8fSNoah Goldstein
214530bbc8fSNoah Goldsteindefine i1 @select_v_slt_nonneg_fail(i8 %v, i8 %C, i8 %y) {
215530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_slt_nonneg_fail(
216530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
217530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
218530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], -1
219530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
220530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[C]], [[V:%.*]]
221530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
222530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
223530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
224530bbc8fSNoah Goldstein;
225530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
226530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
227530bbc8fSNoah Goldstein  %pcond0 = icmp sge i8 %C, -1
228530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
229530bbc8fSNoah Goldstein  %cmp = icmp slt i8 %C, %v
230530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
231530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
232530bbc8fSNoah Goldstein  ret i1 %r
233530bbc8fSNoah Goldstein}
234530bbc8fSNoah Goldstein
235530bbc8fSNoah Goldsteindefine i1 @select_v_slt_neg(i8 %v, i8 %C, i8 %y) {
236530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_slt_neg(
237530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
238530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
239530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0
240530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
241530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[V:%.*]], [[C]]
242530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
243530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
244530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
245530bbc8fSNoah Goldstein;
246530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
247530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
248530bbc8fSNoah Goldstein  %pcond0 = icmp slt i8 %C, 0
249530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
250530bbc8fSNoah Goldstein  %cmp = icmp slt i8 %v, %C
251530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
252530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
253530bbc8fSNoah Goldstein  ret i1 %r
254530bbc8fSNoah Goldstein}
255530bbc8fSNoah Goldstein
256530bbc8fSNoah Goldsteindefine i1 @select_v_sge_nonneg_nz(i8 %v, i8 %C, i8 %y) {
257530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sge_nonneg_nz(
258530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
259530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
260530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sgt i8 [[C:%.*]], 0
261530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
262530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i8 [[V:%.*]], [[C]]
263530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
264530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
265530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
266530bbc8fSNoah Goldstein;
267530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
268530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
269530bbc8fSNoah Goldstein  %pcond0 = icmp sgt i8 %C, 0
270530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
271530bbc8fSNoah Goldstein  %cmp = icmp sge i8 %v, %C
272530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
273530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
274530bbc8fSNoah Goldstein  ret i1 %r
275530bbc8fSNoah Goldstein}
276530bbc8fSNoah Goldstein
277530bbc8fSNoah Goldsteindefine i1 @select_v_sge_neg(i8 %v, i8 %C, i8 %y) {
278530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sge_neg(
279530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
280530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
281530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0
282530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
283530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i8 [[C]], [[V:%.*]]
284530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
285530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
286530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
287530bbc8fSNoah Goldstein;
288530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
289530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
290530bbc8fSNoah Goldstein  %pcond0 = icmp slt i8 %C, 0
291530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
292530bbc8fSNoah Goldstein  %cmp = icmp sge i8 %C, %v
293530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
294530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
295530bbc8fSNoah Goldstein  ret i1 %r
296530bbc8fSNoah Goldstein}
297530bbc8fSNoah Goldstein
298530bbc8fSNoah Goldsteindefine i1 @inv_select_v_sge_fail(i8 %v, i8 %C, i8 %y) {
299530bbc8fSNoah Goldstein; CHECK-LABEL: @inv_select_v_sge_fail(
300530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
301530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
302530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i8 [[V:%.*]], [[C:%.*]]
303530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]
304530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
305530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
306530bbc8fSNoah Goldstein;
307530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
308530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
309530bbc8fSNoah Goldstein  %cmp = icmp sge i8 %v, %C
310530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %y, i8 %v
311530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
312530bbc8fSNoah Goldstein  ret i1 %r
313530bbc8fSNoah Goldstein}
314530bbc8fSNoah Goldstein
315530bbc8fSNoah Goldsteindefine i1 @select_v_sle_neg(i8 %v, i8 %C, i8 %y) {
316530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sle_neg(
317530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
318530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
319530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0
320530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
321530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[V:%.*]], [[C]]
322530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
323530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
324530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
325530bbc8fSNoah Goldstein;
326530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
327530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
328530bbc8fSNoah Goldstein  %pcond0 = icmp slt i8 %C, 0
329530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
330530bbc8fSNoah Goldstein  %cmp = icmp sle i8 %v, %C
331530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
332530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
333530bbc8fSNoah Goldstein  ret i1 %r
334530bbc8fSNoah Goldstein}
335530bbc8fSNoah Goldstein
336530bbc8fSNoah Goldsteindefine i1 @select_v_sle_nonneg_nz(i8 %v, i8 %C, i8 %y) {
337530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sle_nonneg_nz(
338530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
339530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
340530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sgt i8 [[C:%.*]], 0
341530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
342530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[C]], [[V:%.*]]
343530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
344530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
345530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
346530bbc8fSNoah Goldstein;
347530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
348530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
349530bbc8fSNoah Goldstein  %pcond0 = icmp sgt i8 %C, 0
350530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
351530bbc8fSNoah Goldstein  %cmp = icmp sle i8 %C, %v
352530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
353530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
354530bbc8fSNoah Goldstein  ret i1 %r
355530bbc8fSNoah Goldstein}
356530bbc8fSNoah Goldstein
357530bbc8fSNoah Goldsteindefine i1 @select_v_sle_fail(i8 %v, i8 %C, i8 %y) {
358530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sle_fail(
359530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
360530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
361530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0
362530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
363530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[C]], [[V:%.*]]
364530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]
365530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
366530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
367530bbc8fSNoah Goldstein;
368530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
369530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
370530bbc8fSNoah Goldstein  %pcond0 = icmp sge i8 %C, 0
371530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
372530bbc8fSNoah Goldstein  %cmp = icmp sle i8 %C, %v
373530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %v, i8 %y
374530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
375530bbc8fSNoah Goldstein  ret i1 %r
376530bbc8fSNoah Goldstein}
377530bbc8fSNoah Goldstein
378530bbc8fSNoah Goldsteindefine i1 @inv_select_v_sle_nonneg(i8 %v, i8 %C, i8 %y) {
379530bbc8fSNoah Goldstein; CHECK-LABEL: @inv_select_v_sle_nonneg(
380530bbc8fSNoah Goldstein; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0
381530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])
382530bbc8fSNoah Goldstein; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0
383530bbc8fSNoah Goldstein; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])
384530bbc8fSNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[V:%.*]], [[C]]
385530bbc8fSNoah Goldstein; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]
386530bbc8fSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0
387530bbc8fSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
388530bbc8fSNoah Goldstein;
389530bbc8fSNoah Goldstein  %ynz = icmp ne i8 %y, 0
390530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %ynz)
391530bbc8fSNoah Goldstein  %pcond0 = icmp sge i8 %C, 0
392530bbc8fSNoah Goldstein  call void @llvm.assume(i1 %pcond0)
393530bbc8fSNoah Goldstein  %cmp = icmp sle i8 %v, %C
394530bbc8fSNoah Goldstein  %s = select i1 %cmp, i8 %y, i8 %v
395530bbc8fSNoah Goldstein  %r = icmp eq i8 %s, 0
396530bbc8fSNoah Goldstein  ret i1 %r
397530bbc8fSNoah Goldstein}
398076581fdSDhruv Chawla
399076581fdSDhruv Chawla; Check udiv/sdiv occuring before icmp.
400076581fdSDhruv Chawladefine i64 @incorrect_safe_div_1(i64 %n, i64 %d) {
401076581fdSDhruv Chawla; CHECK-LABEL: @incorrect_safe_div_1(
402076581fdSDhruv Chawla; CHECK-NEXT:    [[TMP1:%.*]] = udiv i64 [[N:%.*]], [[D:%.*]]
403076581fdSDhruv Chawla; CHECK-NEXT:    ret i64 [[TMP1]]
404076581fdSDhruv Chawla;
405076581fdSDhruv Chawla  %1 = udiv i64 %n, %d
406076581fdSDhruv Chawla  %2 = icmp eq i64 %d, 0
407076581fdSDhruv Chawla  %3 = select i1 %2, i64 -1, i64 %1
408076581fdSDhruv Chawla  ret i64 %3
409076581fdSDhruv Chawla}
410076581fdSDhruv Chawla
411076581fdSDhruv Chawla; Check icmp occuring before udiv/sdiv.
412076581fdSDhruv Chawladefine i64 @incorrect_safe_div_2(i64 %n, i64 %d) {
413076581fdSDhruv Chawla; CHECK-LABEL: @incorrect_safe_div_2(
414076581fdSDhruv Chawla; CHECK-NEXT:    [[TMP1:%.*]] = sdiv i64 [[N:%.*]], [[D:%.*]]
415076581fdSDhruv Chawla; CHECK-NEXT:    ret i64 [[TMP1]]
416076581fdSDhruv Chawla;
417076581fdSDhruv Chawla  %1 = icmp eq i64 %d, 0
418076581fdSDhruv Chawla  %2 = sdiv i64 %n, %d
419076581fdSDhruv Chawla  %3 = select i1 %1, i64 -1, i64 %2
420076581fdSDhruv Chawla  ret i64 %3
421076581fdSDhruv Chawla}
422076581fdSDhruv Chawla
423076581fdSDhruv Chawladefine i64 @incorrect_safe_div_call_1(i64 %n, i64 %d) {
424076581fdSDhruv Chawla; CHECK-LABEL: @incorrect_safe_div_call_1(
425076581fdSDhruv Chawla; CHECK-NEXT:    [[TMP1:%.*]] = sdiv i64 [[N:%.*]], [[D:%.*]]
426076581fdSDhruv Chawla; CHECK-NEXT:    tail call void @use(i64 [[D]])
427076581fdSDhruv Chawla; CHECK-NEXT:    ret i64 [[TMP1]]
428076581fdSDhruv Chawla;
429076581fdSDhruv Chawla  %1 = sdiv i64 %n, %d
430076581fdSDhruv Chawla  tail call void @use(i64 %d)
431076581fdSDhruv Chawla  %2 = icmp eq i64 %d, 0
432076581fdSDhruv Chawla  %3 = select i1 %2, i64 -1, i64 %1
433076581fdSDhruv Chawla  ret i64 %3
434076581fdSDhruv Chawla}
435076581fdSDhruv Chawla
436076581fdSDhruv Chawladefine i64 @incorrect_safe_div_call_2(i64 %n, i64 %d) {
437076581fdSDhruv Chawla; CHECK-LABEL: @incorrect_safe_div_call_2(
438076581fdSDhruv Chawla; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 [[D:%.*]], 0
439076581fdSDhruv Chawla; CHECK-NEXT:    tail call void @use(i64 [[D]])
440076581fdSDhruv Chawla; CHECK-NEXT:    [[TMP2:%.*]] = udiv i64 [[N:%.*]], [[D]]
441076581fdSDhruv Chawla; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i64 -1, i64 [[TMP2]]
442076581fdSDhruv Chawla; CHECK-NEXT:    ret i64 [[TMP3]]
443076581fdSDhruv Chawla;
444076581fdSDhruv Chawla  %1 = icmp eq i64 %d, 0
445076581fdSDhruv Chawla  tail call void @use(i64 %d)
446076581fdSDhruv Chawla  %2 = udiv i64 %n, %d
447076581fdSDhruv Chawla  %3 = select i1 %1, i64 -1, i64 %2
448076581fdSDhruv Chawla  ret i64 %3
449076581fdSDhruv Chawla}
450076581fdSDhruv Chawla
451*ab3fdbdfSAllen; https://alive2.llvm.org/ce/z/Si_B7b
452*ab3fdbdfSAllendefine i4 @icmp_urem(i4 %n, i4 %d) {
453*ab3fdbdfSAllen; CHECK-LABEL: @icmp_urem(
454*ab3fdbdfSAllen; CHECK-NEXT:    [[TMP1:%.*]] = urem i4 [[N:%.*]], [[D:%.*]]
455*ab3fdbdfSAllen; CHECK-NEXT:    ret i4 [[TMP1]]
456*ab3fdbdfSAllen;
457*ab3fdbdfSAllen  %1 = icmp eq i4 %d, 0
458*ab3fdbdfSAllen  %2 = urem i4 %n, %d
459*ab3fdbdfSAllen  %3 = select i1 %1, i4 -1, i4 %2
460*ab3fdbdfSAllen  ret i4 %3
461*ab3fdbdfSAllen}
462*ab3fdbdfSAllen
463*ab3fdbdfSAllendefine i4 @icmp_urem_clobber_by_call(i4 %n, i4 %d) {
464*ab3fdbdfSAllen; CHECK-LABEL: @icmp_urem_clobber_by_call(
465*ab3fdbdfSAllen; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i4 [[D:%.*]], 0
466*ab3fdbdfSAllen; CHECK-NEXT:    tail call void @use4(i4 [[D]])
467*ab3fdbdfSAllen; CHECK-NEXT:    [[TMP2:%.*]] = urem i4 [[N:%.*]], [[D]]
468*ab3fdbdfSAllen; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i4 -1, i4 [[TMP2]]
469*ab3fdbdfSAllen; CHECK-NEXT:    ret i4 [[TMP3]]
470*ab3fdbdfSAllen;
471*ab3fdbdfSAllen  %1 = icmp eq i4 %d, 0
472*ab3fdbdfSAllen  tail call void @use4(i4 %d)
473*ab3fdbdfSAllen  %2 = urem i4 %n, %d
474*ab3fdbdfSAllen  %3 = select i1 %1, i4 -1, i4 %2
475*ab3fdbdfSAllen  ret i4 %3
476*ab3fdbdfSAllen}
477*ab3fdbdfSAllen
478*ab3fdbdfSAllen; https://alive2.llvm.org/ce/z/Fn3Wac
479*ab3fdbdfSAllendefine i4 @icmp_srem(i4 %n, i4 %d) {
480*ab3fdbdfSAllen; CHECK-LABEL: @icmp_srem(
481*ab3fdbdfSAllen; CHECK-NEXT:    [[TMP1:%.*]] = srem i4 [[N:%.*]], [[D:%.*]]
482*ab3fdbdfSAllen; CHECK-NEXT:    ret i4 [[TMP1]]
483*ab3fdbdfSAllen;
484*ab3fdbdfSAllen  %1 = icmp eq i4 %d, 0
485*ab3fdbdfSAllen  %2 = srem i4 %n, %d
486*ab3fdbdfSAllen  %3 = select i1 %1, i4 -1, i4 %2
487*ab3fdbdfSAllen  ret i4 %3
488*ab3fdbdfSAllen}
489*ab3fdbdfSAllen
490*ab3fdbdfSAllendefine i4 @icmp_srem_clobber_by_call(i4 %n, i4 %d) {
491*ab3fdbdfSAllen; CHECK-LABEL: @icmp_srem_clobber_by_call(
492*ab3fdbdfSAllen; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i4 [[D:%.*]], 0
493*ab3fdbdfSAllen; CHECK-NEXT:    tail call void @use4(i4 [[D]])
494*ab3fdbdfSAllen; CHECK-NEXT:    [[TMP2:%.*]] = srem i4 [[N:%.*]], [[D]]
495*ab3fdbdfSAllen; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i4 -1, i4 [[TMP2]]
496*ab3fdbdfSAllen; CHECK-NEXT:    ret i4 [[TMP3]]
497*ab3fdbdfSAllen;
498*ab3fdbdfSAllen  %1 = icmp eq i4 %d, 0
499*ab3fdbdfSAllen  tail call void @use4(i4 %d)
500*ab3fdbdfSAllen  %2 = srem i4 %n, %d
501*ab3fdbdfSAllen  %3 = select i1 %1, i4 -1, i4 %2
502*ab3fdbdfSAllen  ret i4 %3
503*ab3fdbdfSAllen}
504