Value *BlockGenerator::getNewValue(const Value *Old, ValueMapT &BBMap, ValueMapT &GlobalMap, LoopToScevMapT <S, Loop *L) { if (Value *New = lookupAvailableValue(Old, BBMap, GlobalMap)) return New; if (SCEVCodegen && SE.isSCEVable(Old->getType())) if (const SCEV *Scev = SE.getSCEVAtScope(const_cast<Value *>(Old), L)) { if (!isa<SCEVCouldNotCompute>(Scev)) { const SCEV *NewScev = apply(Scev, LTS, SE); ValueToValueMap VTV; VTV.insert(BBMap.begin(), BBMap.end()); VTV.insert(GlobalMap.begin(), GlobalMap.end()); NewScev = SCEVParameterRewriter::rewrite(NewScev, SE, VTV); SCEVExpander Expander(SE, "polly"); Value *Expanded = Expander.expandCodeFor(NewScev, Old->getType(), Builder.GetInsertPoint()); BBMap[Old] = Expanded; return Expanded; } } // Now the scalar dependence is neither available nor SCEVCodegenable, this // should never happen in the current code generator. llvm_unreachable("Unexpected scalar dependence in region!"); return nullptr; }
Value *BlockGenerator::getNewValue(ScopStmt &Stmt, const Value *Old, ValueMapT &BBMap, ValueMapT &GlobalMap, LoopToScevMapT <S, Loop *L) const { // We assume constants never change. // This avoids map lookups for many calls to this function. if (isa<Constant>(Old)) return const_cast<Value *>(Old); if (Value *New = GlobalMap.lookup(Old)) { if (Old->getType()->getScalarSizeInBits() < New->getType()->getScalarSizeInBits()) New = Builder.CreateTruncOrBitCast(New, Old->getType()); return New; } if (Value *New = BBMap.lookup(Old)) return New; if (SE.isSCEVable(Old->getType())) if (const SCEV *Scev = SE.getSCEVAtScope(const_cast<Value *>(Old), L)) { if (!isa<SCEVCouldNotCompute>(Scev)) { const SCEV *NewScev = apply(Scev, LTS, SE); ValueToValueMap VTV; VTV.insert(BBMap.begin(), BBMap.end()); VTV.insert(GlobalMap.begin(), GlobalMap.end()); NewScev = SCEVParameterRewriter::rewrite(NewScev, SE, VTV); SCEVExpander Expander(SE, Stmt.getParent() ->getRegion() .getEntry() ->getParent() ->getParent() ->getDataLayout(), "polly"); Value *Expanded = Expander.expandCodeFor(NewScev, Old->getType(), Builder.GetInsertPoint()); BBMap[Old] = Expanded; return Expanded; } } // A scop-constant value defined by a global or a function parameter. if (isa<GlobalValue>(Old) || isa<Argument>(Old)) return const_cast<Value *>(Old); // A scop-constant value defined by an instruction executed outside the scop. if (const Instruction *Inst = dyn_cast<Instruction>(Old)) if (!Stmt.getParent()->getRegion().contains(Inst->getParent())) return const_cast<Value *>(Old); // The scalar dependence is neither available nor SCEVCodegenable. llvm_unreachable("Unexpected scalar dependence in region!"); return nullptr; }