From 1a601590640f6af67873bf0a72cbf4de39bad95f Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Fri, 22 Apr 2016 17:57:34 +0000 Subject: [PATCH] [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 --- llvm/lib/IR/Instructions.cpp | 37 +++------------------- .../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 13e5821..8ad9c07 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 u B is false. - case ICMP_SGT: // 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 s B implies A == B is false. - case ICMP_SLT: // 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 -- 2.7.4