[PATCH] D26127: [MemorySSA] Repair AccessList invariants after insertion of new MemoryUseOrDef.

bryant via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 30 13:28:34 PDT 2016


bryant added a comment.

>> bryant created this revision.
>>  bryant added reviewers: dberlin, george.burgess.iv.
>>  bryant added a subscriber: llvm-commits.
>>  bryant set the repository for this revision to https://reviews.llvm.org/diffusion/L/ LLVM.
> 
> 
> 
>> An invariant of AccessLists is that the defining access of a Use or Def is the nearest preceding Def node.
> 
> False
>  This is correct for def's but not for uses.
> 
>> For instance, within a BasicBlock:
> 
> 
> 
>>   0 = MemoryDef(liveOnEntry)
>>   1 = MemoryDef(0)
>>   2 = MemoryUse(n)
>>   3 = MemoryDef(m)
> 
> 
> 
>> 1 is the nearest parent Def of 2 and 3, and m and n must be 1.
> 
> Given the above, this is incorrect.
>  n may be 0
> 
> IE the following is perfectly legal
> 
>   0 = MemoryDef(liveOnEntry)
>   1 = MemoryDef(0)
>   2 = MemoryUse(0)
>   3 = MemoryDef(1)
>     

Thanks for clearing up my misunderstanding regarding MemoryUses.

>> This patch simplifies the interfaces of createMemoryAccessBefore/After, and augments them to maintain this invariant.
> 
> 
> 
>> Additionally, when inserting a new Def after an existing Def, there is currently no (clean) way to update the users of the old Def to use the new Def.
> 
> RAUW works exactly to do this case.

I'm not so sure that it's sufficient. Suppose, for instance, that I wanted to insert a MemoryDef between 1 and 2 in the below AccessList:

  0 = MemoryDef(liveOnEntry)
  1 = MemoryDef(0)
  2 = MemoryDef(1)
  3 = MemoryUse(1)

Invoking createMemoryAccess followed by RAUW of 1's uses with 4 would result in:

  0 = MemoryDef(liveOnEntry)
  1 = MemoryDef(0)
  4 = MemoryDef(4)   ; <=======
  2 = MemoryDef(4)
  3 = MemoryUse(4)

So RAUW needs to happen before setting 4's defining access to 1, but this isn't possible with the current createDefiningAccess. What other options are there? RAUW with a bogus Def, create, then re-RAUW to the newly created Def? I feel like I'm missing something obvious, so clarification would be much appreciated.


Repository:
  rL LLVM

https://reviews.llvm.org/D26127





More information about the llvm-commits mailing list