1 //===- llvm/Analysis/ScalarEvolutionExpressions.h - SCEV Exprs --*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the classes used to represent and build scalar expressions. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_ANALYSIS_SCALAREVOLUTIONEXPRESSIONS_H 15 #define LLVM_ANALYSIS_SCALAREVOLUTIONEXPRESSIONS_H 16 17 #include "llvm/ADT/iterator_range.h" 18 #include "llvm/ADT/SmallPtrSet.h" 19 #include "llvm/Analysis/ScalarEvolution.h" 20 #include "llvm/Support/ErrorHandling.h" 21 22 namespace llvm { 23 class ConstantInt; 24 class ConstantRange; 25 class DominatorTree; 26 27 enum SCEVTypes { 28 // These should be ordered in terms of increasing complexity to make the 29 // folders simpler. 30 scConstant, scTruncate, scZeroExtend, scSignExtend, scAddExpr, scMulExpr, 31 scUDivExpr, scAddRecExpr, scUMaxExpr, scSMaxExpr, 32 scUnknown, scCouldNotCompute 33 }; 34 35 //===--------------------------------------------------------------------===// 36 /// SCEVConstant - This class represents a constant integer value. 37 /// 38 class SCEVConstant : public SCEV { 39 friend class ScalarEvolution; 40 41 ConstantInt *V; 42 SCEVConstant(const FoldingSetNodeIDRef ID, ConstantInt *v) : 43 SCEV(ID, scConstant), V(v) {} 44 public: 45 ConstantInt *getValue() const { return V; } 46 47 Type *getType() const { return V->getType(); } 48 49 /// Methods for support type inquiry through isa, cast, and dyn_cast: 50 static inline bool classof(const SCEV *S) { 51 return S->getSCEVType() == scConstant; 52 } 53 }; 54 55 //===--------------------------------------------------------------------===// 56 /// SCEVCastExpr - This is the base class for unary cast operator classes. 57 /// 58 class SCEVCastExpr : public SCEV { 59 protected: 60 const SCEV *Op; 61 Type *Ty; 62 63 SCEVCastExpr(const FoldingSetNodeIDRef ID, 64 unsigned SCEVTy, const SCEV *op, Type *ty); 65 66 public: 67 const SCEV *getOperand() const { return Op; } 68 Type *getType() const { return Ty; } 69 70 /// Methods for support type inquiry through isa, cast, and dyn_cast: 71 static inline bool classof(const SCEV *S) { 72 return S->getSCEVType() == scTruncate || 73 S->getSCEVType() == scZeroExtend || 74 S->getSCEVType() == scSignExtend; 75 } 76 }; 77 78 //===--------------------------------------------------------------------===// 79 /// SCEVTruncateExpr - This class represents a truncation of an integer value 80 /// to a smaller integer value. 81 /// 82 class SCEVTruncateExpr : public SCEVCastExpr { 83 friend class ScalarEvolution; 84 85 SCEVTruncateExpr(const FoldingSetNodeIDRef ID, 86 const SCEV *op, Type *ty); 87 88 public: 89 /// Methods for support type inquiry through isa, cast, and dyn_cast: 90 static inline bool classof(const SCEV *S) { 91 return S->getSCEVType() == scTruncate; 92 } 93 }; 94 95 //===--------------------------------------------------------------------===// 96 /// SCEVZeroExtendExpr - This class represents a zero extension of a small 97 /// integer value to a larger integer value. 98 /// 99 class SCEVZeroExtendExpr : public SCEVCastExpr { 100 friend class ScalarEvolution; 101 102 SCEVZeroExtendExpr(const FoldingSetNodeIDRef ID, 103 const SCEV *op, Type *ty); 104 105 public: 106 /// Methods for support type inquiry through isa, cast, and dyn_cast: 107 static inline bool classof(const SCEV *S) { 108 return S->getSCEVType() == scZeroExtend; 109 } 110 }; 111 112 //===--------------------------------------------------------------------===// 113 /// SCEVSignExtendExpr - This class represents a sign extension of a small 114 /// integer value to a larger integer value. 115 /// 116 class SCEVSignExtendExpr : public SCEVCastExpr { 117 friend class ScalarEvolution; 118 119 SCEVSignExtendExpr(const FoldingSetNodeIDRef ID, 120 const SCEV *op, Type *ty); 121 122 public: 123 /// Methods for support type inquiry through isa, cast, and dyn_cast: 124 static inline bool classof(const SCEV *S) { 125 return S->getSCEVType() == scSignExtend; 126 } 127 }; 128 129 130 //===--------------------------------------------------------------------===// 131 /// SCEVNAryExpr - This node is a base class providing common 132 /// functionality for n'ary operators. 133 /// 134 class SCEVNAryExpr : public SCEV { 135 protected: 136 // Since SCEVs are immutable, ScalarEvolution allocates operand 137 // arrays with its SCEVAllocator, so this class just needs a simple 138 // pointer rather than a more elaborate vector-like data structure. 139 // This also avoids the need for a non-trivial destructor. 140 const SCEV *const *Operands; 141 size_t NumOperands; 142 143 SCEVNAryExpr(const FoldingSetNodeIDRef ID, 144 enum SCEVTypes T, const SCEV *const *O, size_t N) 145 : SCEV(ID, T), Operands(O), NumOperands(N) {} 146 147 public: 148 size_t getNumOperands() const { return NumOperands; } 149 const SCEV *getOperand(unsigned i) const { 150 assert(i < NumOperands && "Operand index out of range!"); 151 return Operands[i]; 152 } 153 154 typedef const SCEV *const *op_iterator; 155 typedef iterator_range<op_iterator> op_range; 156 op_iterator op_begin() const { return Operands; } 157 op_iterator op_end() const { return Operands + NumOperands; } 158 op_range operands() const { 159 return make_range(op_begin(), op_end()); 160 } 161 162 Type *getType() const { return getOperand(0)->getType(); } 163 164 NoWrapFlags getNoWrapFlags(NoWrapFlags Mask = NoWrapMask) const { 165 return (NoWrapFlags)(SubclassData & Mask); 166 } 167 168 /// Methods for support type inquiry through isa, cast, and dyn_cast: 169 static inline bool classof(const SCEV *S) { 170 return S->getSCEVType() == scAddExpr || 171 S->getSCEVType() == scMulExpr || 172 S->getSCEVType() == scSMaxExpr || 173 S->getSCEVType() == scUMaxExpr || 174 S->getSCEVType() == scAddRecExpr; 175 } 176 }; 177 178 //===--------------------------------------------------------------------===// 179 /// SCEVCommutativeExpr - This node is the base class for n'ary commutative 180 /// operators. 181 /// 182 class SCEVCommutativeExpr : public SCEVNAryExpr { 183 protected: 184 SCEVCommutativeExpr(const FoldingSetNodeIDRef ID, 185 enum SCEVTypes T, const SCEV *const *O, size_t N) 186 : SCEVNAryExpr(ID, T, O, N) {} 187 188 public: 189 /// Methods for support type inquiry through isa, cast, and dyn_cast: 190 static inline bool classof(const SCEV *S) { 191 return S->getSCEVType() == scAddExpr || 192 S->getSCEVType() == scMulExpr || 193 S->getSCEVType() == scSMaxExpr || 194 S->getSCEVType() == scUMaxExpr; 195 } 196 197 /// Set flags for a non-recurrence without clearing previously set flags. 198 void setNoWrapFlags(NoWrapFlags Flags) { 199 SubclassData |= Flags; 200 } 201 }; 202 203 204 //===--------------------------------------------------------------------===// 205 /// SCEVAddExpr - This node represents an addition of some number of SCEVs. 206 /// 207 class SCEVAddExpr : public SCEVCommutativeExpr { 208 friend class ScalarEvolution; 209 210 SCEVAddExpr(const FoldingSetNodeIDRef ID, 211 const SCEV *const *O, size_t N) 212 : SCEVCommutativeExpr(ID, scAddExpr, O, N) { 213 } 214 215 public: 216 Type *getType() const { 217 // Use the type of the last operand, which is likely to be a pointer 218 // type, if there is one. This doesn't usually matter, but it can help 219 // reduce casts when the expressions are expanded. 220 return getOperand(getNumOperands() - 1)->getType(); 221 } 222 223 /// Methods for support type inquiry through isa, cast, and dyn_cast: 224 static inline bool classof(const SCEV *S) { 225 return S->getSCEVType() == scAddExpr; 226 } 227 }; 228 229 //===--------------------------------------------------------------------===// 230 /// SCEVMulExpr - This node represents multiplication of some number of SCEVs. 231 /// 232 class SCEVMulExpr : public SCEVCommutativeExpr { 233 friend class ScalarEvolution; 234 235 SCEVMulExpr(const FoldingSetNodeIDRef ID, 236 const SCEV *const *O, size_t N) 237 : SCEVCommutativeExpr(ID, scMulExpr, O, N) { 238 } 239 240 public: 241 /// Methods for support type inquiry through isa, cast, and dyn_cast: 242 static inline bool classof(const SCEV *S) { 243 return S->getSCEVType() == scMulExpr; 244 } 245 }; 246 247 248 //===--------------------------------------------------------------------===// 249 /// SCEVUDivExpr - This class represents a binary unsigned division operation. 250 /// 251 class SCEVUDivExpr : public SCEV { 252 friend class ScalarEvolution; 253 254 const SCEV *LHS; 255 const SCEV *RHS; 256 SCEVUDivExpr(const FoldingSetNodeIDRef ID, const SCEV *lhs, const SCEV *rhs) 257 : SCEV(ID, scUDivExpr), LHS(lhs), RHS(rhs) {} 258 259 public: 260 const SCEV *getLHS() const { return LHS; } 261 const SCEV *getRHS() const { return RHS; } 262 263 Type *getType() const { 264 // In most cases the types of LHS and RHS will be the same, but in some 265 // crazy cases one or the other may be a pointer. ScalarEvolution doesn't 266 // depend on the type for correctness, but handling types carefully can 267 // avoid extra casts in the SCEVExpander. The LHS is more likely to be 268 // a pointer type than the RHS, so use the RHS' type here. 269 return getRHS()->getType(); 270 } 271 272 /// Methods for support type inquiry through isa, cast, and dyn_cast: 273 static inline bool classof(const SCEV *S) { 274 return S->getSCEVType() == scUDivExpr; 275 } 276 }; 277 278 279 //===--------------------------------------------------------------------===// 280 /// SCEVAddRecExpr - This node represents a polynomial recurrence on the trip 281 /// count of the specified loop. This is the primary focus of the 282 /// ScalarEvolution framework; all the other SCEV subclasses are mostly just 283 /// supporting infrastructure to allow SCEVAddRecExpr expressions to be 284 /// created and analyzed. 285 /// 286 /// All operands of an AddRec are required to be loop invariant. 287 /// 288 class SCEVAddRecExpr : public SCEVNAryExpr { 289 friend class ScalarEvolution; 290 291 const Loop *L; 292 293 SCEVAddRecExpr(const FoldingSetNodeIDRef ID, 294 const SCEV *const *O, size_t N, const Loop *l) 295 : SCEVNAryExpr(ID, scAddRecExpr, O, N), L(l) {} 296 297 public: 298 const SCEV *getStart() const { return Operands[0]; } 299 const Loop *getLoop() const { return L; } 300 301 /// getStepRecurrence - This method constructs and returns the recurrence 302 /// indicating how much this expression steps by. If this is a polynomial 303 /// of degree N, it returns a chrec of degree N-1. 304 /// We cannot determine whether the step recurrence has self-wraparound. 305 const SCEV *getStepRecurrence(ScalarEvolution &SE) const { 306 if (isAffine()) return getOperand(1); 307 return SE.getAddRecExpr(SmallVector<const SCEV *, 3>(op_begin()+1, 308 op_end()), 309 getLoop(), FlagAnyWrap); 310 } 311 312 /// isAffine - Return true if this is an affine AddRec (i.e., it represents 313 /// an expressions A+B*x where A and B are loop invariant values. 314 bool isAffine() const { 315 // We know that the start value is invariant. This expression is thus 316 // affine iff the step is also invariant. 317 return getNumOperands() == 2; 318 } 319 320 /// isQuadratic - Return true if this is an quadratic AddRec (i.e., it 321 /// represents an expressions A+B*x+C*x^2 where A, B and C are loop 322 /// invariant values. This corresponds to an addrec of the form {L,+,M,+,N} 323 bool isQuadratic() const { 324 return getNumOperands() == 3; 325 } 326 327 /// Set flags for a recurrence without clearing any previously set flags. 328 /// For AddRec, either NUW or NSW implies NW. Keep track of this fact here 329 /// to make it easier to propagate flags. 330 void setNoWrapFlags(NoWrapFlags Flags) { 331 if (Flags & (FlagNUW | FlagNSW)) 332 Flags = ScalarEvolution::setFlags(Flags, FlagNW); 333 SubclassData |= Flags; 334 } 335 336 /// evaluateAtIteration - Return the value of this chain of recurrences at 337 /// the specified iteration number. 338 const SCEV *evaluateAtIteration(const SCEV *It, ScalarEvolution &SE) const; 339 340 /// getNumIterationsInRange - Return the number of iterations of this loop 341 /// that produce values in the specified constant range. Another way of 342 /// looking at this is that it returns the first iteration number where the 343 /// value is not in the condition, thus computing the exit count. If the 344 /// iteration count can't be computed, an instance of SCEVCouldNotCompute is 345 /// returned. 346 const SCEV *getNumIterationsInRange(ConstantRange Range, 347 ScalarEvolution &SE) const; 348 349 /// getPostIncExpr - Return an expression representing the value of 350 /// this expression one iteration of the loop ahead. 351 const SCEVAddRecExpr *getPostIncExpr(ScalarEvolution &SE) const { 352 return cast<SCEVAddRecExpr>(SE.getAddExpr(this, getStepRecurrence(SE))); 353 } 354 355 /// Methods for support type inquiry through isa, cast, and dyn_cast: 356 static inline bool classof(const SCEV *S) { 357 return S->getSCEVType() == scAddRecExpr; 358 } 359 360 /// Collect parametric terms occurring in step expressions. 361 void collectParametricTerms(ScalarEvolution &SE, 362 SmallVectorImpl<const SCEV *> &Terms) const; 363 364 /// Return in Subscripts the access functions for each dimension in Sizes. 365 void computeAccessFunctions(ScalarEvolution &SE, 366 SmallVectorImpl<const SCEV *> &Subscripts, 367 SmallVectorImpl<const SCEV *> &Sizes) const; 368 369 /// Split this SCEVAddRecExpr into two vectors of SCEVs representing the 370 /// subscripts and sizes of an array access. 371 /// 372 /// The delinearization is a 3 step process: the first two steps compute the 373 /// sizes of each subscript and the third step computes the access functions 374 /// for the delinearized array: 375 /// 376 /// 1. Find the terms in the step functions 377 /// 2. Compute the array size 378 /// 3. Compute the access function: divide the SCEV by the array size 379 /// starting with the innermost dimensions found in step 2. The Quotient 380 /// is the SCEV to be divided in the next step of the recursion. The 381 /// Remainder is the subscript of the innermost dimension. Loop over all 382 /// array dimensions computed in step 2. 383 /// 384 /// To compute a uniform array size for several memory accesses to the same 385 /// object, one can collect in step 1 all the step terms for all the memory 386 /// accesses, and compute in step 2 a unique array shape. This guarantees 387 /// that the array shape will be the same across all memory accesses. 388 /// 389 /// FIXME: We could derive the result of steps 1 and 2 from a description of 390 /// the array shape given in metadata. 391 /// 392 /// Example: 393 /// 394 /// A[][n][m] 395 /// 396 /// for i 397 /// for j 398 /// for k 399 /// A[j+k][2i][5i] = 400 /// 401 /// The initial SCEV: 402 /// 403 /// A[{{{0,+,2*m+5}_i, +, n*m}_j, +, n*m}_k] 404 /// 405 /// 1. Find the different terms in the step functions: 406 /// -> [2*m, 5, n*m, n*m] 407 /// 408 /// 2. Compute the array size: sort and unique them 409 /// -> [n*m, 2*m, 5] 410 /// find the GCD of all the terms = 1 411 /// divide by the GCD and erase constant terms 412 /// -> [n*m, 2*m] 413 /// GCD = m 414 /// divide by GCD -> [n, 2] 415 /// remove constant terms 416 /// -> [n] 417 /// size of the array is A[unknown][n][m] 418 /// 419 /// 3. Compute the access function 420 /// a. Divide {{{0,+,2*m+5}_i, +, n*m}_j, +, n*m}_k by the innermost size m 421 /// Quotient: {{{0,+,2}_i, +, n}_j, +, n}_k 422 /// Remainder: {{{0,+,5}_i, +, 0}_j, +, 0}_k 423 /// The remainder is the subscript of the innermost array dimension: [5i]. 424 /// 425 /// b. Divide Quotient: {{{0,+,2}_i, +, n}_j, +, n}_k by next outer size n 426 /// Quotient: {{{0,+,0}_i, +, 1}_j, +, 1}_k 427 /// Remainder: {{{0,+,2}_i, +, 0}_j, +, 0}_k 428 /// The Remainder is the subscript of the next array dimension: [2i]. 429 /// 430 /// The subscript of the outermost dimension is the Quotient: [j+k]. 431 /// 432 /// Overall, we have: A[][n][m], and the access function: A[j+k][2i][5i]. 433 void delinearize(ScalarEvolution &SE, 434 SmallVectorImpl<const SCEV *> &Subscripts, 435 SmallVectorImpl<const SCEV *> &Sizes, 436 const SCEV *ElementSize) const; 437 }; 438 439 //===--------------------------------------------------------------------===// 440 /// SCEVSMaxExpr - This class represents a signed maximum selection. 441 /// 442 class SCEVSMaxExpr : public SCEVCommutativeExpr { 443 friend class ScalarEvolution; 444 445 SCEVSMaxExpr(const FoldingSetNodeIDRef ID, 446 const SCEV *const *O, size_t N) 447 : SCEVCommutativeExpr(ID, scSMaxExpr, O, N) { 448 // Max never overflows. 449 setNoWrapFlags((NoWrapFlags)(FlagNUW | FlagNSW)); 450 } 451 452 public: 453 /// Methods for support type inquiry through isa, cast, and dyn_cast: 454 static inline bool classof(const SCEV *S) { 455 return S->getSCEVType() == scSMaxExpr; 456 } 457 }; 458 459 460 //===--------------------------------------------------------------------===// 461 /// SCEVUMaxExpr - This class represents an unsigned maximum selection. 462 /// 463 class SCEVUMaxExpr : public SCEVCommutativeExpr { 464 friend class ScalarEvolution; 465 466 SCEVUMaxExpr(const FoldingSetNodeIDRef ID, 467 const SCEV *const *O, size_t N) 468 : SCEVCommutativeExpr(ID, scUMaxExpr, O, N) { 469 // Max never overflows. 470 setNoWrapFlags((NoWrapFlags)(FlagNUW | FlagNSW)); 471 } 472 473 public: 474 /// Methods for support type inquiry through isa, cast, and dyn_cast: 475 static inline bool classof(const SCEV *S) { 476 return S->getSCEVType() == scUMaxExpr; 477 } 478 }; 479 480 //===--------------------------------------------------------------------===// 481 /// SCEVUnknown - This means that we are dealing with an entirely unknown SCEV 482 /// value, and only represent it as its LLVM Value. This is the "bottom" 483 /// value for the analysis. 484 /// 485 class SCEVUnknown : public SCEV, private CallbackVH { 486 friend class ScalarEvolution; 487 488 // Implement CallbackVH. 489 void deleted() override; 490 void allUsesReplacedWith(Value *New) override; 491 492 /// SE - The parent ScalarEvolution value. This is used to update 493 /// the parent's maps when the value associated with a SCEVUnknown 494 /// is deleted or RAUW'd. 495 ScalarEvolution *SE; 496 497 /// Next - The next pointer in the linked list of all 498 /// SCEVUnknown instances owned by a ScalarEvolution. 499 SCEVUnknown *Next; 500 501 SCEVUnknown(const FoldingSetNodeIDRef ID, Value *V, 502 ScalarEvolution *se, SCEVUnknown *next) : 503 SCEV(ID, scUnknown), CallbackVH(V), SE(se), Next(next) {} 504 505 public: 506 Value *getValue() const { return getValPtr(); } 507 508 /// isSizeOf, isAlignOf, isOffsetOf - Test whether this is a special 509 /// constant representing a type size, alignment, or field offset in 510 /// a target-independent manner, and hasn't happened to have been 511 /// folded with other operations into something unrecognizable. This 512 /// is mainly only useful for pretty-printing and other situations 513 /// where it isn't absolutely required for these to succeed. 514 bool isSizeOf(Type *&AllocTy) const; 515 bool isAlignOf(Type *&AllocTy) const; 516 bool isOffsetOf(Type *&STy, Constant *&FieldNo) const; 517 518 Type *getType() const { return getValPtr()->getType(); } 519 520 /// Methods for support type inquiry through isa, cast, and dyn_cast: 521 static inline bool classof(const SCEV *S) { 522 return S->getSCEVType() == scUnknown; 523 } 524 }; 525 526 /// SCEVVisitor - This class defines a simple visitor class that may be used 527 /// for various SCEV analysis purposes. 528 template<typename SC, typename RetVal=void> 529 struct SCEVVisitor { 530 RetVal visit(const SCEV *S) { 531 switch (S->getSCEVType()) { 532 case scConstant: 533 return ((SC*)this)->visitConstant((const SCEVConstant*)S); 534 case scTruncate: 535 return ((SC*)this)->visitTruncateExpr((const SCEVTruncateExpr*)S); 536 case scZeroExtend: 537 return ((SC*)this)->visitZeroExtendExpr((const SCEVZeroExtendExpr*)S); 538 case scSignExtend: 539 return ((SC*)this)->visitSignExtendExpr((const SCEVSignExtendExpr*)S); 540 case scAddExpr: 541 return ((SC*)this)->visitAddExpr((const SCEVAddExpr*)S); 542 case scMulExpr: 543 return ((SC*)this)->visitMulExpr((const SCEVMulExpr*)S); 544 case scUDivExpr: 545 return ((SC*)this)->visitUDivExpr((const SCEVUDivExpr*)S); 546 case scAddRecExpr: 547 return ((SC*)this)->visitAddRecExpr((const SCEVAddRecExpr*)S); 548 case scSMaxExpr: 549 return ((SC*)this)->visitSMaxExpr((const SCEVSMaxExpr*)S); 550 case scUMaxExpr: 551 return ((SC*)this)->visitUMaxExpr((const SCEVUMaxExpr*)S); 552 case scUnknown: 553 return ((SC*)this)->visitUnknown((const SCEVUnknown*)S); 554 case scCouldNotCompute: 555 return ((SC*)this)->visitCouldNotCompute((const SCEVCouldNotCompute*)S); 556 default: 557 llvm_unreachable("Unknown SCEV type!"); 558 } 559 } 560 561 RetVal visitCouldNotCompute(const SCEVCouldNotCompute *S) { 562 llvm_unreachable("Invalid use of SCEVCouldNotCompute!"); 563 } 564 }; 565 566 /// Visit all nodes in the expression tree using worklist traversal. 567 /// 568 /// Visitor implements: 569 /// // return true to follow this node. 570 /// bool follow(const SCEV *S); 571 /// // return true to terminate the search. 572 /// bool isDone(); 573 template<typename SV> 574 class SCEVTraversal { 575 SV &Visitor; 576 SmallVector<const SCEV *, 8> Worklist; 577 SmallPtrSet<const SCEV *, 8> Visited; 578 579 void push(const SCEV *S) { 580 if (Visited.insert(S) && Visitor.follow(S)) 581 Worklist.push_back(S); 582 } 583 public: 584 SCEVTraversal(SV& V): Visitor(V) {} 585 586 void visitAll(const SCEV *Root) { 587 push(Root); 588 while (!Worklist.empty() && !Visitor.isDone()) { 589 const SCEV *S = Worklist.pop_back_val(); 590 591 switch (S->getSCEVType()) { 592 case scConstant: 593 case scUnknown: 594 break; 595 case scTruncate: 596 case scZeroExtend: 597 case scSignExtend: 598 push(cast<SCEVCastExpr>(S)->getOperand()); 599 break; 600 case scAddExpr: 601 case scMulExpr: 602 case scSMaxExpr: 603 case scUMaxExpr: 604 case scAddRecExpr: { 605 const SCEVNAryExpr *NAry = cast<SCEVNAryExpr>(S); 606 for (SCEVNAryExpr::op_iterator I = NAry->op_begin(), 607 E = NAry->op_end(); I != E; ++I) { 608 push(*I); 609 } 610 break; 611 } 612 case scUDivExpr: { 613 const SCEVUDivExpr *UDiv = cast<SCEVUDivExpr>(S); 614 push(UDiv->getLHS()); 615 push(UDiv->getRHS()); 616 break; 617 } 618 case scCouldNotCompute: 619 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!"); 620 default: 621 llvm_unreachable("Unknown SCEV kind!"); 622 } 623 } 624 } 625 }; 626 627 /// Use SCEVTraversal to visit all nodes in the givien expression tree. 628 template<typename SV> 629 void visitAll(const SCEV *Root, SV& Visitor) { 630 SCEVTraversal<SV> T(Visitor); 631 T.visitAll(Root); 632 } 633 634 typedef DenseMap<const Value*, Value*> ValueToValueMap; 635 636 /// The SCEVParameterRewriter takes a scalar evolution expression and updates 637 /// the SCEVUnknown components following the Map (Value -> Value). 638 struct SCEVParameterRewriter 639 : public SCEVVisitor<SCEVParameterRewriter, const SCEV*> { 640 public: 641 static const SCEV *rewrite(const SCEV *Scev, ScalarEvolution &SE, 642 ValueToValueMap &Map, 643 bool InterpretConsts = false) { 644 SCEVParameterRewriter Rewriter(SE, Map, InterpretConsts); 645 return Rewriter.visit(Scev); 646 } 647 648 SCEVParameterRewriter(ScalarEvolution &S, ValueToValueMap &M, bool C) 649 : SE(S), Map(M), InterpretConsts(C) {} 650 651 const SCEV *visitConstant(const SCEVConstant *Constant) { 652 return Constant; 653 } 654 655 const SCEV *visitTruncateExpr(const SCEVTruncateExpr *Expr) { 656 const SCEV *Operand = visit(Expr->getOperand()); 657 return SE.getTruncateExpr(Operand, Expr->getType()); 658 } 659 660 const SCEV *visitZeroExtendExpr(const SCEVZeroExtendExpr *Expr) { 661 const SCEV *Operand = visit(Expr->getOperand()); 662 return SE.getZeroExtendExpr(Operand, Expr->getType()); 663 } 664 665 const SCEV *visitSignExtendExpr(const SCEVSignExtendExpr *Expr) { 666 const SCEV *Operand = visit(Expr->getOperand()); 667 return SE.getSignExtendExpr(Operand, Expr->getType()); 668 } 669 670 const SCEV *visitAddExpr(const SCEVAddExpr *Expr) { 671 SmallVector<const SCEV *, 2> Operands; 672 for (int i = 0, e = Expr->getNumOperands(); i < e; ++i) 673 Operands.push_back(visit(Expr->getOperand(i))); 674 return SE.getAddExpr(Operands); 675 } 676 677 const SCEV *visitMulExpr(const SCEVMulExpr *Expr) { 678 SmallVector<const SCEV *, 2> Operands; 679 for (int i = 0, e = Expr->getNumOperands(); i < e; ++i) 680 Operands.push_back(visit(Expr->getOperand(i))); 681 return SE.getMulExpr(Operands); 682 } 683 684 const SCEV *visitUDivExpr(const SCEVUDivExpr *Expr) { 685 return SE.getUDivExpr(visit(Expr->getLHS()), visit(Expr->getRHS())); 686 } 687 688 const SCEV *visitAddRecExpr(const SCEVAddRecExpr *Expr) { 689 SmallVector<const SCEV *, 2> Operands; 690 for (int i = 0, e = Expr->getNumOperands(); i < e; ++i) 691 Operands.push_back(visit(Expr->getOperand(i))); 692 return SE.getAddRecExpr(Operands, Expr->getLoop(), 693 Expr->getNoWrapFlags()); 694 } 695 696 const SCEV *visitSMaxExpr(const SCEVSMaxExpr *Expr) { 697 SmallVector<const SCEV *, 2> Operands; 698 for (int i = 0, e = Expr->getNumOperands(); i < e; ++i) 699 Operands.push_back(visit(Expr->getOperand(i))); 700 return SE.getSMaxExpr(Operands); 701 } 702 703 const SCEV *visitUMaxExpr(const SCEVUMaxExpr *Expr) { 704 SmallVector<const SCEV *, 2> Operands; 705 for (int i = 0, e = Expr->getNumOperands(); i < e; ++i) 706 Operands.push_back(visit(Expr->getOperand(i))); 707 return SE.getUMaxExpr(Operands); 708 } 709 710 const SCEV *visitUnknown(const SCEVUnknown *Expr) { 711 Value *V = Expr->getValue(); 712 if (Map.count(V)) { 713 Value *NV = Map[V]; 714 if (InterpretConsts && isa<ConstantInt>(NV)) 715 return SE.getConstant(cast<ConstantInt>(NV)); 716 return SE.getUnknown(NV); 717 } 718 return Expr; 719 } 720 721 const SCEV *visitCouldNotCompute(const SCEVCouldNotCompute *Expr) { 722 return Expr; 723 } 724 725 private: 726 ScalarEvolution &SE; 727 ValueToValueMap ⤅ 728 bool InterpretConsts; 729 }; 730 731 typedef DenseMap<const Loop*, const SCEV*> LoopToScevMapT; 732 733 /// The SCEVApplyRewriter takes a scalar evolution expression and applies 734 /// the Map (Loop -> SCEV) to all AddRecExprs. 735 struct SCEVApplyRewriter 736 : public SCEVVisitor<SCEVApplyRewriter, const SCEV*> { 737 public: 738 static const SCEV *rewrite(const SCEV *Scev, LoopToScevMapT &Map, 739 ScalarEvolution &SE) { 740 SCEVApplyRewriter Rewriter(SE, Map); 741 return Rewriter.visit(Scev); 742 } 743 744 SCEVApplyRewriter(ScalarEvolution &S, LoopToScevMapT &M) 745 : SE(S), Map(M) {} 746 747 const SCEV *visitConstant(const SCEVConstant *Constant) { 748 return Constant; 749 } 750 751 const SCEV *visitTruncateExpr(const SCEVTruncateExpr *Expr) { 752 const SCEV *Operand = visit(Expr->getOperand()); 753 return SE.getTruncateExpr(Operand, Expr->getType()); 754 } 755 756 const SCEV *visitZeroExtendExpr(const SCEVZeroExtendExpr *Expr) { 757 const SCEV *Operand = visit(Expr->getOperand()); 758 return SE.getZeroExtendExpr(Operand, Expr->getType()); 759 } 760 761 const SCEV *visitSignExtendExpr(const SCEVSignExtendExpr *Expr) { 762 const SCEV *Operand = visit(Expr->getOperand()); 763 return SE.getSignExtendExpr(Operand, Expr->getType()); 764 } 765 766 const SCEV *visitAddExpr(const SCEVAddExpr *Expr) { 767 SmallVector<const SCEV *, 2> Operands; 768 for (int i = 0, e = Expr->getNumOperands(); i < e; ++i) 769 Operands.push_back(visit(Expr->getOperand(i))); 770 return SE.getAddExpr(Operands); 771 } 772 773 const SCEV *visitMulExpr(const SCEVMulExpr *Expr) { 774 SmallVector<const SCEV *, 2> Operands; 775 for (int i = 0, e = Expr->getNumOperands(); i < e; ++i) 776 Operands.push_back(visit(Expr->getOperand(i))); 777 return SE.getMulExpr(Operands); 778 } 779 780 const SCEV *visitUDivExpr(const SCEVUDivExpr *Expr) { 781 return SE.getUDivExpr(visit(Expr->getLHS()), visit(Expr->getRHS())); 782 } 783 784 const SCEV *visitAddRecExpr(const SCEVAddRecExpr *Expr) { 785 SmallVector<const SCEV *, 2> Operands; 786 for (int i = 0, e = Expr->getNumOperands(); i < e; ++i) 787 Operands.push_back(visit(Expr->getOperand(i))); 788 789 const Loop *L = Expr->getLoop(); 790 const SCEV *Res = SE.getAddRecExpr(Operands, L, Expr->getNoWrapFlags()); 791 792 if (0 == Map.count(L)) 793 return Res; 794 795 const SCEVAddRecExpr *Rec = (const SCEVAddRecExpr *) Res; 796 return Rec->evaluateAtIteration(Map[L], SE); 797 } 798 799 const SCEV *visitSMaxExpr(const SCEVSMaxExpr *Expr) { 800 SmallVector<const SCEV *, 2> Operands; 801 for (int i = 0, e = Expr->getNumOperands(); i < e; ++i) 802 Operands.push_back(visit(Expr->getOperand(i))); 803 return SE.getSMaxExpr(Operands); 804 } 805 806 const SCEV *visitUMaxExpr(const SCEVUMaxExpr *Expr) { 807 SmallVector<const SCEV *, 2> Operands; 808 for (int i = 0, e = Expr->getNumOperands(); i < e; ++i) 809 Operands.push_back(visit(Expr->getOperand(i))); 810 return SE.getUMaxExpr(Operands); 811 } 812 813 const SCEV *visitUnknown(const SCEVUnknown *Expr) { 814 return Expr; 815 } 816 817 const SCEV *visitCouldNotCompute(const SCEVCouldNotCompute *Expr) { 818 return Expr; 819 } 820 821 private: 822 ScalarEvolution &SE; 823 LoopToScevMapT ⤅ 824 }; 825 826 /// Applies the Map (Loop -> SCEV) to the given Scev. 827 static inline const SCEV *apply(const SCEV *Scev, LoopToScevMapT &Map, 828 ScalarEvolution &SE) { 829 return SCEVApplyRewriter::rewrite(Scev, Map, SE); 830 } 831 832 } 833 834 #endif 835