[PATCH] D25969: [AliasSetTracker] Make AST smarter about intrinsics that don't actually affect memory.

via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 26 14:30:27 PDT 2016


On 2016-10-26 15:39, Daniel Berlin via llvm-commits wrote:
> On Wed, Oct 26, 2016 at 12:28 PM, Chad Rosier
> <mcrosier at codeaurora.org> wrote:
> 
>> mcrosier added a comment.
>> 
>> In https://reviews.llvm.org/D25969#580042 [1], @mcrosier wrote:
>> 
>>> In https://reviews.llvm.org/D25969#579967 [2], @nemanjai wrote:
>>> 
>>>> This caused a failure on all PPC machines I have access to:
>>>>  AddressSanitizer-powerpc64le-linux ::
>> TestCases/use-after-scope-loop-bug.cc
>>> 
>>> 
>>> Looking now..
>> 
>> I believe I've figured out the underlying problem.  In short, LICM
>> is relying on lifetime markers to prevent loads/stores from being
>> moved out of a particular scope.
> 
> Can you file more details on a bug somewhere? This seems pretty
> broken, but also, without your patch:
> 
> dannyb at dannyb-macbookpro3 [12:32:05]
> [~/sources/llvm-clean/lib/Transforms/Scalar] [mssa-batch-renamer-2]
> -> % grep -i lifetime LICM.cpp
> 

Right.  LICM doesn't explicitly check for the lifetime intrinsics.  
Rather, the lifetime intrinsics cause the AliasSetTracker to collapse 
sets, which indirectly changes the behavior of LICM with uses ASTs.

>> From the broken test case:
>> int main() {
>> 
>> // Variable goes in and out of scope.
>> for (int i = 0; i < 3; ++i) {
>> int x[3] = {i, i, i};
>> p = x + i;
>> }
>> return *p;  // BOOM
>> 
>> }
>> 
>> LICM will sink the stores to x[3] after the loop, which is obviously
>> incorrect.
> 
> I don't see why?

I assumed creating stores to the array after the lifetime of the array 
had ended was incorrect, but I guess that's not really true given the 
alloc does not live inside the loop.

> First, let's ignore the c-semantics, it's broken as-written in c,
> since the variable is dead whether you sink the stores or not.  (ASAN
> is a separate issue and should disable moving past lifetime markers or
> something)
> 
> Assuming p is a pointer, sinking the stores to before *p is just as
> fine as it is now, as long as you move the lifetime start and end
> markers to go with it (or drop them).

That sounds reasonable.

> 
> I presume the alloca does not occur in the loop, only the lifetime
> start and end.

Correct.

> In particular, you should be able to simply drop all lifetime start
> and end, and get the same result.
> 
> IE lifetime start and end do not serve as a dependence here, only
> metadata. If the only thing preventing LICM is the lifetime markers,
> that's very wrong since they are non-guaranteed metadata

Yes, I agree.  That was the intend of the patch, but I didn't foresee th

> 
>> I've reverted the change in r285227.  Sorry for the breakage.
> 
> You should be able to fix this simply by either
> 1. dropping the lifetime markers (non-ideal) of things you sink.
> or
> 2.  extending the lifetime markers appropriately.
> 
> The algorithm for that is that when you eliminate or sink things past
> them, you move the end to wherever the lowest point you sunk to is.
> You move starts to a block that post-dominates both the new end and
> the old end.

Honestly, this is something I saw in passing and I'm not sure I want to 
tackle this problem at th e moment.  However, I'll make sure to create a 
details PR in the morning.  Perhaps, I'll have some free time in the 
future.

Thanks for the feedback Danny.

  Chad

> 
>> Repository:
>> rL LLVM
>> 
>> https://reviews.llvm.org/D25969 [3]
> 
> 
> 
> Links:
> ------
> [1] https://reviews.llvm.org/D25969#580042
> [2] https://reviews.llvm.org/D25969#579967
> [3] https://reviews.llvm.org/D25969
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list