[llvm-commits] [llvm] r84038 - in /llvm/trunk: lib/Analysis/BasicAliasAnalysis.cpp test/Analysis/BasicAA/phi-aa.ll
Chris Lattner
clattner at apple.com
Tue Oct 13 15:31:41 PDT 2009
On Oct 13, 2009, at 3:02 PM, Evan Cheng wrote:
> Author: evancheng
> Date: Tue Oct 13 17:02:20 2009
> New Revision: 84038
>
> URL: http://llvm.org/viewvc/llvm-project?rev=84038&view=rev
> Log:
> Teach basic AA about PHI nodes. If all operands of a phi NoAlias
> another value than it's safe to declare the PHI NoAlias the value.
> Ditto for MustAlias.
Thoughts:
Please manually reduce the testcase (or better yet, synthesize one
from scratch). The basicaa tests are almost all very small and
precise, e.g. 2007-08-01-NoAliasAndCalls.ll. Also, please don't add
new uses of the malloc instruction, use alloca instead. Something
like this (in hand written IR) should be enough:
int X;
int Y;
int Z;
void foo(int cond) {
int *P = cond ? &X : &Y;
int tmp = Z;
*P = 123;
return tmp-Z;
}
Did you look at the compile time impact of this on something like GVN
on 403.gcc?
Because you only have one 'VisitedPHIs' set, you are conflating PHIs
walked on the LHS with phis walked on the RHS. I guess it probably
doesn't matter because if the same phi shows up on both sides, they
definitely alias. This is worth mentioning in a comment somewhere.
> @@ -218,7 +222,16 @@
> // aliasGEP - Provide a bunch of ad-hoc rules to disambiguate a
> GEP instruction
> // against another.
> AliasResult aliasGEP(const Value *V1, unsigned V1Size,
> - const Value *V2, unsigned V2Size);
> + const Value *V2, unsigned V2Size,
> + SmallSet<const Value*, 16> &VisitedPHIs);
> +
> + AliasResult aliasPHI(const Value *V1, unsigned V1Size,
> + const Value *V2, unsigned V2Size,
> + SmallSet<const Value*, 16> &VisitedPHIs);
> +
> + AliasResult aliasCheck(const Value *V1, unsigned V1Size,
> + const Value *V2, unsigned V2Size,
> + SmallSet<const Value*, 16> &VisitedPHIs);
Somewhat gross, but I think it would be better to make VisitedPHIs be
an instance variable in the BasicAA class. Just assert that it is
empty on entry into and exit out of the top level "alias" method.
> +AliasAnalysis::AliasResult
> +BasicAliasAnalysis::aliasPHI(const Value *V1, unsigned V1Size,
V1 is statically required to be a PHI, it would be better for it to be
declared as 'const PHINode*'. Also, the VisitedPHI set should be
PHINode not Value as element type.
> + SmallSet<Value*, 4> UniqueSrc;
> + SmallVector<Value*, 4> V1Srcs;
> + const PHINode *PN = cast<PHINode>(V1);
this cast<> should be removed.
> + // If all sources of the PHI node NoAlias or MustAlias V2, then
> returns
> + // NoAlias / MustAlias. Otherwise, returns MayAlias.
> + AliasResult Alias = aliasCheck(V1Srcs[0], V1Size, V2, V2Size,
> VisitedPHIs);
if this call returns mayalias, you should exit early. mayalias is the
most common result.
-Chris
More information about the llvm-commits
mailing list