[llvm-dev] Early CSE clobbering llvm.assume

Mehdi Amini via llvm-dev llvm-dev at lists.llvm.org
Fri Jun 10 21:58:51 PDT 2016


Hi,

> On Jun 10, 2016, at 7:00 PM, Lawrence, Peter via llvm-dev <llvm-dev at lists.llvm.org> wrote:
> 
> Daniel,
>             My point is this,
>  
> If (cond) ---- optimizer takes advantage of knowing cond == true within the “then” part
> Assert(cond) ---- optimizer takes advantage of knowing cond == true for the rest of the scope
> Assume(cond) ---- optimizer takes advantage of knowing cond == true for the rest of the scope
>  
> If we aren’t implementing these in a consistent manner (like using an intrinsic for one but not the others)
> Then we aren’t doing a good job of engineering,

It is not clear cut for me.
First the Assert(cond) is not an llvm construct AFAIK. At the source level it is usually a macro that turns into `if (!Cond) abort()` and thus can be reduced to your first case.
(Also I believe it disappears in optimized build and the optimizer/LLVM will never see the test).

And second, it seems to me that there is a fundamental difference between the first and last case: in the first case the optimizer deduces some properties from the control flow (i.e. cond==true within the "then" part), while in the assume case it is an information that the optimizer can't deduce itself, and that is *not related to the control flow* but is present thanks to a hint from the programmer (or the front-end).

It is not clear that these two sources of information can be reconcile easily with a common representation.

> IE we should be able to get “assume” to work for free if we are doing it right.

I'm not sure what you mean by "work for free"?

-- 
Mehdi

>  
> Asking “how do I get this intrinsic to work” is perhaps the wrong question,
> Perhaps the right question is, how do we represent assume so that we get it for free.
>  
>  
> ---Peter Lawrence.
>  
>  
>  
> From: Daniel Berlin [mailto:dberlin at dberlin.org] 
> Sent: Friday, June 10, 2016 6:32 PM
> To: Lawrence, Peter <c_plawre at qca.qualcomm.com>
> Cc: llvm-dev at lists.llvm.org
> Subject: Re: [llvm-dev] Early CSE clobbering llvm.assume
>  
> We do, implicitly, because assert generates if conditions. Or at least, gvn knows how to propagate that implicit info. We can do better by exposing it more, most likely
> 
> On Fri, Jun 10, 2016, 5:59 PM Lawrence, Peter <c_plawre at qca.qualcomm.com <mailto:c_plawre at qca.qualcomm.com>> wrote:
> Daniel,
>              Well then my next (dumb?) question is why aren’t we using source level assert information
> For optimization ?
>  
> --Peter Lawrence.
>  
>  
> From: Daniel Berlin [mailto:dberlin at dberlin.org <mailto:dberlin at dberlin.org>] 
> Sent: Friday, June 10, 2016 5:39 PM
> To: Lawrence, Peter <c_plawre at qca.qualcomm.com <mailto:c_plawre at qca.qualcomm.com>>
> Cc: llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> Subject: Re: [llvm-dev] Early CSE clobbering llvm.assume
>  
>  
>  
> On Fri, Jun 10, 2016 at 5:34 PM, Lawrence, Peter via llvm-dev <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
> My (dumb?) question would be:  why is llvm.assume being handled any differently than llvm.assert ?
>  
> There is no llvm.assert intrinsic, so i'm not sure what you mean here. Care to give an example?
>  
> Other than one trapping and one not-trapping, they should be identical, in both cases they are giving
> The optimizers information,  and that shouldn’t be any different from being inside an “if” statement with the same condition ?
>  
>  
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160610/6b172e49/attachment.html>


More information about the llvm-dev mailing list