[PATCH] Propagate instruction metadata during SLP vectorization.

Chad Rosier mcrosier at codeaurora.org
Fri Nov 15 13:27:46 PST 2013


> rsilvera added you to the CC list for the revision "Propagate instruction
> metadata during SLP vectorization.".
>
> Hi hfinkel, nadav,
>
> Migrate metadata information from scalar to vector instructions
> durign SLP vectorization. Most of the code is lifted from BBVectorizer.cpp

during?

> http://llvm-reviews.chandlerc.com/D2191
>
> Files:
>   lib/Transforms/Vectorize/SLPVectorizer.cpp
>   test/Transforms/SLPVectorizer/X86/metadata.ll
>
> Index: lib/Transforms/Vectorize/SLPVectorizer.cpp
> ===================================================================
> --- lib/Transforms/Vectorize/SLPVectorizer.cpp
> +++ lib/Transforms/Vectorize/SLPVectorizer.cpp
> @@ -163,6 +163,39 @@
>    return Opcode;
>  }
>
> +/// \returns \p I after propagating metadata from \p VL.
> +static Instruction *propagateMetadata(Instruction *I, ArrayRef<Value *>
> VL) {
> +  Instruction *I0 = dyn_cast<Instruction>(VL[0]);
> +  if (!I0) return I;
> +
> +  SmallVector<std::pair<unsigned, MDNode*>, 4> Metadata;
> +  I0->getAllMetadataOtherThanDebugLoc(Metadata);
> +
> +  for (unsigned i = 0, n = Metadata.size(); i < n; ++i) {
> +    unsigned Kind = Metadata[i].first;
> +    MDNode *MD = Metadata[i].second;
> +
> +    for (int i = 1, e = VL.size(); MD && i < e; i++) {
> +      Instruction *I = dyn_cast<Instruction>(VL[i]);
> +      MDNode *IMD = I->getMetadata(Kind);
> +
> +      switch(Kind) {
> +        default:
> +          MD = 0; // Remove unknown metadata
> +          break;
> +        case LLVMContext::MD_tbaa:
> +          MD = MDNode::getMostGenericTBAA(MD, IMD);
> +          break;
> +        case LLVMContext::MD_fpmath:
> +          MD = MDNode::getMostGenericFPMath(MD, IMD);
> +          break;
> +      }
> +    }
> +    I->setMetadata(Kind, MD);
> +  }
> +  return I;
> +}
> +
>  /// \returns The type that all of the values in \p VL have or null if
> there
>  /// are different types.
>  static Type* getSameType(ArrayRef<Value *> VL) {
> @@ -1478,7 +1511,12 @@
>        BinaryOperator *BinOp = cast<BinaryOperator>(VL0);
>        Value *V = Builder.CreateBinOp(BinOp->getOpcode(), LHS, RHS);
>        E->VectorizedValue = V;
> -      return V;
> +
> +      const Instruction *I = dyn_cast<Instruction>(V);
> +      if (!I)
> +        return V;
> +
> +      return propagateMetadata(dyn_cast<Instruction>(V), E->Scalars);
>      }
>      case Instruction::Load: {
>        // Loads are inserted at the head of the tree because we don't want
> to
> @@ -1494,7 +1532,7 @@
>        LI = Builder.CreateLoad(VecPtr);
>        LI->setAlignment(Alignment);
>        E->VectorizedValue = LI;
> -      return LI;
> +      return propagateMetadata(LI, E->Scalars);
>      }
>      case Instruction::Store: {
>        StoreInst *SI = cast<StoreInst>(VL0);
> @@ -1513,7 +1551,7 @@
>        StoreInst *S = Builder.CreateStore(VecValue, VecPtr);
>        S->setAlignment(Alignment);
>        E->VectorizedValue = S;
> -      return S;
> +      return propagateMetadata(S, E->Scalars);
>      }
>      default:
>      llvm_unreachable("unknown inst");
> Index: test/Transforms/SLPVectorizer/X86/metadata.ll
> ===================================================================
> --- /dev/null
> +++ test/Transforms/SLPVectorizer/X86/metadata.ll
> @@ -0,0 +1,59 @@
> +; RUN: opt < %s -basicaa -slp-vectorizer -dce -S
> -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s
> +
> +target datalayout =
> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> +target triple = "x86_64-apple-macosx10.8.0"

I don't believe you need to specify the data layout or triple, since you
already specified the triple as a command line argument.

> +;CHECK: test1

You should use a CHECK-LABEL directive here.

> +;CHECK: load <2 x double>{{.*}}!tbaa ![[TBAA:[0-9]+]]
> +;CHECK: load <2 x double>{{.*}}!tbaa ![[TBAA]]
> +;CHECK: fmul <2 x double>{{.*}}!fpmath ![[FP1:[0-9]+]]
> +;CHECK: store <2 x double>{{.*}}!tbaa ![[TBAA]]
> +;CHECK: ret void
> +define void @test1(double* %a, double* %b, double* %c) {
> +entry:
> +  %i0 = load double* %a, align 8, !tbaa !4
> +  %i1 = load double* %b, align 8, !tbaa !4
> +  %mul = fmul double %i0, %i1, !fpmath !0
> +  %arrayidx3 = getelementptr inbounds double* %a, i64 1
> +  %i3 = load double* %arrayidx3, align 8, !tbaa !4
> +  %arrayidx4 = getelementptr inbounds double* %b, i64 1
> +  %i4 = load double* %arrayidx4, align 8, !tbaa !4
> +  %mul5 = fmul double %i3, %i4, !fpmath !0
> +  store double %mul, double* %c, align 8, !tbaa !4
> +  %arrayidx5 = getelementptr inbounds double* %c, i64 1
> +  store double %mul5, double* %arrayidx5, align 8, !tbaa !4
> +  ret void
> +}
> +
> +;CHECK: test2

Same.

> +;CHECK: load <2 x double>{{.*}}!tbaa ![[TBAA]]
> +;CHECK: load <2 x double>{{.*}}!tbaa ![[TBAA]]
> +;CHECK: fmul <2 x double>{{.*}}!fpmath ![[FP2:[0-9]+]]
> +;CHECK: store <2 x double>{{.*}}!tbaa ![[TBAA]]
> +;CHECK: ret void
> +
> +define void @test2(double* %a, double* %b, i8* %e) {
> +entry:
> +  %i0 = load double* %a, align 8, !tbaa !4
> +  %i1 = load double* %b, align 8, !tbaa !4
> +  %mul = fmul double %i0, %i1, !fpmath !1
> +  %arrayidx3 = getelementptr inbounds double* %a, i64 1
> +  %i3 = load double* %arrayidx3, align 8, !tbaa !4
> +  %arrayidx4 = getelementptr inbounds double* %b, i64 1
> +  %i4 = load double* %arrayidx4, align 8, !tbaa !4
> +  %mul5 = fmul double %i3, %i4, !fpmath !1
> +  %c = bitcast i8* %e to double*
> +  store double %mul, double* %c, align 8, !tbaa !4
> +  %carrayidx5 = getelementptr inbounds i8* %e, i64 8
> +  %arrayidx5 = bitcast i8* %carrayidx5 to double*
> +  store double %mul5, double* %arrayidx5, align 8, !tbaa !4
> +  ret void
> +}
> +
> +;CHECK-DAG: ![[TBAA]] = metadata !{metadata [[TYPEC:!.*]], metadata
> [[TYPEC]], i64 0}
> +;CHECK-DAG: ![[FP1]] = metadata !{float 5.000000e+00}
> +;CHECK-DAG: ![[FP2]] = metadata !{float 2.500000e+00}
> +!0 = metadata !{ float 5.0 }
> +!1 = metadata !{ float 2.5 }
> +!2 = metadata !{metadata !"Simple C/C++ TBAA"}
> +!3 = metadata !{metadata !"omnipotent char", metadata !2}
> +!4 = metadata !{metadata !"double", metadata !3}
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation




More information about the llvm-commits mailing list