[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 17:01:56 PDT 2017


On Wed, Jun 7, 2017 at 3:45 PM, Alina Sbirlea <alina.sbirlea at gmail.com>
wrote:

> Could you clarify what to assert for?
>
> Yeah, i wasn't thinking straight.


> If there is a definition prior to the current one in this block, it
> returns that one (&*Iter) - no point in asserting.
>

Well the original point of asserting at all was that updater is mucking
with the lists as it does this, but yes, it wasn't doing a lot :)


> Otherwise, it falls through and will return nullptr. I'm assuming assert
> before the fall through, where Iter == Defs->rend(), but the if condition
> is checking this (and obviously, dereferencing like in the original assert
> will crash).
> I'm a bit confused...more details please?
>
> Just ignore me :)


>
> On Wed, Jun 7, 2017 at 1:58 PM, Daniel Berlin via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> 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
>>>
>>>
>>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170607/6f353091/attachment.html>


More information about the llvm-commits mailing list