Skip to content

Commit f5bbdf2

Browse files
committed
[ValueTracking] Add more tests for isKnownNonEqual() of mul (NFC)
This is for the case of (x * C) == x, rather than the (x * C1) == (x * C2) variant that we already cover.
1 parent 1d909c9 commit f5bbdf2

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed

llvm/test/Analysis/ValueTracking/known-non-equal.ll

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,4 +214,93 @@ define i1 @mul_constantexpr(i16 %a) {
214214
ret i1 %cmp
215215
}
216216

217+
define i1 @mul_nuw(i16 %x) {
218+
; CHECK-LABEL: @mul_nuw(
219+
; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2
220+
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[NZ]], 2
221+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[NZ]], [[MUL]]
222+
; CHECK-NEXT: ret i1 [[CMP]]
223+
;
224+
%nz = or i16 %x, 2
225+
%mul = mul nuw i16 %nz, 2
226+
%cmp = icmp eq i16 %nz, %mul
227+
ret i1 %cmp
228+
}
229+
230+
define i1 @mul_nuw_comm(i16 %x) {
231+
; CHECK-LABEL: @mul_nuw_comm(
232+
; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2
233+
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[NZ]], 2
234+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[MUL]], [[NZ]]
235+
; CHECK-NEXT: ret i1 [[CMP]]
236+
;
237+
%nz = or i16 %x, 2
238+
%mul = mul nuw i16 %nz, 2
239+
%cmp = icmp eq i16 %mul, %nz
240+
ret i1 %cmp
241+
}
242+
243+
define i1 @mul_nsw(i16 %x) {
244+
; CHECK-LABEL: @mul_nsw(
245+
; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2
246+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i16 [[NZ]], 2
247+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[NZ]], [[MUL]]
248+
; CHECK-NEXT: ret i1 [[CMP]]
249+
;
250+
%nz = or i16 %x, 2
251+
%mul = mul nsw i16 %nz, 2
252+
%cmp = icmp eq i16 %nz, %mul
253+
ret i1 %cmp
254+
}
255+
256+
define i1 @mul_nsw_comm(i16 %x) {
257+
; CHECK-LABEL: @mul_nsw_comm(
258+
; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2
259+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i16 [[NZ]], 2
260+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[MUL]], [[NZ]]
261+
; CHECK-NEXT: ret i1 [[CMP]]
262+
;
263+
%nz = or i16 %x, 2
264+
%mul = mul nsw i16 %nz, 2
265+
%cmp = icmp eq i16 %mul, %nz
266+
ret i1 %cmp
267+
}
268+
269+
define i1 @mul_may_wrap(i16 %x) {
270+
; CHECK-LABEL: @mul_may_wrap(
271+
; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2
272+
; CHECK-NEXT: [[MUL:%.*]] = mul i16 [[NZ]], 2
273+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[NZ]], [[MUL]]
274+
; CHECK-NEXT: ret i1 [[CMP]]
275+
;
276+
%nz = or i16 %x, 2
277+
%mul = mul i16 %nz, 2
278+
%cmp = icmp eq i16 %nz, %mul
279+
ret i1 %cmp
280+
}
281+
282+
define i1 @mul_may_be_zero(i16 %x) {
283+
; CHECK-LABEL: @mul_may_be_zero(
284+
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[X:%.*]], 2
285+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[X]], [[MUL]]
286+
; CHECK-NEXT: ret i1 [[CMP]]
287+
;
288+
%mul = mul nuw i16 %x, 2
289+
%cmp = icmp eq i16 %x, %mul
290+
ret i1 %cmp
291+
}
292+
293+
define i1 @mul_other_may_be_zero_or_one(i16 %x, i16 %y) {
294+
; CHECK-LABEL: @mul_other_may_be_zero_or_one(
295+
; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2
296+
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[NZ]], [[Y:%.*]]
297+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[NZ]], [[MUL]]
298+
; CHECK-NEXT: ret i1 [[CMP]]
299+
;
300+
%nz = or i16 %x, 2
301+
%mul = mul nuw i16 %nz, %y
302+
%cmp = icmp eq i16 %nz, %mul
303+
ret i1 %cmp
304+
}
305+
217306
!0 = !{ i8 1, i8 5 }

0 commit comments

Comments
 (0)