[PATCH] Fix inserting instructions before last in bundle.

Nadav Rotem nrotem at apple.com
Mon Aug 26 15:59:44 PDT 2013


LGTM. Thanks for working on it.  :)

On Aug 26, 2013, at 3:49 PM, Matt Arsenault <Matthew.Arsenault at amd.com> wrote:

>  Use first item as debug location, and update test
> 
> Hi nadav,
> 
> http://llvm-reviews.chandlerc.com/D1518
> 
> CHANGE SINCE LAST DIFF
>  http://llvm-reviews.chandlerc.com/D1518?vs=3759&id=3772#toc
> 
> Files:
>  lib/Transforms/Vectorize/SLPVectorizer.cpp
>  test/Transforms/SLPVectorizer/X86/debug_info.ll
> 
> Index: lib/Transforms/Vectorize/SLPVectorizer.cpp
> ===================================================================
> --- lib/Transforms/Vectorize/SLPVectorizer.cpp
> +++ lib/Transforms/Vectorize/SLPVectorizer.cpp
> @@ -311,6 +311,10 @@
>   /// \returns the Instruction in the bundle \p VL.
>   Instruction *getLastInstruction(ArrayRef<Value *> VL);
> 
> +  /// \brief Set the Builder insert point to one after the last instruction in
> +  /// the bundle
> +  void setInsertPointAfterBundle(ArrayRef<Value *> VL);
> +
>   /// \returns a vector from a collection of scalars in \p VL.
>   Value *Gather(ArrayRef<Value *> VL, VectorType *Ty);
> 
> @@ -1068,6 +1072,15 @@
>   return I;
> }
> 
> +void BoUpSLP::setInsertPointAfterBundle(ArrayRef<Value *> VL) {
> +  Instruction *VL0 = cast<Instruction>(VL[0]);
> +  Instruction *LastInst = getLastInstruction(VL);
> +  BasicBlock::iterator NextInst = LastInst;
> +  ++NextInst;
> +  Builder.SetInsertPoint(VL0->getParent(), NextInst);
> +  Builder.SetCurrentDebugLocation(VL0->getDebugLoc());
> +}
> +
> Value *BoUpSLP::Gather(ArrayRef<Value *> VL, VectorType *Ty) {
>   Value *Vec = UndefValue::get(Ty);
>   // Generate the 'InsertElement' instruction.
> @@ -1141,10 +1154,7 @@
>   VectorType *VecTy = VectorType::get(ScalarTy, E->Scalars.size());
> 
>   if (E->NeedToGather) {
> -    BasicBlock::iterator NextInst = getLastInstruction(E->Scalars);
> -    ++NextInst;
> -    assert(NextInst != VL0->getParent()->end());
> -    Builder.SetInsertPoint(NextInst);
> +    setInsertPointAfterBundle(E->Scalars);
>     return Gather(E->Scalars, VecTy);
>   }
> 
> @@ -1212,8 +1222,7 @@
>       for (int i = 0, e = E->Scalars.size(); i < e; ++i)
>         INVL.push_back(cast<Instruction>(E->Scalars[i])->getOperand(0));
> 
> -      Builder.SetInsertPoint(getLastInstruction(E->Scalars));
> -      Builder.SetCurrentDebugLocation(VL0->getDebugLoc());
> +      setInsertPointAfterBundle(E->Scalars);
> 
>       Value *InVec = vectorizeTree(INVL);
> 
> @@ -1233,8 +1242,7 @@
>         RHSV.push_back(cast<Instruction>(E->Scalars[i])->getOperand(1));
>       }
> 
> -      Builder.SetInsertPoint(getLastInstruction(E->Scalars));
> -      Builder.SetCurrentDebugLocation(VL0->getDebugLoc());
> +      setInsertPointAfterBundle(E->Scalars);
> 
>       Value *L = vectorizeTree(LHSV);
>       Value *R = vectorizeTree(RHSV);
> @@ -1260,8 +1268,7 @@
>         FalseVec.push_back(cast<Instruction>(E->Scalars[i])->getOperand(2));
>       }
> 
> -      Builder.SetInsertPoint(getLastInstruction(E->Scalars));
> -      Builder.SetCurrentDebugLocation(VL0->getDebugLoc());
> +      setInsertPointAfterBundle(E->Scalars);
> 
>       Value *Cond = vectorizeTree(CondVec);
>       Value *True = vectorizeTree(TrueVec);
> @@ -1298,8 +1305,7 @@
>         RHSVL.push_back(cast<Instruction>(E->Scalars[i])->getOperand(1));
>       }
> 
> -      Builder.SetInsertPoint(getLastInstruction(E->Scalars));
> -      Builder.SetCurrentDebugLocation(VL0->getDebugLoc());
> +      setInsertPointAfterBundle(E->Scalars);
> 
>       Value *LHS = vectorizeTree(LHSVL);
>       Value *RHS = vectorizeTree(RHSVL);
> @@ -1319,8 +1325,7 @@
>     case Instruction::Load: {
>       // Loads are inserted at the head of the tree because we don't want to
>       // sink them all the way down past store instructions.
> -      Builder.SetInsertPoint(getLastInstruction(E->Scalars));
> -      Builder.SetCurrentDebugLocation(VL0->getDebugLoc());
> +      setInsertPointAfterBundle(E->Scalars);
> 
>       LoadInst *LI = cast<LoadInst>(VL0);
>       Value *VecPtr =
> @@ -1339,8 +1344,7 @@
>       for (int i = 0, e = E->Scalars.size(); i < e; ++i)
>         ValueOp.push_back(cast<StoreInst>(E->Scalars[i])->getValueOperand());
> 
> -      Builder.SetInsertPoint(getLastInstruction(E->Scalars));
> -      Builder.SetCurrentDebugLocation(VL0->getDebugLoc());
> +      setInsertPointAfterBundle(E->Scalars);
> 
>       Value *VecValue = vectorizeTree(ValueOp);
>       Value *VecPtr =
> Index: test/Transforms/SLPVectorizer/X86/debug_info.ll
> ===================================================================
> --- test/Transforms/SLPVectorizer/X86/debug_info.ll
> +++ test/Transforms/SLPVectorizer/X86/debug_info.ll
> @@ -19,7 +19,7 @@
> ;CHECK: store <2 x double> {{.*}}, !dbg ![[LOC2:[0-9]+]]
> ;CHECK: ret
> ;CHECK: ![[LOC]] = metadata !{i32 4, i32 0,
> -;CHECK: ![[LOC2]] = metadata !{i32 7, i32 0,
> +;CHECK: ![[LOC2]] = metadata !{i32 8, i32 0,
> 
> define i32 @depth(double* nocapture %A, i32 %m) #0 {
> entry:
> <D1518.2.patch>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130826/0c05b702/attachment.html>


More information about the llvm-commits mailing list