diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2021-03-21 18:14:43 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2021-03-21 18:41:35 +0100 |
commit | f5bbdf2a674a94c568aaa7dca4c282901256683b (patch) | |
tree | 5e9712a9261d9e3ad0d417cb7198c7489f0f0a85 | |
parent | 1d909c9a35713bef7badcbf17e7e75d6335c070b (diff) | |
download | llvm-f5bbdf2a674a94c568aaa7dca4c282901256683b.zip llvm-f5bbdf2a674a94c568aaa7dca4c282901256683b.tar.gz llvm-f5bbdf2a674a94c568aaa7dca4c282901256683b.tar.bz2 |
[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.
-rw-r--r-- | llvm/test/Analysis/ValueTracking/known-non-equal.ll | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/llvm/test/Analysis/ValueTracking/known-non-equal.ll b/llvm/test/Analysis/ValueTracking/known-non-equal.ll index 197088a..bd50f60 100644 --- a/llvm/test/Analysis/ValueTracking/known-non-equal.ll +++ b/llvm/test/Analysis/ValueTracking/known-non-equal.ll @@ -214,4 +214,93 @@ define i1 @mul_constantexpr(i16 %a) { ret i1 %cmp } +define i1 @mul_nuw(i16 %x) { +; CHECK-LABEL: @mul_nuw( +; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2 +; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[NZ]], 2 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[NZ]], [[MUL]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %nz = or i16 %x, 2 + %mul = mul nuw i16 %nz, 2 + %cmp = icmp eq i16 %nz, %mul + ret i1 %cmp +} + +define i1 @mul_nuw_comm(i16 %x) { +; CHECK-LABEL: @mul_nuw_comm( +; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2 +; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[NZ]], 2 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[MUL]], [[NZ]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %nz = or i16 %x, 2 + %mul = mul nuw i16 %nz, 2 + %cmp = icmp eq i16 %mul, %nz + ret i1 %cmp +} + +define i1 @mul_nsw(i16 %x) { +; CHECK-LABEL: @mul_nsw( +; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2 +; CHECK-NEXT: [[MUL:%.*]] = mul nsw i16 [[NZ]], 2 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[NZ]], [[MUL]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %nz = or i16 %x, 2 + %mul = mul nsw i16 %nz, 2 + %cmp = icmp eq i16 %nz, %mul + ret i1 %cmp +} + +define i1 @mul_nsw_comm(i16 %x) { +; CHECK-LABEL: @mul_nsw_comm( +; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2 +; CHECK-NEXT: [[MUL:%.*]] = mul nsw i16 [[NZ]], 2 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[MUL]], [[NZ]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %nz = or i16 %x, 2 + %mul = mul nsw i16 %nz, 2 + %cmp = icmp eq i16 %mul, %nz + ret i1 %cmp +} + +define i1 @mul_may_wrap(i16 %x) { +; CHECK-LABEL: @mul_may_wrap( +; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2 +; CHECK-NEXT: [[MUL:%.*]] = mul i16 [[NZ]], 2 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[NZ]], [[MUL]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %nz = or i16 %x, 2 + %mul = mul i16 %nz, 2 + %cmp = icmp eq i16 %nz, %mul + ret i1 %cmp +} + +define i1 @mul_may_be_zero(i16 %x) { +; CHECK-LABEL: @mul_may_be_zero( +; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[X:%.*]], 2 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[X]], [[MUL]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %mul = mul nuw i16 %x, 2 + %cmp = icmp eq i16 %x, %mul + ret i1 %cmp +} + +define i1 @mul_other_may_be_zero_or_one(i16 %x, i16 %y) { +; CHECK-LABEL: @mul_other_may_be_zero_or_one( +; CHECK-NEXT: [[NZ:%.*]] = or i16 [[X:%.*]], 2 +; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[NZ]], [[Y:%.*]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[NZ]], [[MUL]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %nz = or i16 %x, 2 + %mul = mul nuw i16 %nz, %y + %cmp = icmp eq i16 %nz, %mul + ret i1 %cmp +} + !0 = !{ i8 1, i8 5 } |