[llvm-commits] [polly] r151899 - /polly/trunk/lib/CodeGeneration.cpp
Tobias Grosser
grosser at fim.uni-passau.de
Fri Mar 2 03:27:02 PST 2012
Author: grosser
Date: Fri Mar 2 05:27:02 2012
New Revision: 151899
URL: http://llvm.org/viewvc/llvm-project?rev=151899&view=rev
Log:
CodeGen: Store the vector width in the block generator
This allows us to remove a lot of redundant parameters.
Modified:
polly/trunk/lib/CodeGeneration.cpp
Modified: polly/trunk/lib/CodeGeneration.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGeneration.cpp?rev=151899&r1=151898&r2=151899&view=diff
==============================================================================
--- polly/trunk/lib/CodeGeneration.cpp (original)
+++ polly/trunk/lib/CodeGeneration.cpp Fri Mar 2 05:27:02 2012
@@ -179,12 +179,12 @@
const Region &getRegion();
- Value *makeVectorOperand(Value *operand, int vectorWidth);
+ Value *makeVectorOperand(Value *Operand);
Value *getOperand(const Value *oldOperand, ValueMapT &BBMap,
ValueMapT *VectorMap = 0);
- Type *getVectorPtrTy(const Value *V, int vectorWidth);
+ Type *getVectorPtrTy(const Value *V, int Width);
/// @brief Load a vector from a set of adjacent scalars
///
@@ -194,8 +194,7 @@
/// %vector_ptr= bitcast double* %p to <4 x double>*
/// %vec_full = load <4 x double>* %vector_ptr
///
- Value *generateStrideOneLoad(const LoadInst *load, ValueMapT &BBMap,
- int size);
+ Value *generateStrideOneLoad(const LoadInst *Load, ValueMapT &BBMap);
/// @brief Load a vector initialized from a single scalar in memory
///
@@ -207,8 +206,7 @@
/// %splat = shufflevector <1 x double> %splat_one, <1 x
/// double> %splat_one, <4 x i32> zeroinitializer
///
- Value *generateStrideZeroLoad(const LoadInst *load, ValueMapT &BBMap,
- int size);
+ Value *generateStrideZeroLoad(const LoadInst *Load, ValueMapT &BBMap);
/// @Load a vector from scalars distributed in memory
///
@@ -221,8 +219,8 @@
/// %scalar 2 = load double* %p_2
/// %vec_2 = insertelement <2 x double> %vec_1, double %scalar_1, i32 1
///
- Value *generateUnknownStrideLoad(const LoadInst *load,
- VectorValueMapT &scalarMaps, int size);
+ Value *generateUnknownStrideLoad(const LoadInst *Load,
+ VectorValueMapT &ScalarMaps);
static Value* islAffToValue(__isl_take isl_aff *Aff,
IslPwAffUserInfo *UserInfo);
@@ -249,31 +247,30 @@
Value *generateScalarLoad(const LoadInst *load, ValueMapT &BBMap);
/// @brief Load a value (or several values as a vector) from memory.
- void generateLoad(const LoadInst *load, ValueMapT &vectorMap,
- VectorValueMapT &scalarMaps, int vectorWidth);
+ void generateLoad(const LoadInst *Load, ValueMapT &VectorMap,
+ VectorValueMapT &ScalarMaps);
void copyUnaryInst(const UnaryInstruction *Inst, ValueMapT &BBMap,
- ValueMapT &VectorMap, int VectorDimension,
- int VectorWidth);
+ ValueMapT &VectorMap, int VectorDimension);
void copyBinInst(const BinaryOperator *Inst, ValueMapT &BBMap,
- ValueMapT &vectorMap, int vectorDimension, int vectorWidth);
+ ValueMapT &VectorMap, int VectorDimension);
- void copyVectorStore(const StoreInst *store, ValueMapT &BBMap,
- ValueMapT &vectorMap, VectorValueMapT &scalarMaps,
- int vectorDimension, int vectorWidth);
+ void copyVectorStore(const StoreInst *Store, ValueMapT &BBMap,
+ ValueMapT &VectorMap, VectorValueMapT &ScalarMaps,
+ int VectorDimension);
void copyInstScalar(const Instruction *Inst, ValueMapT &BBMap);
bool hasVectorOperands(const Instruction *Inst, ValueMapT &VectorMap);
- int getVectorSize();
+ int getVectorWidth();
bool isVectorBlock();
void copyInstruction(const Instruction *Inst, ValueMapT &BBMap,
ValueMapT &VectorMap, VectorValueMapT &ScalarMaps,
- int VectorDimension, int VectorWidth);
+ int VectorDimension);
// Insert a copy of a basic block in the newly generated code.
//
@@ -296,7 +293,8 @@
return S.getRegion();
}
-Value *BlockGenerator::makeVectorOperand(Value *Operand, int VectorWidth) {
+Value *BlockGenerator::makeVectorOperand(Value *Operand) {
+ int VectorWidth = getVectorWidth();
if (Operand->getType()->isVectorTy())
return Operand;
@@ -351,20 +349,20 @@
return const_cast<Value*>(OldOperand);
}
-Type *BlockGenerator::getVectorPtrTy(const Value *Val, int VectorWidth) {
+Type *BlockGenerator::getVectorPtrTy(const Value *Val, int Width) {
PointerType *PointerTy = dyn_cast<PointerType>(Val->getType());
assert(PointerTy && "PointerType expected");
Type *ScalarType = PointerTy->getElementType();
- VectorType *VectorType = VectorType::get(ScalarType, VectorWidth);
+ VectorType *VectorType = VectorType::get(ScalarType, Width);
return PointerType::getUnqual(VectorType);
}
Value *BlockGenerator::generateStrideOneLoad(const LoadInst *Load,
- ValueMapT &BBMap, int Size) {
+ ValueMapT &BBMap) {
const Value *Pointer = Load->getPointerOperand();
- Type *VectorPtrType = getVectorPtrTy(Pointer, Size);
+ Type *VectorPtrType = getVectorPtrTy(Pointer, getVectorWidth());
Value *NewPointer = getOperand(Pointer, BBMap);
Value *VectorPtr = Builder.CreateBitCast(NewPointer, VectorPtrType,
"vector_ptr");
@@ -377,7 +375,7 @@
}
Value *BlockGenerator::generateStrideZeroLoad(const LoadInst *Load,
- ValueMapT &BBMap, int Size) {
+ ValueMapT &BBMap) {
const Value *Pointer = Load->getPointerOperand();
Type *VectorPtrType = getVectorPtrTy(Pointer, 1);
Value *NewPointer = getOperand(Pointer, BBMap);
@@ -390,7 +388,8 @@
ScalarLoad->setAlignment(8);
Constant *SplatVector =
- Constant::getNullValue(VectorType::get(Builder.getInt32Ty(), Size));
+ Constant::getNullValue(VectorType::get(Builder.getInt32Ty(),
+ getVectorWidth()));
Value *VectorLoad = Builder.CreateShuffleVector(ScalarLoad, ScalarLoad,
SplatVector,
@@ -400,15 +399,15 @@
}
Value *BlockGenerator::generateUnknownStrideLoad(const LoadInst *Load,
- VectorValueMapT &ScalarMaps,
- int Size) {
+ VectorValueMapT &ScalarMaps) {
+ int VectorWidth = getVectorWidth();
const Value *Pointer = Load->getPointerOperand();
VectorType *VectorType = VectorType::get(
- dyn_cast<PointerType>(Pointer->getType())->getElementType(), Size);
+ dyn_cast<PointerType>(Pointer->getType())->getElementType(), VectorWidth);
Value *Vector = UndefValue::get(VectorType);
- for (int i = 0; i < Size; i++) {
+ for (int i = 0; i < VectorWidth; i++) {
Value *NewPointer = getOperand(Pointer, ScalarMaps[i]);
Value *ScalarLoad = Builder.CreateLoad(NewPointer,
Load->getName() + "_p_scalar_");
@@ -538,8 +537,7 @@
}
void BlockGenerator::generateLoad(const LoadInst *Load, ValueMapT &VectorMap,
- VectorValueMapT &ScalarMaps,
- int VectorWidth) {
+ VectorValueMapT &ScalarMaps) {
if (ScalarMaps.size() == 1) {
ScalarMaps[0][Load] = generateScalarLoad(Load, ScalarMaps[0]);
return;
@@ -552,20 +550,21 @@
assert(ScatteringDomain && "No scattering domain available");
if (Access.isStrideZero(isl_set_copy(ScatteringDomain)))
- NewLoad = generateStrideZeroLoad(Load, ScalarMaps[0], VectorWidth);
+ NewLoad = generateStrideZeroLoad(Load, ScalarMaps[0]);
else if (Access.isStrideOne(isl_set_copy(ScatteringDomain)))
- NewLoad = generateStrideOneLoad(Load, ScalarMaps[0], VectorWidth);
+ NewLoad = generateStrideOneLoad(Load, ScalarMaps[0]);
else
- NewLoad = generateUnknownStrideLoad(Load, ScalarMaps, VectorWidth);
+ NewLoad = generateUnknownStrideLoad(Load, ScalarMaps);
VectorMap[Load] = NewLoad;
}
void BlockGenerator::copyUnaryInst(const UnaryInstruction *Inst,
ValueMapT &BBMap, ValueMapT &VectorMap,
- int VectorDimension, int VectorWidth) {
+ int VectorDimension) {
+ int VectorWidth = getVectorWidth();
Value *NewOperand = getOperand(Inst->getOperand(0), BBMap, &VectorMap);
- NewOperand = makeVectorOperand(NewOperand, VectorWidth);
+ NewOperand = makeVectorOperand(NewOperand);
assert(isa<CastInst>(Inst) && "Can not generate vector code for instruction");
@@ -575,8 +574,7 @@
}
void BlockGenerator::copyBinInst(const BinaryOperator *Inst, ValueMapT &BBMap,
- ValueMapT &VectorMap, int VectorDimension,
- int VectorWidth) {
+ ValueMapT &VectorMap, int VectorDimension) {
Value *OpZero = Inst->getOperand(0);
Value *OpOne = Inst->getOperand(1);
@@ -584,8 +582,8 @@
NewOpZero = getOperand(OpZero, BBMap, &VectorMap);
NewOpOne = getOperand(OpOne, BBMap, &VectorMap);
- NewOpZero = makeVectorOperand(NewOpZero, VectorWidth);
- NewOpOne = makeVectorOperand(NewOpOne, VectorWidth);
+ NewOpZero = makeVectorOperand(NewOpZero);
+ NewOpOne = makeVectorOperand(NewOpOne);
Value *NewInst = Builder.CreateBinOp(Inst->getOpcode(), NewOpZero,
NewOpOne,
@@ -596,7 +594,9 @@
void BlockGenerator::copyVectorStore(const StoreInst *Store, ValueMapT &BBMap,
ValueMapT &VectorMap,
VectorValueMapT &ScalarMaps,
- int VectorDimension, int VectorWidth) {
+ int VectorDimension) {
+ int VectorWidth = getVectorWidth();
+
// In vector mode we only generate a store for the first dimension.
if (VectorDimension > 0)
return;
@@ -663,18 +663,18 @@
return false;
}
-int BlockGenerator::getVectorSize() {
+int BlockGenerator::getVectorWidth() {
return ValueMaps.size();
}
bool BlockGenerator::isVectorBlock() {
- return getVectorSize() > 1;
+ return getVectorWidth() > 1;
}
void BlockGenerator::copyInstruction(const Instruction *Inst, ValueMapT &BBMap,
ValueMapT &VectorMap,
VectorValueMapT &ScalarMaps,
- int VectorDimension, int VectorWidth) {
+ int VectorDimension) {
// Terminator instructions control the control flow. They are explicitally
// expressed in the clast and do not need to be copied.
if (Inst->isTerminator())
@@ -689,19 +689,18 @@
}
if (const LoadInst *Load = dyn_cast<LoadInst>(Inst)) {
- generateLoad(Load, VectorMap, ScalarMaps, VectorWidth);
+ generateLoad(Load, VectorMap, ScalarMaps);
return;
}
if (isVectorBlock() && hasVectorOperands(Inst, VectorMap)) {
if (const UnaryInstruction *UnaryInst = dyn_cast<UnaryInstruction>(Inst))
- copyUnaryInst(UnaryInst, BBMap, VectorMap, VectorDimension, VectorWidth);
+ copyUnaryInst(UnaryInst, BBMap, VectorMap, VectorDimension);
else if
(const BinaryOperator *BinaryInst = dyn_cast<BinaryOperator>(Inst))
- copyBinInst(BinaryInst, BBMap, VectorMap, VectorDimension, VectorWidth);
+ copyBinInst(BinaryInst, BBMap, VectorMap, VectorDimension);
else if (const StoreInst *Store = dyn_cast<StoreInst>(Inst))
- copyVectorStore(Store, BBMap, VectorMap, ScalarMaps, VectorDimension,
- VectorWidth);
+ copyVectorStore(Store, BBMap, VectorMap, ScalarMaps, VectorDimension);
else
llvm_unreachable("Cannot issue vector code for this instruction");
@@ -732,15 +731,14 @@
// in the vector map once (as it is calculating >vectorwidth< values at a
// time. Or (if the values are calculated using scalar operations), it
// appears once in every dimension of the scalarMap.
- VectorValueMapT ScalarBlockMap(getVectorSize());
+ VectorValueMapT ScalarBlockMap(getVectorWidth());
ValueMapT VectorBlockMap;
for (BasicBlock::const_iterator II = BB->begin(), IE = BB->end();
II != IE; ++II)
- for (int i = 0; i < getVectorSize(); i++) {
- copyInstruction(II, ScalarBlockMap[i], VectorBlockMap,
- ScalarBlockMap, i, getVectorSize());
- }
+ for (int VectorLane = 0; VectorLane < getVectorWidth(); VectorLane++)
+ copyInstruction(II, ScalarBlockMap[VectorLane], VectorBlockMap,
+ ScalarBlockMap, VectorLane);
}
/// Class to generate LLVM-IR that calculates the value of a clast_expr.
More information about the llvm-commits
mailing list