[LLVMdev] Call to address 0 gets removed

Paul Schlie schlie at comcast.net
Tue Jun 9 10:02:24 PDT 2009

> Dale Johannesen wrote:
>> Marius Wachtler wrote:
>> ...
>> The call to address 0 gets removed.
>> define i32 @t(i32 %a) noreturn nounwind readnone {
>> entry:
>>     unreachable
>> }
>> How can I prevent that the call is removed, without making the
>> function addr volatile?
>> Does anyone know which optimization removes it?
> Calling 0 is undefined behavior; the optimizer is within its rights to
> remove this.  Why do you want to call 0?

Although a C translation unit may arguably not assign a correspondingly
defined function as having a pointer value (address) comparing equal to
((void *) 0); it's not clear that the standard forbids the invocation of
such a function, nor does it seem like a good idea to silently strip any
such invocations especially if allowed to be specified; as to do so would
seemingly only mask potentially legitimate problems, and/or prevent that
intended from being performed although potentially relying on an undefined

(As for example, it's not hard to imagine that it may be desirable to allow
a machine which may trap such calls to do, and/or to allow the invocation of
some otherwise specified behavior although considered undefined by standard

More information about the llvm-dev mailing list