On Jan 5, 2008, at 12:28 AM, Chris Lattner wrote: > > On Jan 4, 2008, at 11:21 PM, Bill Wendling wrote: > >> On Jan 4, 2008, at 11:02 PM, Chris Lattner wrote: >>> You aren't looking for loads *from the global*, you're looking for >>> loads from the *stub for the global*, which are always invariant. >>> You >>> just need to know whether the load is from a global or from its >>> stub. >>> >> Okay. I just don't know how to check that it's a load from a *stub* >> for the global. :-) > > I am not 100% sure, but I think that X86Subtarget::GVRequiresExtraLoad > is the place to start looking.
Right. If it's a load from GV and GVRequiresExtraLoad() returns true then it's a load from a stub. Here is something to consider for further enhancement. There are potentially other GV loads which can be side effect free though. As the comment says, if the value in the GV isn't redefined (in the loop), then it can be moved. Should there be some kind of callback function provided by caller of isReallySideEffectFree() that checks if a register or a GV operand is considered side effect free? In the case of LICM, if a register or GV operand is considered a loop invariant, then the instruction is really side effect free. In the case of remat, if an operand is "available", then it's side effect free, etc. etc. BTW, what do we do about volatile loads? I don't think the property is transferred to target instructions. Or perhaps volatile property should be on the location (GV) instead of the instruction? Evan > > -Chris > _______________________________________________ > llvm-commits mailing list > llvm-commits@cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits