[llvm-commits] [PATCH] Invariants (and Assume Aligned) - LLVM

Nuno Lopes nunoplopes at sapo.pt
Thu Dec 6 14:57:02 PST 2012


> This patch assumes that asserted conditions are globally true. This
> significantly restricts their usefulness. Everything's easy if we just
> think about asserting properties for an entire function:
>
> void foo(void *p) {
>  __builtin_assume(p is aligned or whatever);
>  use(p);
> }
>
> However, as soon as a function like this can get inlined into a
> perfectly reasonable callsite like this:
>
>  if (p is aligned or whatever)
>    foo(p);
>  else
>    do_something_slow(p);
>
> it doesn't work anymore, because it would apply to all uses of p in
> the caller, including uses where p isn't aligned.
>
> It seems that the intuitive semantics would be that an assertion
> should hold for all the uses dominated by an assertion statement.
> Requiring dominator trees for anything that wants to use assertion
> information would unfortunately keep it out of instcombine, where it
> would be very useful, so this is a significant problem. The
> tentatively established way to solve this kind of problem is to make
> the assertion return a copy of the value it is asserting a predicate
> about. Something like this:
>
>  pp = __buiiltin_assume(p, p != 0);

That starts sounding like SSI's pi nodes:
p = ...;
if (...) {
    pp = pi(p);
    use (pp)
}
assume(pp != 0);


Then assumptions can be global again, since copies of vars are created where 
necessary.


> The other big topic to discuss in this patch is ephemeral values. This
> would be a significant landmark change.
>
> Ephemeral values add uses of values to the program which wouldn't
> otherwise be there. This has its purpose of course, but also its
> downsides, as it will interfere with use_empty() and hasOneUse()
> optimizations (much of instcombine, etc.). It could easily be a
> dickens for indvars and lsr, unless, again, it gets the right
> special-case handling. It'll need special-casing in several analyses
> which walk def-use lists. The new EphemeralValues analysis pass will
> make the special-casing less painful, but it's still a value map that
> has to be passed around and kept current.

Yes, I'm also worried about the burden for each optimization.
On the other hand, the code for invariants is single-path, so it's not that 
bad, since e.g. it won't confuse the single-BB-loop kind of optimizations.
Some time ago we discussed the creation of a separate mini-language to 
specify invariants and other stuff that could be used in metadata. I think 
debug info was another potential client for this language. As well as 
assertions about buffer sizes. But it's a big project..

BTW, I think ephemeral calls should be limited to readnone (readonly?) 
functions. Stating assumptions and get side-effects at the same time doesn't 
really make sense. And assume() may or may not be deleted in between.

Nuno 




More information about the llvm-commits mailing list