1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

[CVP] Simplify cmp of local phi node

CVP currently does not simplify cmps with instructions in the same
block, because LVI getPredicateAt() currently does not provide
much useful information for that case (D69686 would change that,
but is stuck.) However, if the instruction is a Phi node, then
LVI can compute the result of the predicate by threading it into
the predecessor blocks, which allows it simplify some conditions
that nothing else can handle. Relevant code:
6d6a4590c5/llvm/lib/Analysis/LazyValueInfo.cpp (L1904-L1927)

Differential Revision: https://reviews.llvm.org/D72169
This commit is contained in:
Nikita Popov 2020-01-03 18:40:18 +01:00
parent 8852d5e0e5
commit 99f935f7df
2 changed files with 4 additions and 5 deletions

View File

@ -310,9 +310,10 @@ static bool processCmp(CmpInst *Cmp, LazyValueInfo *LVI) {
// the comparison is testing local values. While LVI can sometimes reason
// about such cases, it's not its primary purpose. We do make sure to do
// the block local query for uses from terminator instructions, but that's
// handled in the code for each terminator.
// handled in the code for each terminator. As an exception, we allow phi
// nodes, for which LVI can thread the condition into predecessors.
auto *I = dyn_cast<Instruction>(Op0);
if (I && I->getParent() == Cmp->getParent())
if (I && I->getParent() == Cmp->getParent() && !isa<PHINode>(I))
return false;
LazyValueInfo::Tristate Result =

View File

@ -627,11 +627,9 @@ define void @test_cmp_phi(i8 %a) {
; CHECK: loop:
; CHECK-NEXT: [[P:%.*]] = phi i8 [ [[A]], [[ENTRY:%.*]] ], [ [[B:%.*]], [[LOOP]] ]
; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[P]], 0
; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[P]], 2
; CHECK-NEXT: [[C3:%.*]] = and i1 [[C1]], [[C2]]
; CHECK-NEXT: [[C4:%.*]] = call i1 @get_bool()
; CHECK-NEXT: [[B]] = zext i1 [[C4]] to i8
; CHECK-NEXT: br i1 [[C3]], label [[LOOP]], label [[EXIT]]
; CHECK-NEXT: br i1 [[C1]], label [[LOOP]], label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: ret void
;