[LLVMdev] [RFC] SCEV Enhancements
Dan Gohman
gohman at apple.com
Fri Feb 24 11:03:52 PST 2012
On Feb 24, 2012, at 9:53 AM, David A. Greene wrote:
> Dan Gohman <gohman at apple.com> writes:
>
>>> These enhancements are critical for us because of the way our frontends
>>> work (less than ideal but we have to deal with it), due to some language
>>> quirks (casting in C, odd Fortran constructs, etc.) and because users
>>> sometimes stretch the boundaries of good taste :).
>>>
>>> Is this a reasonable approach? Is this acceptable to upstream?
>>
>> Right now, the main strategy is:
>>
>> - If front-ends are using ptrtoint+add+inttoptr to do addressing,
>> convert them to use bitcast+getelementptr+bitcast instead. You
>> can do the getelementptr with i8* so there's no scaling [0]
>> if all your offsets are raw byte offsets.
>
> We already do that as much as possible but it doesn't cover every case
> currently. I will see if we can cover more cases.
Ok. This is generally worthwhile for other reasons as well.
>
>> - If users are casting pointers to integers, do one or more of:
>> (a) Tell them to fix their code.
>
> Not possible, unfortunately.
>
>> (b) Try to convert the code to use getelementptrs in instcombine.
>
> We added a pass to do this but it doesn't get everything. I'll see if
> we can enhance it.
As above, this generally has other benefits too.
>> (c) Give up on higher-level optimizations, because such low-level
>> code is can be considered to have already been hand-optimized.
>
> We can't do that either.
>
>> This is a compromise, but there are several reasons why it makes
>> sense -- other passes like getelementptrs too, and it reduces complexity
>> to avoid having everything understand inttoptr when most people
>> don't need it. If you want to change this, it'd be helpful to show
>> a code example to show motivation.
>
> Sure. I'll try tweaking instcombine first and see where that gets us.
> I have some pretty good testcases. I'd be thrilled if we could just
> dump these SCEV changes. That's why I did the original GEP instcombine
> stuff. I actually ripped out the SCEV changes after that and
> performance tanked. :(
Ok, this seems the best approach. If you hit something you can't fix,
we can re-evaluate.
>> [0] or i1* if you feel like being a purist ;-).
>
> Err? What are the scaling semantics for i1? I don't immediately see
> that it should be the same as i8.
Array elements are guaranteed to start on address-unit boundaries, so i1
elements get padded to the nearest address-unit size.
Dan
More information about the llvm-dev
mailing list