[LLVMdev] Helping the optimizer along (__assume)
Mike Stump
mrs at apple.com
Thu Oct 23 09:14:32 PDT 2008
On Oct 23, 2008, at 3:40 AM, Matthijs Kooijman wrote:
> So, to really be able to encode this data, one could think of having
> an
> "assume" intrinsic, i.e.:
>
> %cond = i1 ...
> call void @llvm.assume( i1 %cond )
I like this the best.
> Optimization passes won't just delete this, but we could teach
> codegen that
> this intrinsic is not generated into any code. However, this still
> doesn't
> completely solve the problem indicated at the first point above. If
> %cond is
> provably true, we will end up with
>
> call void @llvm.assume( i1 true )
No, trivially the optimizer can be taught to not do this, if we don't
want it to. The optimizer can see that this is @llvm.assume by
checking the spelling (code). It all comes down to how much memory
you want to burn to remember things that at one time you knew about
the code and the likelihood of the utility of knowing that. Put
another way, if there are any downstream consumers of the information.
If we do:
assert (p!=0);
(base*)p;
when base is a virtual base, this must generate code to preserve 0
values:
if (p != 0)
p += *(int*)(((char*)p)+n)
this does the conversion if p is non-zero, and if it is 0, it leaves
it alone.
And for any reason we can figure out that p is not zero, we then can
eliminate the assert as it were, and remove the conditional branch
(nice win). If there are no more down stream consumers of the
information, the information itself can die at this optimization pass,
and save the memory. If this isn't the last consumer of the
information, we can leave the assert untouched, remove the condition.
For example, after -O4 inlining, there might be another virtual base
conversion then exposed, and we figure out:
assert (p!=0)
p += *(int*)(((char*)p)+n)
if (p != 0)
p += *(int*)(((char*)p)+n1)
should be optimized as:
assert (p!=0)
p += *(int*)(((char*)p)+n)
p += *(int*)(((char*)p)+n1)
as we can know that the first p += vbase adjustment cannot wrap back
to 0.
More information about the llvm-dev
mailing list