[PATCH] D33950: [mssa] If there is no definition in a block prior to an inserted use, return nullptr.

Daniel Berlin via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 7 13:58:17 PDT 2017


Could you move the original assert to the def list case?

On Wed, Jun 7, 2017, 9:47 AM Alina Sbirlea via Phabricator <
reviews at reviews.llvm.org> wrote:

> This revision was automatically updated to reflect the committed changes.
> Closed by commit rL304926: [mssa] Fix case when there is no definition in
> a block prior to an inserted use. (authored by asbirlea).
>
> Changed prior to commit:
>   https://reviews.llvm.org/D33950?vs=101625&id=101760#toc
>
> Repository:
>   rL LLVM
>
> https://reviews.llvm.org/D33950
>
> Files:
>   llvm/trunk/lib/Analysis/MemorySSAUpdater.cpp
>   llvm/trunk/unittests/Analysis/MemorySSA.cpp
>
>
> Index: llvm/trunk/lib/Analysis/MemorySSAUpdater.cpp
> ===================================================================
> --- llvm/trunk/lib/Analysis/MemorySSAUpdater.cpp
> +++ llvm/trunk/lib/Analysis/MemorySSAUpdater.cpp
> @@ -124,17 +124,12 @@
>          return &*Iter;
>      } else {
>        // Otherwise, have to walk the all access iterator.
> -      auto Iter = MA->getReverseIterator();
> -      ++Iter;
> -      while (&*Iter != &*Defs->begin()) {
> -        if (!isa<MemoryUse>(*Iter))
> -          return &*Iter;
> -        --Iter;
> -      }
> -      // At this point it must be pointing at firstdef
> -      assert(&*Iter == &*Defs->begin() &&
> -             "Should have hit first def walking backwards");
> -      return &*Iter;
> +      auto End = MSSA->getWritableBlockAccesses(MA->getBlock())->rend();
> +      for (auto &U : make_range(++MA->getReverseIterator(), End))
> +        if (!isa<MemoryUse>(U))
> +          return cast<MemoryAccess>(&U);
> +      // Note that if MA comes before Defs->begin(), we won't hit a def.
> +      return nullptr;
>      }
>    }
>    return nullptr;
> Index: llvm/trunk/unittests/Analysis/MemorySSA.cpp
> ===================================================================
> --- llvm/trunk/unittests/Analysis/MemorySSA.cpp
> +++ llvm/trunk/unittests/Analysis/MemorySSA.cpp
> @@ -244,6 +244,52 @@
>    MSSA.verifyMemorySSA();
>  }
>
> +TEST_F(MemorySSATest, SinkLoad) {
> +  F = Function::Create(
> +      FunctionType::get(B.getVoidTy(), {B.getInt8PtrTy()}, false),
> +      GlobalValue::ExternalLinkage, "F", &M);
> +  BasicBlock *Entry(BasicBlock::Create(C, "", F));
> +  BasicBlock *Left(BasicBlock::Create(C, "", F));
> +  BasicBlock *Right(BasicBlock::Create(C, "", F));
> +  BasicBlock *Merge(BasicBlock::Create(C, "", F));
> +  B.SetInsertPoint(Entry);
> +  B.CreateCondBr(B.getTrue(), Left, Right);
> +  B.SetInsertPoint(Left, Left->begin());
> +  Argument *PointerArg = &*F->arg_begin();
> +  B.SetInsertPoint(Left);
> +  B.CreateBr(Merge);
> +  B.SetInsertPoint(Right);
> +  B.CreateBr(Merge);
> +
> +  // Load in left block
> +  B.SetInsertPoint(Left, Left->begin());
> +  LoadInst *LoadInst1 = B.CreateLoad(PointerArg);
> +  // Store in merge block
> +  B.SetInsertPoint(Merge, Merge->begin());
> +  B.CreateStore(B.getInt8(16), PointerArg);
> +
> +  setupAnalyses();
> +  MemorySSA &MSSA = *Analyses->MSSA;
> +  MemorySSAUpdater Updater(&MSSA);
> +
> +  // Mimic sinking of a load:
> +  // - clone load
> +  // - insert in "exit" block
> +  // - insert in mssa
> +  // - remove from original block
> +
> +  LoadInst *LoadInstClone = cast<LoadInst>(LoadInst1->clone());
> +  Merge->getInstList().insert(Merge->begin(), LoadInstClone);
> +  MemoryAccess * NewLoadAccess =
> +      Updater.createMemoryAccessInBB(LoadInstClone, nullptr,
> +                                     LoadInstClone->getParent(),
> +                                     MemorySSA::Beginning);
> +  Updater.insertUse(cast<MemoryUse>(NewLoadAccess));
> +  MSSA.verifyMemorySSA();
> +  Updater.removeMemoryAccess(MSSA.getMemoryAccess(LoadInst1));
> +  MSSA.verifyMemorySSA();
> +}
> +
>  TEST_F(MemorySSATest, MoveAStore) {
>    // We create a diamond where there is a in the entry, a store on one
> side, and
>    // a load at the end.  After building MemorySSA, we test updating by
> moving
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170607/6a338ef1/attachment.html>


More information about the llvm-commits mailing list