diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/IR/Instructions.cpp | 37 | ||||
-rw-r--r-- | llvm/test/Transforms/SimplifyCFG/implied-cond-matching.ll | 16 |
2 files changed, 13 insertions, 40 deletions
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index 13e58219baa..8ad9c070a4e 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -3562,6 +3562,10 @@ bool CmpInst::isImpliedTrueByMatchingCmp(Predicate Pred1, Predicate Pred2) { switch (Pred1) { default: break; + case ICMP_EQ: + // A == B implies A >=u B, A <=u B, A >=u B, and A <=u B are true. + return Pred2 == ICMP_UGE || Pred2 == ICMP_ULE || Pred2 == ICMP_SGE || + Pred2 == ICMP_SLE; case ICMP_UGT: // A >u B implies A != B and A >=u B are true. return Pred2 == ICMP_NE || Pred2 == ICMP_UGE; case ICMP_ULT: // A <u B implies A != B and A <=u B are true. @@ -3575,38 +3579,7 @@ bool CmpInst::isImpliedTrueByMatchingCmp(Predicate Pred1, Predicate Pred2) { } bool CmpInst::isImpliedFalseByMatchingCmp(Predicate Pred1, Predicate Pred2) { - // If an inverted Pred1 matches Pred2, we can infer the second condition is - // false. - if (getInversePredicate(Pred1) == Pred2) - return true; - - // If a swapped Pred1 matches Pred2, we can infer the second condition is - // false in many cases. - if (getSwappedPredicate(Pred1) == Pred2) { - switch (Pred1) { - default: - break; - case ICMP_UGT: // A >u B implies A <u B is false. - case ICMP_ULT: // A <u B implies A >u B is false. - case ICMP_SGT: // A >s B implies A <s B is false. - case ICMP_SLT: // A <s B implies A >s B is false. - return true; - } - } - // A == B implies A > B and A < B are false. - if (Pred1 == ICMP_EQ && isFalseWhenEqual(Pred2)) - return true; - - switch (Pred1) { - default: - break; - case ICMP_UGT: // A >u B implies A == B is false. - case ICMP_ULT: // A <u B implies A == B is false. - case ICMP_SGT: // A >s B implies A == B is false. - case ICMP_SLT: // A <s B implies A == B is false. - return Pred2 == ICMP_EQ; - } - return false; + return isImpliedTrueByMatchingCmp(Pred1, getInversePredicate(Pred2)); } //===----------------------------------------------------------------------===// diff --git a/llvm/test/Transforms/SimplifyCFG/implied-cond-matching.ll b/llvm/test/Transforms/SimplifyCFG/implied-cond-matching.ll index e49139bc1e3..d32fd9ca4ef 100644 --- a/llvm/test/Transforms/SimplifyCFG/implied-cond-matching.ll +++ b/llvm/test/Transforms/SimplifyCFG/implied-cond-matching.ll @@ -140,10 +140,10 @@ untaken: ret void } -; A == B implies A >=u B is unknown to be true or false. +; A == B implies A >=u B is true. ; CHECK-LABEL: @test_eq_uge ; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) +; CHECK-NOT: call void @is(i1 false) define void @test_eq_uge(i32 %a, i32 %b) { %cmp1 = icmp eq i32 %a, %b br i1 %cmp1, label %taken, label %untaken @@ -188,10 +188,10 @@ untaken: ret void } -; A == B implies A <=u B is unknown to be true or false. +; A == B implies A <=u B is true. ; CHECK-LABEL: @test_eq_ule ; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) +; CHECK-NOT: call void @is(i1 false) define void @test_eq_ule(i32 %a, i32 %b) { %cmp1 = icmp eq i32 %a, %b br i1 %cmp1, label %taken, label %untaken @@ -236,10 +236,10 @@ untaken: ret void } -; A == B implies A >=s B is unknown to be true or false. +; A == B implies A >=s B is true. ; CHECK-LABEL: @test_eq_sge ; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) +; CHECK-NOT: call void @is(i1 false) define void @test_eq_sge(i32 %a, i32 %b) { %cmp1 = icmp eq i32 %a, %b br i1 %cmp1, label %taken, label %untaken @@ -284,10 +284,10 @@ untaken: ret void } -; A == B implies A <=s B is unknown to be true or false. +; A == B implies A <=s B is true. ; CHECK-LABEL: @test_eq_sle ; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) +; CHECK-NOT: call void @is(i1 false) define void @test_eq_sle(i32 %a, i32 %b) { %cmp1 = icmp eq i32 %a, %b br i1 %cmp1, label %taken, label %untaken |