1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

[GVN] Invalidate cached info for phis when setting dead predecessors to undef

When GVN sets the incoming value for a phi to undef because the incoming block
is unreachable it needs to also invalidate the cached info for that phi in
MemoryDependenceAnalysis, otherwise later queries will return stale information.

Differential Revision: https://reviews.llvm.org/D51099

llvm-svn: 340529
This commit is contained in:
John Brawn 2018-08-23 12:48:17 +00:00
parent 69aa3df088
commit e70236adf8
2 changed files with 40 additions and 0 deletions

View File

@ -2457,6 +2457,8 @@ void GVN::addDeadBlock(BasicBlock *BB) {
PHINode &Phi = cast<PHINode>(*II);
Phi.setIncomingValue(Phi.getBasicBlockIndex(P),
UndefValue::get(Phi.getType()));
if (MD)
MD->invalidateCachedPointerInfo(&Phi);
}
}
}

View File

@ -0,0 +1,38 @@
; RUN: opt < %s -gvn -S | FileCheck %s
; loop.then is not reachable from loop, so we should be able to deduce that the
; store through %phi2 cannot alias %ptr1.
; CHECK-LABEL: @test1
define void @test1(i32* %ptr1, i32* %ptr2) {
; CHECK-LABEL: entry:
; CHECK: %[[GEP:.*]] = getelementptr inbounds i32, i32* %ptr1, i64 1
; CHECK: %[[VAL1:.*]] = load i32, i32* %[[GEP]]
entry:
br label %loop.preheader
loop.preheader:
%gep1 = getelementptr inbounds i32, i32* %ptr1, i64 1
br label %loop
; CHECK-LABEL: loop:
; CHECK-NOT: load
loop:
%phi1 = phi i32* [ %gep1, %loop.preheader ], [ %phi2, %loop.then ]
%val1 = load i32, i32* %phi1
br i1 false, label %loop.then, label %loop.if
loop.if:
%gep2 = getelementptr inbounds i32, i32* %gep1, i64 1
%val2 = load i32, i32* %gep2
%cmp = icmp slt i32 %val1, %val2
br label %loop.then
; CHECK-LABEL: loop.then
; CHECK: store i32 %[[VAL1]], i32* %phi2
loop.then:
%phi2 = phi i32* [ %ptr2, %loop ], [ %gep2, %loop.if ]
store i32 %val1, i32* %phi2
store i32 0, i32* %ptr1
br label %loop
}