1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 10:42:39 +01:00

[MemorySSA] Update MSSA for non-conventional AA.

Summary:
Regularly when moving an instruction that may not read or write memory,
the instruction is not modelled in MSSA, so not action is necessary.
For a non-conventional AA pipeline, MSSA needs to explicitly check when
creating accesses, so as to not model instructions that may not read and
write memory.

Reviewers: george.burgess.iv

Subscribers: Prazek, sanjoy.google, llvm-commits

Tags: #llvm

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

llvm-svn: 372137
This commit is contained in:
Alina Sbirlea 2019-09-17 16:31:37 +00:00
parent dfed3b1781
commit 4e2e1fe44b
2 changed files with 33 additions and 1 deletions

View File

@ -1736,9 +1736,15 @@ MemoryUseOrDef *MemorySSA::createNewAccess(Instruction *I,
// FIXME: Replace this special casing with a more accurate modelling of
// assume's control dependency.
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I))
if (II->getIntrinsicID() == Intrinsic::assume || isa<DbgInfoIntrinsic>(II))
if (II->getIntrinsicID() == Intrinsic::assume)
return nullptr;
// Using a nonstandard AA pipelines might leave us with unexpected modref
// results for I, so add a check to not model instructions that may not read
// from or write to memory. This is necessary for correctness.
if (!I->mayReadFromMemory() && !I->mayWriteToMemory())
return nullptr;
bool Def, Use;
if (Template) {
Def = dyn_cast_or_null<MemoryDef>(Template) != nullptr;

View File

@ -0,0 +1,26 @@
; RUN: opt -disable-basicaa -print-memoryssa -disable-output %s 2>&1 | FileCheck %s
; Note: if @foo is modelled as a MemoryDef, this test will assert with -loop-rotate, due to MemorySSA not
; being preserved when moving instructions that may not read from or write to memory.
; CHECK-LABEL: @main
; CHECK-NOT: MemoryDef
define void @main() {
entry:
br label %for.cond120
for.cond120: ; preds = %for.body127, %entry
call void @foo()
br i1 undef, label %for.body127, label %for.cond.cleanup126
for.cond.cleanup126: ; preds = %for.cond120
unreachable
for.body127: ; preds = %for.cond120
%0 = load i16**, i16*** undef, align 1
br label %for.cond120
}
declare void @foo() readnone