[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