[LLVMdev] Helping the optimizer along (__assume)

Chris Lattner clattner at apple.com
Thu Oct 23 21:15:38 PDT 2008


On Oct 23, 2008, at 12:23 AM, Duncan Sands wrote:

>>> 	%cond = i1 ...
>>> 	br i1 %cond, label %always, label %never
>>> never:
>>>   call void @llvm.abort()
>>> 	unreachable
>>>
>>> At codegen time @llvm.abort() can be lowered to
>>> nothing at all.  I'm not saying that this is my
>>> favorite solution, but it is simple.
>>
>> How is this different than just branching to unreachable?  Branching
>> to unreachable says that "this condition is true or else the program
>> has undefined behavior".  This means that the condition must be  
>> true :)
>
> The difference is that simplifycfg will remove the branch
> to %never if %never only contains unreachable.  The role
> of the intrinsic call is to fool simplifycfg into not
> doing this!

Sounds like the "bug" is in simplifycfg then.  The IR is already fully  
capable of expressing this without a new builtin.  Note that these  
annotations would have to be removed *sometime* in the optimizer  
pipeline, the policy decision is picking a place.

-Chris



More information about the llvm-dev mailing list