[LLVMdev] LICM/store-aliasing of global loads
Stefanus Du Toit
stefanus.dutoit at rapidmind.com
Tue Jul 22 14:51:04 PDT 2008
On 22-Jul-08, at 1:22 PM, Dan Gohman wrote:
> On Jul 21, 2008, at 3:51 PM, Stefanus Du Toit wrote:
>> - build a custom alias analysis pass that indicates that these loads
>> never alias with any stores in a given function
>> - declare these globals as external constants within the module
>
> If you can convince yourself that no interprocedural optimization
> will ever get in trouble, the second approach here sounds reasonable
> and simpler. But if the values aren't really constant, it may be
> difficult to be sure.
Yes, we definitely can be sure.
> Building a custom alias analysis is reasonable too.
Right, and is helpful for other reasons.
> One way to fix this would be to have AliasSetTracker pretend that
> pointers to constant memory never alias anything. That's a little
> sneaky though, so offhand I think an approach such as what's in
> your patch is better.
That does seem a little... unethical? :)
At the very least it seems this should still return must-alias results
correctly, otherwise this could hurt optimizations (I assume).
I was going to suggest that at least getModRefInfo should handle this
for stores, but it looks like it already does.
>> If I apply the patch found further down, LICM moves the loads out (as
>> expected), but of course this is a fairly specific fix.
>
> Slightly better than checking for GlobalVariabls directly
> is to call the AliasAnalysis' pointsToConstantMemory method.
> BasicAliasAnalysis' implementation of that does exactly the same
> thing,
> checking for constant GlobalVariables, but it would allow alias
> analyses to do more sophisticated things. Could you submit a patch
> for this?
Ah, I was going to ask if there was such a method.
I'll submit a patch once I'm done testing it.
>> What's the right way to handle this? Should Basic AA handle this
>> case?
>> Will the RA be aware that it can remat these loads or do I need to do
>> something else to allow it to know this? Will the scheduler be aware
>> that it can reorder them?
>
> It would be nice to have an AA that's smart enough to do things
> like this. However for now, having code use
> AliasAnalysis::pointsToConstantMemory should cover many of the
> obvious cases.
OK, are there any other obvious places this should go? I expect
optimizations that use getModRefInfo on stores rather than alias sets
won't need any changes.
>> Obviously I can also move the loads to the entry block of the
>> function, but that does not address the RA/scheduling issues and is
>> difficult to do in general due to some additional semantics in our
>> frontend.
>
> In the scheduling department, LLVM is not yet using any alias
> information. You can experiment with the -combiner-alias-analysis and
> -combiner-global-alias-analysis options, which use AliasAnalysis
> queries and do a pretty good job, but aren't very efficient and not
> very widely tested. Ideally we'd like to do something better here.
Could you expand on this a bit (or point me to past discussions/...)?
This can be pretty important on architectures like Cell SPU.
> For register allocation, LLVM currently has some simple hooks which
> individual targets use to specify which loads are rematerializable.
> See isReallyTriviallyReMaterializable. Currently this code is all
> target-specific and doesn't use AliasAnalysis information, but I
> think it could be reasonably generalized to use the new
> MachineMemOperand information to be less target-dependent and to
> make at least AliasAnalysis::pointsToConstantMemory queries.
OK, I will have a look. I assume the reference to M_REMATERIALIZABLE
in the comment for it should really be TID::Rematerializable? I also
noticed that the documentation for
TargetInstrDesc::isRematerializable() says "This flag is deprecated,
please don't use it anymore" -- could you explain what replaces it?
Stefanus
--
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