[ValueTracking] Fix the identity case (LHS => RHS) when the LHS is false.

Prior to this commit both of the added test cases were passing.  However, in the
latter case (test7) we were doing a lot more work to arrive at the same answer
(i.e., we were using isImpliedCondMatchingOperands() to determine the
implication.).

llvm-svn: 307400
This commit is contained in:
Chad Rosier 2017-07-07 13:55:55 +00:00
parent 78b0f075f7
commit 3f02123f7c
2 changed files with 38 additions and 2 deletions

View File

@ -4405,8 +4405,8 @@ Optional<bool> llvm::isImpliedCondition(const Value *LHS, const Value *RHS,
assert(OpTy->getScalarType()->isIntegerTy(1));
// LHS ==> RHS by definition
if (!LHSIsFalse && LHS == RHS)
return true;
if (LHS == RHS)
return !LHSIsFalse;
if (OpTy->isVectorTy())
// TODO: extending the code below to handle vectors

View File

@ -162,3 +162,39 @@ fpath:
end:
ret i32 0
}
; LHS ==> RHS by definition (true -> true)
; CHECK-LABEL: @test6
; CHECK: taken:
; CHECK-NOT: select
; CHECK: call void @foo(i32 10)
define void @test6(i32 %a, i32 %b) {
%cmp1 = icmp eq i32 %a, %b
br i1 %cmp1, label %taken, label %end
taken:
%c = select i1 %cmp1, i32 10, i32 0
call void @foo(i32 %c)
br label %end
end:
ret void
}
; LHS ==> RHS by definition (false -> false)
; CHECK-LABEL: @test7
; CHECK: taken:
; CHECK-NOT: select
; CHECK: call void @foo(i32 11)
define void @test7(i32 %a, i32 %b) {
%cmp1 = icmp eq i32 %a, %b
br i1 %cmp1, label %end, label %taken
taken:
%c = select i1 %cmp1, i32 0, i32 11
call void @foo(i32 %c)
br label %end
end:
ret void
}