[LLVMdev] Reassociating expressions involving GEPs

Stefanus Du Toit stefanus.dutoit at rapidmind.com
Wed Feb 25 12:12:45 PST 2009


On 30-Jan-09, at 6:14 PM, Eli Friedman wrote:
> On Fri, Jan 30, 2009 at 3:03 PM, Stefanus Du Toit
> <stefanus.dutoit at rapidmind.com> wrote:
>> The computation of %base then becomes loop-invariant and can be  
>> lifted out.
>>
>> What's the best way to add this optimization to LLVM?
>
> Probably the best place is LICM itself... only loop transformations
> are aware whether something is loop-invariant.

After considering this some more it does seem like Reassociate is a  
good place for this to go. While it's not explicitly aware of loops,  
it uses a ranking based on an RPO traversal of the CFG to give higher  
ranks to values the deeper they are in loop nests.

LICM will then be enabled to lift things out based on the reassociation.

> Although, I'm not completely sure the transformation is safe, at least
> the way you're stating it; unlike add, GEP has undefined overflow, so
> this isn't right in cases like %call == %tmp4 == INT_MIN.

Hmm, you raise a good point. There's a similar issue even without  
overflow, e.g. (gep p, (add -1, t)). The lang ref isn't exactly clear  
on this, but one interpretation says that if p points to the start of  
an array allocation, (gep p, -1) has undefined behaviour. Perhaps  
someone (Chris?) can clarify whether that's what's meant, or whether  
only loads and stores out of bounds are considered undefined. The  
sentences in question are:

"Note that it is undefined to access an array out of bounds: array and  
pointer indexes must always be within the defined bounds of the array  
type."

--
Stefanus Du Toit <stefanus.dutoit at rapidmind.com>
   RapidMind Inc.
   phone: +1 519 885 5455 x116 -- fax: +1 519 885 1463






More information about the llvm-dev mailing list