[llvm-commits] [llvm] r171726 - /llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp

Chandler Carruth chandlerc at gmail.com
Mon Jan 7 03:12:29 PST 2013


Author: chandlerc
Date: Mon Jan  7 05:12:29 2013
New Revision: 171726

URL: http://llvm.org/viewvc/llvm-project?rev=171726&view=rev
Log:
Simplify LoopVectorize to require target transform info and rely on it
being present. Make a member of one of the helper classes a reference as
part of this.

Reformatting goodness brought to you by clang-format.

Modified:
    llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp

Modified: llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp?rev=171726&r1=171725&r2=171726&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp (original)
+++ llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp Mon Jan  7 05:12:29 2013
@@ -513,7 +513,7 @@
 public:
   LoopVectorizationCostModel(Loop *L, ScalarEvolution *SE, LoopInfo *LI,
                              LoopVectorizationLegality *Legal,
-                             const TargetTransformInfo *TTI)
+                             const TargetTransformInfo &TTI)
       : TheLoop(L), SE(SE), LI(LI), Legal(Legal), TTI(TTI) {}
 
   /// \return The most profitable vectorization factor.
@@ -567,7 +567,7 @@
   /// Vectorization legality.
   LoopVectorizationLegality *Legal;
   /// Vector target information.
-  const TargetTransformInfo *TTI;
+  const TargetTransformInfo &TTI;
 };
 
 /// The LoopVectorize Pass.
@@ -593,7 +593,7 @@
     SE = &getAnalysis<ScalarEvolution>();
     DL = getAnalysisIfAvailable<DataLayout>();
     LI = &getAnalysis<LoopInfo>();
-    TTI = getAnalysisIfAvailable<TargetTransformInfo>();
+    TTI = &getAnalysis<TargetTransformInfo>();
     DT = &getAnalysis<DominatorTree>();
 
     DEBUG(dbgs() << "LV: Checking a loop in \"" <<
@@ -607,7 +607,7 @@
     }
 
     // Use the cost model.
-    LoopVectorizationCostModel CM(L, SE, LI, &LVL, TTI);
+    LoopVectorizationCostModel CM(L, SE, LI, &LVL, *TTI);
 
     // Check the function attribues to find out if this function should be
     // optimized for size.
@@ -648,9 +648,10 @@
     LoopPass::getAnalysisUsage(AU);
     AU.addRequiredID(LoopSimplifyID);
     AU.addRequiredID(LCSSAID);
+    AU.addRequired<DominatorTree>();
     AU.addRequired<LoopInfo>();
     AU.addRequired<ScalarEvolution>();
-    AU.addRequired<DominatorTree>();
+    AU.addRequired<TargetTransformInfo>();
     AU.addPreserved<LoopInfo>();
     AU.addPreserved<DominatorTree>();
   }
@@ -2646,11 +2647,6 @@
     return UserVF;
   }
 
-  if (!TTI) {
-    DEBUG(dbgs() << "LV: No vector target information. Not vectorizing. \n");
-    return 1;
-  }
-
   float Cost = expectedCost(1);
   unsigned Width = 1;
   DEBUG(dbgs() << "LV: Scalar loop costs: "<< (int)Cost << ".\n");
@@ -2682,7 +2678,7 @@
   if (OptForSize)
     return 1;
 
-  unsigned TargetVectorRegisters = TTI->getNumberOfRegisters(true);
+  unsigned TargetVectorRegisters = TTI.getNumberOfRegisters(true);
   DEBUG(dbgs() << "LV: The target has " << TargetVectorRegisters <<
         " vector registers\n");
 
@@ -2857,8 +2853,6 @@
 
 unsigned
 LoopVectorizationCostModel::getInstructionCost(Instruction *I, unsigned VF) {
-  assert(TTI && "Invalid vector target transformation info");
-
   // If we know that this instruction will remain uniform, check the cost of
   // the scalar version.
   if (Legal->isUniformAfterVectorization(I))
@@ -2875,7 +2869,7 @@
     // generate vector geps.
     return 0;
   case Instruction::Br: {
-    return TTI->getCFInstrCost(I->getOpcode());
+    return TTI.getCFInstrCost(I->getOpcode());
   }
   case Instruction::PHI:
     //TODO: IF-converted IFs become selects.
@@ -2898,7 +2892,7 @@
   case Instruction::And:
   case Instruction::Or:
   case Instruction::Xor:
-    return TTI->getArithmeticInstrCost(I->getOpcode(), VectorTy);
+    return TTI.getArithmeticInstrCost(I->getOpcode(), VectorTy);
   case Instruction::Select: {
     SelectInst *SI = cast<SelectInst>(I);
     const SCEV *CondSCEV = SE->getSCEV(SI->getCondition());
@@ -2907,13 +2901,13 @@
     if (ScalarCond)
       CondTy = VectorType::get(CondTy, VF);
 
-    return TTI->getCmpSelInstrCost(I->getOpcode(), VectorTy, CondTy);
+    return TTI.getCmpSelInstrCost(I->getOpcode(), VectorTy, CondTy);
   }
   case Instruction::ICmp:
   case Instruction::FCmp: {
     Type *ValTy = I->getOperand(0)->getType();
     VectorTy = ToVectorTy(ValTy, VF);
-    return TTI->getCmpSelInstrCost(I->getOpcode(), VectorTy);
+    return TTI.getCmpSelInstrCost(I->getOpcode(), VectorTy);
   }
   case Instruction::Store: {
     StoreInst *SI = cast<StoreInst>(I);
@@ -2921,7 +2915,7 @@
     VectorTy = ToVectorTy(ValTy, VF);
 
     if (VF == 1)
-      return TTI->getMemoryOpCost(I->getOpcode(), VectorTy,
+      return TTI.getMemoryOpCost(I->getOpcode(), VectorTy,
                                    SI->getAlignment(),
                                    SI->getPointerAddressSpace());
 
@@ -2934,26 +2928,24 @@
       // The cost of extracting from the value vector and pointer vector.
       Type *PtrTy = ToVectorTy(I->getOperand(0)->getType(), VF);
       for (unsigned i = 0; i < VF; ++i) {
-        Cost += TTI->getVectorInstrCost(Instruction::ExtractElement,
-                                        VectorTy, i);
-        Cost += TTI->getVectorInstrCost(Instruction::ExtractElement,
-                                        PtrTy, i);
+        Cost += TTI.getVectorInstrCost(Instruction::ExtractElement, VectorTy,
+                                       i);
+        Cost += TTI.getVectorInstrCost(Instruction::ExtractElement, PtrTy, i);
       }
 
       // The cost of the scalar stores.
-      Cost += VF * TTI->getMemoryOpCost(I->getOpcode(),
-                                        ValTy->getScalarType(),
-                                         SI->getAlignment(),
-                                         SI->getPointerAddressSpace());
+      Cost += VF * TTI.getMemoryOpCost(I->getOpcode(), ValTy->getScalarType(),
+                                       SI->getAlignment(),
+                                       SI->getPointerAddressSpace());
       return Cost;
     }
 
     // Wide stores.
-    unsigned Cost = TTI->getMemoryOpCost(I->getOpcode(), VectorTy,
-                                         SI->getAlignment(),
-                                         SI->getPointerAddressSpace());
+    unsigned Cost = TTI.getMemoryOpCost(I->getOpcode(), VectorTy,
+                                        SI->getAlignment(),
+                                        SI->getPointerAddressSpace());
     if (Reverse)
-      Cost += TTI->getShuffleCost(TargetTransformInfo::SK_Reverse,
+      Cost += TTI.getShuffleCost(TargetTransformInfo::SK_Reverse,
                                   VectorTy, 0);
     return Cost;
   }
@@ -2961,9 +2953,8 @@
     LoadInst *LI = cast<LoadInst>(I);
 
     if (VF == 1)
-      return TTI->getMemoryOpCost(I->getOpcode(), VectorTy,
-                                  LI->getAlignment(),
-                                  LI->getPointerAddressSpace());
+      return TTI.getMemoryOpCost(I->getOpcode(), VectorTy, LI->getAlignment(),
+                                 LI->getPointerAddressSpace());
 
     // Scalarized loads.
     int Stride = Legal->isConsecutivePtr(LI->getPointerOperand());
@@ -2974,29 +2965,25 @@
 
       // The cost of extracting from the pointer vector.
       for (unsigned i = 0; i < VF; ++i)
-        Cost += TTI->getVectorInstrCost(Instruction::ExtractElement,
-                                        PtrTy, i);
+        Cost += TTI.getVectorInstrCost(Instruction::ExtractElement, PtrTy, i);
 
       // The cost of inserting data to the result vector.
       for (unsigned i = 0; i < VF; ++i)
-        Cost += TTI->getVectorInstrCost(Instruction::InsertElement,
-                                        VectorTy, i);
+        Cost += TTI.getVectorInstrCost(Instruction::InsertElement, VectorTy, i);
 
       // The cost of the scalar stores.
-      Cost += VF * TTI->getMemoryOpCost(I->getOpcode(),
-                                        RetTy->getScalarType(),
-                                        LI->getAlignment(),
-                                        LI->getPointerAddressSpace());
+      Cost += VF * TTI.getMemoryOpCost(I->getOpcode(), RetTy->getScalarType(),
+                                       LI->getAlignment(),
+                                       LI->getPointerAddressSpace());
       return Cost;
     }
 
     // Wide loads.
-    unsigned Cost = TTI->getMemoryOpCost(I->getOpcode(), VectorTy,
-                                         LI->getAlignment(),
-                                         LI->getPointerAddressSpace());
+    unsigned Cost = TTI.getMemoryOpCost(I->getOpcode(), VectorTy,
+                                        LI->getAlignment(),
+                                        LI->getPointerAddressSpace());
     if (Reverse)
-      Cost += TTI->getShuffleCost(TargetTransformInfo::SK_Reverse,
-                                  VectorTy, 0);
+      Cost += TTI.getShuffleCost(TargetTransformInfo::SK_Reverse, VectorTy, 0);
     return Cost;
   }
   case Instruction::ZExt:
@@ -3015,11 +3002,11 @@
     // The cost of these is the same as the scalar operation.
     if (I->getOpcode() == Instruction::Trunc &&
         Legal->isInductionVariable(I->getOperand(0)))
-         return TTI->getCastInstrCost(I->getOpcode(), I->getType(),
-                                      I->getOperand(0)->getType());
+      return TTI.getCastInstrCost(I->getOpcode(), I->getType(),
+                                  I->getOperand(0)->getType());
 
     Type *SrcVecTy = ToVectorTy(I->getOperand(0)->getType(), VF);
-    return TTI->getCastInstrCost(I->getOpcode(), VectorTy, SrcVecTy);
+    return TTI.getCastInstrCost(I->getOpcode(), VectorTy, SrcVecTy);
   }
   case Instruction::Call: {
     assert(isTriviallyVectorizableIntrinsic(I));
@@ -3028,7 +3015,7 @@
     SmallVector<Type*, 4> Tys;
     for (unsigned i = 0, ie = II->getNumArgOperands(); i != ie; ++i)
       Tys.push_back(ToVectorTy(II->getArgOperand(i)->getType(), VF));
-    return TTI->getIntrinsicInstrCost(II->getIntrinsicID(), RetTy, Tys);
+    return TTI.getIntrinsicInstrCost(II->getIntrinsicID(), RetTy, Tys);
   }
   default: {
     // We are scalarizing the instruction. Return the cost of the scalar
@@ -3037,10 +3024,10 @@
     unsigned Cost = 0;
 
     if (!RetTy->isVoidTy() && VF != 1) {
-      unsigned InsCost = TTI->getVectorInstrCost(Instruction::InsertElement,
-                                                 VectorTy);
-      unsigned ExtCost = TTI->getVectorInstrCost(Instruction::ExtractElement,
-                                                 VectorTy);
+      unsigned InsCost = TTI.getVectorInstrCost(Instruction::InsertElement,
+                                                VectorTy);
+      unsigned ExtCost = TTI.getVectorInstrCost(Instruction::ExtractElement,
+                                                VectorTy);
 
       // The cost of inserting the results plus extracting each one of the
       // operands.
@@ -3049,7 +3036,7 @@
 
     // The cost of executing VF copies of the scalar instruction. This opcode
     // is unknown. Assume that it is the same as 'mul'.
-    Cost += VF * TTI->getArithmeticInstrCost(Instruction::Mul, VectorTy);
+    Cost += VF * TTI.getArithmeticInstrCost(Instruction::Mul, VectorTy);
     return Cost;
   }
   }// end of switch.
@@ -3065,6 +3052,7 @@
 static const char lv_name[] = "Loop Vectorization";
 INITIALIZE_PASS_BEGIN(LoopVectorize, LV_NAME, lv_name, false, false)
 INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
+INITIALIZE_AG_DEPENDENCY(TargetTransformInfo)
 INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
 INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
 INITIALIZE_PASS_END(LoopVectorize, LV_NAME, lv_name, false, false)





More information about the llvm-commits mailing list