summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@codeaurora.org>2016-04-22 17:57:34 +0000
committerChad Rosier <mcrosier@codeaurora.org>2016-04-22 17:57:34 +0000
commit1a601590640f6af67873bf0a72cbf4de39bad95f (patch)
tree5edd298c98951e2ad8053fd4ba9eb3d30649b458
parent2b909e9917b27568f256aece48b5c3d5f07d3ad0 (diff)
downloadbcm5719-llvm-1a601590640f6af67873bf0a72cbf4de39bad95f.tar.gz
bcm5719-llvm-1a601590640f6af67873bf0a72cbf4de39bad95f.zip
[SimplifyCFG] Add final missing implications to isImpliedTrueByMatchingCmp.
Summary: eq imply [u|s]ge and [u|s]le are true. Remove redundant logic by implementing isImpliedFalseByMatchingCmp(Pred1, Pred2) as isImpliedTrueByMatchingCmp(Pred1, getInversePredicate(Pred2)). llvm-svn: 267177
-rw-r--r--llvm/lib/IR/Instructions.cpp37
-rw-r--r--llvm/test/Transforms/SimplifyCFG/implied-cond-matching.ll16
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
OpenPOWER on IntegriCloud