Lines Matching defs:Expr
61 /// Return the flag describing the possible wrapping of @p Expr.
62 static SCEV::NoWrapFlags getNoWrapFlags(const SCEV *Expr) {
63 if (auto *NAry = dyn_cast<SCEVNAryExpr>(Expr))
117 PWACtx SCEVAffinator::getPwAff(const SCEV *Expr, BasicBlock *BB,
129 return visit(Expr);
132 PWACtx SCEVAffinator::checkForWrapping(const SCEV *Expr, PWACtx PWAC) const {
134 // represents Expr in modulo semantic (it is not allowed to overflow), thus we
137 // whereas n is the number of bits of the Expr, hence:
140 if (IgnoreIntegerWrapping || (getNoWrapFlags(Expr) & SCEV::FlagNSW))
143 isl::pw_aff PWAMod = addModuloSemantic(PWAC.first, Expr->getType());
188 bool SCEVAffinator::computeModuloForExpr(const SCEV *Expr) {
189 unsigned Width = TD.getTypeSizeInBits(Expr->getType());
191 if (auto *NAry = dyn_cast<SCEVNAryExpr>(Expr))
197 PWACtx SCEVAffinator::visit(const SCEV *Expr) {
199 auto Key = std::make_pair(Expr, BB);
204 auto ConstantAndLeftOverPair = extractConstantFactor(Expr, SE);
206 Expr = ConstantAndLeftOverPair.second;
209 S->addParams(getParamsInAffineExpr(&S->getRegion(), Scope, Expr, SE));
215 if (isl_id *Id = S->getIdForParam(Expr).release()) {
225 PWAC = SCEVVisitor<SCEVAffinator, PWACtx>::visit(Expr);
226 if (computeModuloForExpr(Expr))
227 PWAC.first = addModuloSemantic(PWAC.first, Expr->getType());
229 PWAC = checkForWrapping(Expr, PWAC);
235 PWAC.first = addModuloSemantic(PWAC.first, Expr->getType());
248 PWACtx SCEVAffinator::visitConstant(const SCEVConstant *Expr) {
249 ConstantInt *Value = Expr->getValue();
274 PWACtx SCEVAffinator::visitPtrToIntExpr(const SCEVPtrToIntExpr *Expr) {
275 return visit(Expr->getOperand(0));
278 PWACtx SCEVAffinator::visitTruncateExpr(const SCEVTruncateExpr *Expr) {
284 const SCEV *Op = Expr->getOperand();
287 unsigned Width = TD.getTypeSizeInBits(Expr->getType());
289 if (computeModuloForExpr(Expr))
313 PWACtx SCEVAffinator::visitZeroExtendExpr(const SCEVZeroExtendExpr *Expr) {
357 const SCEV *Op = Expr->getOperand();
373 PWACtx SCEVAffinator::visitSignExtendExpr(const SCEVSignExtendExpr *Expr) {
375 return visit(Expr->getOperand());
378 PWACtx SCEVAffinator::visitAddExpr(const SCEVAddExpr *Expr) {
379 PWACtx Sum = visit(Expr->getOperand(0));
381 for (int i = 1, e = Expr->getNumOperands(); i < e; ++i) {
382 Sum = combine(Sum, visit(Expr->getOperand(i)), isl_pw_aff_add);
390 PWACtx SCEVAffinator::visitMulExpr(const SCEVMulExpr *Expr) {
391 PWACtx Prod = visit(Expr->getOperand(0));
393 for (int i = 1, e = Expr->getNumOperands(); i < e; ++i) {
394 Prod = combine(Prod, visit(Expr->getOperand(i)), isl_pw_aff_mul);
402 PWACtx SCEVAffinator::visitAddRecExpr(const SCEVAddRecExpr *Expr) {
403 assert(Expr->isAffine() && "Only affine AddRecurrences allowed");
405 auto Flags = Expr->getNoWrapFlags();
407 // Directly generate isl_pw_aff for Expr if 'start' is zero.
408 if (Expr->getStart()->isZero()) {
409 assert(S->contains(Expr->getLoop()) &&
412 PWACtx Step = visit(Expr->getOperand(1));
416 unsigned loopDimension = S->getRelativeLoopDepth(Expr->getLoop());
432 SE.getAddRecExpr(SE.getConstant(Expr->getStart()->getType(), 0),
433 Expr->getStepRecurrence(SE), Expr->getLoop(), Flags);
436 PWACtx Start = visit(Expr->getStart());
441 PWACtx SCEVAffinator::visitSMaxExpr(const SCEVSMaxExpr *Expr) {
442 PWACtx Max = visit(Expr->getOperand(0));
444 for (int i = 1, e = Expr->getNumOperands(); i < e; ++i) {
445 Max = combine(Max, visit(Expr->getOperand(i)), isl_pw_aff_max);
453 PWACtx SCEVAffinator::visitSMinExpr(const SCEVSMinExpr *Expr) {
454 PWACtx Min = visit(Expr->getOperand(0));
456 for (int i = 1, e = Expr->getNumOperands(); i < e; ++i) {
457 Min = combine(Min, visit(Expr->getOperand(i)), isl_pw_aff_min);
465 PWACtx SCEVAffinator::visitUMaxExpr(const SCEVUMaxExpr *Expr) {
469 PWACtx SCEVAffinator::visitUMinExpr(const SCEVUMinExpr *Expr) {
474 SCEVAffinator::visitSequentialUMinExpr(const SCEVSequentialUMinExpr *Expr) {
478 PWACtx SCEVAffinator::visitUDivExpr(const SCEVUDivExpr *Expr) {
486 const SCEV *Dividend = Expr->getLHS();
487 const SCEV *Divisor = Expr->getRHS();
498 unsigned Width = TD.getTypeSizeInBits(Expr->getType());
550 PWACtx SCEVAffinator::visitUnknown(const SCEVUnknown *Expr) {
551 if (Instruction *I = dyn_cast<Instruction>(Expr->getValue())) {
564 if (isa<ConstantPointerNull>(Expr->getValue())) {