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:
parent
dfed3b1781
commit
4e2e1fe44b
@ -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;
|
||||
|
26
test/Analysis/MemorySSA/loop-rotate-disablebasicaa.ll
Normal file
26
test/Analysis/MemorySSA/loop-rotate-disablebasicaa.ll
Normal 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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user