CodeGen: Move domain into the VectorBlockGenerator
llvm-svn: 151913
This commit is contained in:
parent
f6beec674e
commit
08a8238b7a
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue