[llvm] r180068 - Struct-path aware TBAA: update getMostGenericTBAA

Rafael EspĂ­ndola rafael.espindola at gmail.com
Tue Apr 23 06:46:42 PDT 2013


testcase?

On 22 April 2013 19:00, Manman Ren <mren at apple.com> wrote:
> Author: mren
> Date: Mon Apr 22 18:00:44 2013
> New Revision: 180068
>
> URL: http://llvm.org/viewvc/llvm-project?rev=180068&view=rev
> Log:
> Struct-path aware TBAA: update getMostGenericTBAA
>
> The tag is of type TBAANode when flag EnableStructPathTBAA is off.
>
> Move implementation of MDNode::getMostGenericTBAA to TypeBasedAliasAnalysis.cpp
> since it depends on how to interprete the MDNodes for scalar TBAA and
> struct-path aware TBAA.
>
> Modified:
>     llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp
>     llvm/trunk/lib/IR/Metadata.cpp
>
> Modified: llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp?rev=180068&r1=180067&r2=180068&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp (original)
> +++ llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp Mon Apr 22 18:00:44 2013
> @@ -376,7 +376,7 @@ bool TypeBasedAliasAnalysis::pointsToCon
>
>    // If this is an "immutable" type, we can assume the pointer is pointing
>    // to constant memory.
> -  if (TBAANode(M).TypeIsImmutable())
> +  if (!EnableStructPathTBAA && TBAANode(M).TypeIsImmutable())
>      return true;
>
>    return AliasAnalysis::pointsToConstantMemory(Loc, OrLocal);
> @@ -392,7 +392,7 @@ TypeBasedAliasAnalysis::getModRefBehavio
>    // If this is an "immutable" type, we can assume the call doesn't write
>    // to memory.
>    if (const MDNode *M = CS.getInstruction()->getMetadata(LLVMContext::MD_tbaa))
> -    if (TBAANode(M).TypeIsImmutable())
> +    if (!EnableStructPathTBAA && TBAANode(M).TypeIsImmutable())
>        Min = OnlyReadsMemory;
>
>    return ModRefBehavior(AliasAnalysis::getModRefBehavior(CS) & Min);
> @@ -434,3 +434,61 @@ TypeBasedAliasAnalysis::getModRefInfo(Im
>
>    return AliasAnalysis::getModRefInfo(CS1, CS2);
>  }
> +
> +MDNode *MDNode::getMostGenericTBAA(MDNode *A, MDNode *B) {
> +  if (!A || !B)
> +    return NULL;
> +
> +  if (A == B)
> +    return A;
> +
> +  // For struct-path aware TBAA, we use the access type of the tag.
> +  if (EnableStructPathTBAA) {
> +    A = cast_or_null<MDNode>(A->getOperand(1));
> +    if (!A) return 0;
> +    B = cast_or_null<MDNode>(B->getOperand(1));
> +    if (!B) return 0;
> +  }
> +
> +  SmallVector<MDNode *, 4> PathA;
> +  MDNode *T = A;
> +  while (T) {
> +    PathA.push_back(T);
> +    if (EnableStructPathTBAA)
> +      T = T->getNumOperands() >= 3 ? cast_or_null<MDNode>(T->getOperand(2)) : 0;
> +    else
> +      T = T->getNumOperands() >= 2 ? cast_or_null<MDNode>(T->getOperand(1)) : 0;
> +  }
> +
> +  SmallVector<MDNode *, 4> PathB;
> +  T = B;
> +  while (T) {
> +    PathB.push_back(T);
> +    if (EnableStructPathTBAA)
> +      T = T->getNumOperands() >= 3 ? cast_or_null<MDNode>(T->getOperand(2)) : 0;
> +    else
> +      T = T->getNumOperands() >= 2 ? cast_or_null<MDNode>(T->getOperand(1)) : 0;
> +  }
> +
> +  int IA = PathA.size() - 1;
> +  int IB = PathB.size() - 1;
> +
> +  MDNode *Ret = 0;
> +  while (IA >= 0 && IB >=0) {
> +    if (PathA[IA] == PathB[IB])
> +      Ret = PathA[IA];
> +    else
> +      break;
> +    --IA;
> +    --IB;
> +  }
> +  if (!EnableStructPathTBAA)
> +    return Ret;
> +
> +  if (!Ret)
> +    return 0;
> +  // We need to convert from a type node to a tag node.
> +  Type *Int64 = IntegerType::get(A->getContext(), 64);
> +  Value *Ops[3] = { Ret, Ret, ConstantInt::get(Int64, 0) };
> +  return MDNode::get(A->getContext(), Ops);
> +}
>
> Modified: llvm/trunk/lib/IR/Metadata.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Metadata.cpp?rev=180068&r1=180067&r2=180068&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/Metadata.cpp (original)
> +++ llvm/trunk/lib/IR/Metadata.cpp Mon Apr 22 18:00:44 2013
> @@ -403,42 +403,6 @@ void MDNode::replaceOperand(MDNodeOperan
>    }
>  }
>
> -MDNode *MDNode::getMostGenericTBAA(MDNode *A, MDNode *B) {
> -  if (!A || !B)
> -    return NULL;
> -
> -  if (A == B)
> -    return A;
> -
> -  SmallVector<MDNode *, 4> PathA;
> -  MDNode *T = A;
> -  while (T) {
> -    PathA.push_back(T);
> -    T = T->getNumOperands() >= 2 ? cast_or_null<MDNode>(T->getOperand(1)) : 0;
> -  }
> -
> -  SmallVector<MDNode *, 4> PathB;
> -  T = B;
> -  while (T) {
> -    PathB.push_back(T);
> -    T = T->getNumOperands() >= 2 ? cast_or_null<MDNode>(T->getOperand(1)) : 0;
> -  }
> -
> -  int IA = PathA.size() - 1;
> -  int IB = PathB.size() - 1;
> -
> -  MDNode *Ret = 0;
> -  while (IA >= 0 && IB >=0) {
> -    if (PathA[IA] == PathB[IB])
> -      Ret = PathA[IA];
> -    else
> -      break;
> -    --IA;
> -    --IB;
> -  }
> -  return Ret;
> -}
> -
>  MDNode *MDNode::getMostGenericFPMath(MDNode *A, MDNode *B) {
>    if (!A || !B)
>      return NULL;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list