aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2021-03-21 18:14:43 +0100
committerNikita Popov <nikita.ppv@gmail.com>2021-03-21 18:41:35 +0100
commitf5bbdf2a674a94c568aaa7dca4c282901256683b (patch)
tree5e9712a9261d9e3ad0d417cb7198c7489f0f0a85
parent1d909c9a35713bef7badcbf17e7e75d6335c070b (diff)
downloadllvm-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.ll89
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 }