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:
parent
69aa3df088
commit
e70236adf8
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
38
test/Transforms/GVN/unreachable-predecessor.ll
Normal file
38
test/Transforms/GVN/unreachable-predecessor.ll
Normal 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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user