[PATCH] D26659: [MemorySSA] Invoke the right getModRefInfo check in `instructionClobbersQuery` when UseLoc is passed.
Daniel Berlin via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 23 10:48:25 PST 2016
LGTM
On Tue, Nov 22, 2016 at 7:23 PM, bryant <3.14472+reviews.llvm.org at gmail.com>
wrote:
> bryant updated this revision to Diff 79016.
> bryant added a comment.
>
> Added clobber tests.
>
>
> Repository:
> rL LLVM
>
> https://reviews.llvm.org/D26659
>
> Files:
> lib/Transforms/Utils/MemorySSA.cpp
> unittests/Transforms/Utils/MemorySSA.cpp
>
>
> Index: unittests/Transforms/Utils/MemorySSA.cpp
> ===================================================================
> --- unittests/Transforms/Utils/MemorySSA.cpp
> +++ unittests/Transforms/Utils/MemorySSA.cpp
> @@ -14,6 +14,7 @@
> #include "llvm/IR/Dominators.h"
> #include "llvm/IR/IRBuilder.h"
> #include "llvm/IR/Instructions.h"
> +#include "llvm/IR/IntrinsicInst.h"
> #include "llvm/IR/LLVMContext.h"
> #include "gtest/gtest.h"
>
> @@ -484,3 +485,43 @@
> EXPECT_EQ(Walker->getClobberingMemoryAccess(NewLoadAccess),
> LoadClobber);
> EXPECT_EQ(NewLoadAccess->getDefiningAccess(), LoadClobber);
> }
> +
> +TEST_F(MemorySSATest, InstClobbersMemLoc) {
> + F = Function::Create(FunctionType::get(B.getVoidTy(),
> + {B.getInt8PtrTy(),
> B.getInt8PtrTy()},
> + false),
> + GlobalValue::ExternalLinkage, "F", &M);
> + B.SetInsertPoint(BasicBlock::Create(C, "", F));
> + Argument *P = &*F->arg_begin();
> + Argument *Q = &*std::next(F->arg_begin());
> +
> + Type *Int64 = Type::getInt64Ty(C);
> +
> + AllocaInst *A =
> + B.CreateAlloca(Type::getInt128Ty(C), ConstantInt::get(Int64, 1),
> "A");
> +
> + auto *M0 = B.CreateMemCpy(A, P, ConstantInt::get(Int64, 16), 1);
> + auto *M1 =
> + cast<MemCpyInst>(B.CreateMemCpy(Q, A, ConstantInt::get(Int64, 16),
> 1));
> + auto *M2 =
> + cast<MemCpyInst>(B.CreateMemCpy(Q, A, ConstantInt::get(Int64, 16),
> 1));
> + auto *M3 =
> + cast<MemCpyInst>(B.CreateMemCpy(Q, P, ConstantInt::get(Int64, 16),
> 1));
> +
> + setupAnalyses();
> + MemorySSA &MSSA = *Analyses->MSSA;
> + MemorySSAWalker &Walker = *Analyses->Walker;
> +
> + // M1 obviously clobbers M2 -- on the dest loc.
> + EXPECT_EQ(MSSA.getMemoryAccess(M1), Walker.
> getClobberingMemoryAccess(M2));
> + // But only M0 clobbers M2 on its source loc. In other words,
> + // instructionClobbersQuery must call getModRefInfo(ImmutableCallSite,
> const
> + // MemoryLocation).
> + EXPECT_EQ(MSSA.getMemoryAccess(M0),
> + Walker.getClobberingMemoryAccess(MSSA.getMemoryAccess(M2),
> + MemoryLocation::getForSource(
> M2)));
> + // FIXME: AA should know that memcpy operands never overlap.
> + EXPECT_NE(MSSA.getLiveOnEntryDef(),
> + Walker.getClobberingMemoryAccess(MSSA.getMemoryAccess(M3),
> + MemoryLocation::getForSource(
> M3)));
> +}
> Index: lib/Transforms/Utils/MemorySSA.cpp
> ===================================================================
> --- lib/Transforms/Utils/MemorySSA.cpp
> +++ lib/Transforms/Utils/MemorySSA.cpp
> @@ -235,7 +235,7 @@
> }
>
> ImmutableCallSite UseCS(UseInst);
> - if (UseCS) {
> + if (UseCS && UseLoc == MemoryLocation()) {
> ModRefInfo I = AA.getModRefInfo(DefInst, UseCS);
> return I != MRI_NoModRef;
> }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161223/0f69d5d9/attachment.html>
More information about the llvm-commits
mailing list