[cfe-dev] [LLVMdev] Clang devirtualization proposal

Sanjoy Das sanjoy at playingwithpointers.com
Sat Aug 1 14:05:50 PDT 2015


> The trouble is that we want to express ideas like "at this call site, but
> not others, I know that this call will not mutate state through this
> pointer". We can't express that with the llvm type system we have today.

Yes; to do that we'll effectively have to introduce some form of
quantification.

IOW: we'd have to have 4x the number of pointer types we have today --
each pointer type should be quantifiable with `noaccess`, `read`,
`write` and `readwrite` (the second one may not be very useful if we
do not want to support memory with only `PROT_WRITE`).

Functions and other consumers types would then have to be modified to
allow universal (and other forms of?) quantification.  I should be able to
write a function `@calc` of the type:

"forall $domain in { noaccess, read, write, readwrite }: i8* $domain -> i32"

Once we can quantify function types this way, we should be able to
call a function of the above type (say) with a `i8* read`.  The
compiler can then specialize / inline / otherwise optimize that
specific call to `@calc` with the assumption that all stores through a
pointer (in the context of this specific call) of type `i8* read` are
`unreachable`.

I agree that this is fairly complex, especially for a low level IR.
But the key problem with `readonly` is that there is no run-time
mirror of the `readonly`ness of an SSA value (we cannot implement a
`is_readonly` predicate to call at runtime), so we have to have it present in
the type system all the way.  `nonnull` or `dereferenceable` do not
have the same problem because they are run-time properties (though
implementing `is_dereferenceable` may be difficult in practice).

-- Sanjoy



More information about the cfe-dev mailing list