CodeGen: Move domain into the VectorBlockGenerator

llvm-svn: 151913
This commit is contained in:
Tobias Grosser 2012-03-02 15:20:24 +00:00
parent f6beec674e
commit 08a8238b7a
1 changed files with 16 additions and 19 deletions

View File

@ -226,9 +226,9 @@ Value *IslGenerator::generateIslPwAff(__isl_take isl_pw_aff *PwAff) {
class BlockGenerator { class BlockGenerator {
public: public:
static void generate(IRBuilder<> &B, ValueMapT &ValueMap, static void generate(IRBuilder<> &B, ValueMapT &ValueMap, ScopStmt &Stmt,
ScopStmt &Stmt, __isl_keep isl_set *Domain, Pass *P) { Pass *P) {
BlockGenerator Generator(B, ValueMap, Stmt, Domain, P); BlockGenerator Generator(B, ValueMap, Stmt, P);
Generator.copyBB(); Generator.copyBB();
} }
@ -237,11 +237,10 @@ protected:
ValueMapT &VMap; ValueMapT &VMap;
Scop &S; Scop &S;
ScopStmt &Statement; ScopStmt &Statement;
isl_set *ScatteringDomain;
Pass *P; Pass *P;
BlockGenerator(IRBuilder<> &B, ValueMapT &vmap, ScopStmt &Stmt, BlockGenerator(IRBuilder<> &B, ValueMapT &vmap, ScopStmt &Stmt, Pass *P);
__isl_keep isl_set *Domain, Pass *p);
Value *getOperand(const Value *oldOperand, ValueMapT &BBMap); Value *getOperand(const Value *oldOperand, ValueMapT &BBMap);
@ -269,9 +268,8 @@ protected:
}; };
BlockGenerator::BlockGenerator(IRBuilder<> &B, ValueMapT &vmap, ScopStmt &Stmt, BlockGenerator::BlockGenerator(IRBuilder<> &B, ValueMapT &vmap, ScopStmt &Stmt,
__isl_keep isl_set *domain, Pass *P) : Pass *P) :
Builder(B), VMap(vmap), S(*Stmt.getParent()), Statement(Stmt), Builder(B), VMap(vmap), S(*Stmt.getParent()), Statement(Stmt), P(P) {}
ScatteringDomain(domain), P(P) {}
Value *BlockGenerator::getOperand(const Value *OldOperand, ValueMapT &BBMap) { Value *BlockGenerator::getOperand(const Value *OldOperand, ValueMapT &BBMap) {
const Instruction *OpInst = dyn_cast<Instruction>(OldOperand); const Instruction *OpInst = dyn_cast<Instruction>(OldOperand);
@ -441,6 +439,8 @@ public:
private: private:
VectorValueMapT &ValueMaps; VectorValueMapT &ValueMaps;
isl_set *Domain;
VectorBlockGenerator(IRBuilder<> &B, ValueMapT &vmap, VectorValueMapT &vmaps, VectorBlockGenerator(IRBuilder<> &B, ValueMapT &vmap, VectorValueMapT &vmaps,
ScopStmt &Stmt, __isl_keep isl_set *domain, Pass *p); ScopStmt &Stmt, __isl_keep isl_set *domain, Pass *p);
@ -513,9 +513,10 @@ private:
VectorBlockGenerator::VectorBlockGenerator(IRBuilder<> &B, ValueMapT &vmap, VectorBlockGenerator::VectorBlockGenerator(IRBuilder<> &B, ValueMapT &vmap,
VectorValueMapT &vmaps, ScopStmt &Stmt, VectorValueMapT &vmaps, ScopStmt &Stmt,
__isl_keep isl_set *domain, Pass *P) __isl_keep isl_set *Domain, Pass *P)
: BlockGenerator(B, vmap, Stmt, domain, P), ValueMaps(vmaps) { : BlockGenerator(B, vmap, Stmt, P), ValueMaps(vmaps), Domain(Domain) {
assert(ValueMaps.size() > 1 && "Only one vector lane found"); assert(ValueMaps.size() > 1 && "Only one vector lane found");
assert(Domain && "No statement domain provided");
} }
Value *VectorBlockGenerator::makeVectorOperand(Value *Operand) { Value *VectorBlockGenerator::makeVectorOperand(Value *Operand) {
@ -621,11 +622,9 @@ void VectorBlockGenerator::generateLoad(const LoadInst *Load,
MemoryAccess &Access = Statement.getAccessFor(Load); MemoryAccess &Access = Statement.getAccessFor(Load);
assert(ScatteringDomain && "No scattering domain available"); if (Access.isStrideZero(isl_set_copy(Domain)))
if (Access.isStrideZero(isl_set_copy(ScatteringDomain)))
NewLoad = generateStrideZeroLoad(Load, ScalarMaps[0]); NewLoad = generateStrideZeroLoad(Load, ScalarMaps[0]);
else if (Access.isStrideOne(isl_set_copy(ScatteringDomain))) else if (Access.isStrideOne(isl_set_copy(Domain)))
NewLoad = generateStrideOneLoad(Load, ScalarMaps[0]); NewLoad = generateStrideOneLoad(Load, ScalarMaps[0]);
else else
NewLoad = generateUnknownStrideLoad(Load, ScalarMaps); NewLoad = generateUnknownStrideLoad(Load, ScalarMaps);
@ -673,12 +672,10 @@ void VectorBlockGenerator::copyStore(const StoreInst *Store, ValueMapT &BBMap,
MemoryAccess &Access = Statement.getAccessFor(Store); MemoryAccess &Access = Statement.getAccessFor(Store);
assert(ScatteringDomain && "No scattering domain available");
const Value *Pointer = Store->getPointerOperand(); const Value *Pointer = Store->getPointerOperand();
Value *Vector = getOperand(Store->getValueOperand(), BBMap, &VectorMap); Value *Vector = getOperand(Store->getValueOperand(), BBMap, &VectorMap);
if (Access.isStrideOne(isl_set_copy(ScatteringDomain))) { if (Access.isStrideOne(isl_set_copy(Domain))) {
Type *VectorPtrType = getVectorPtrTy(Pointer, VectorWidth); Type *VectorPtrType = getVectorPtrTy(Pointer, VectorWidth);
Value *NewPointer = getOperand(Pointer, BBMap, &VectorMap); Value *NewPointer = getOperand(Pointer, BBMap, &VectorMap);
@ -1098,7 +1095,7 @@ void ClastStmtCodeGen::codegen(const clast_user_stmt *u,
int VectorDimensions = IVS ? IVS->size() : 1; int VectorDimensions = IVS ? IVS->size() : 1;
if (VectorDimensions == 1) { if (VectorDimensions == 1) {
BlockGenerator::generate(Builder, ValueMap, *Statement, Domain, P); BlockGenerator::generate(Builder, ValueMap, *Statement, P);
return; return;
} }