forked from OSchip/llvm-project
[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:
parent
78b0f075f7
commit
3f02123f7c
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue