On Thu, 6 Feb 2014, Richard Biener wrote:

> 
> This re-writes posix_memalign calls to
> 
>       posix_memalign (ptr, align, size);
>       tem = *ptr;
>       tem = __builtin_assume_aligned (align);
>       *ptr = tem;
> 
> during CF lowering (yeah, ok ...) to make alignment info accessible
> to SSA based analysis.
> 
> I have to adjust the added alias-31.c testcase again because with
> the above we end up with
> 
>   <bb 2>:
>   res_3 = *p_2(D);
>   posix_memalign (&q.q1, 128, 512);
>   _5 = MEM[(void *)&q];
>   _6 = __builtin_assume_aligned (_5, 128);
>   MEM[(void *)&q] = _6;
>   posix_memalign (&q.q2, 128, 512);
>   _17 = res_3 + res_3;
>   _20 = _17 + 1;
>   _23 = _20 + 2;
>   q ={v} {CLOBBER};
>   return _23;
> 
> after early DCE.  This is because DCE only has "baby" DSE built-in
> and the store to MEM[(void *)&q] which it doesn't remove keeps
> the rest live.  DSE removes the store and the DCE following it
> the rest.
> 
> Not sure if more sophisticated lowering is wanted here.  Special-casing
> &... operands to posix_memalign as stated in the PR, generating
> for posix_memalign (&ptr, 128, 512);
> 
>   posix_memalign (&tem, 128, 512);
>   reg = tem;
>   reg = __builtin_assume_aligned (reg, 128);
>   ptr = reg;
> 
> instead would be possible (hoping for ptr to become non-address-taken).

Ok, doing that was simple and avoids pessimizing the testcase.

Richard.

Reply via email to