67f5e06977cda873dc8fa2d5ad46677481fbd136
[oota-llvm.git] / include / llvm / Analysis / ScalarEvolutionExpressions.h
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_SCALAREVOLUTION_EXPRESSIONS_H
15 #define LLVM_ANALYSIS_SCALAREVOLUTION_EXPRESSIONS_H
16
17 #include "llvm/Analysis/ScalarEvolution.h"
18 #include "llvm/Support/ErrorHandling.h"
19
20 namespace llvm {
21   class ConstantInt;
22   class ConstantRange;
23   class DominatorTree;
24
25   enum SCEVTypes {
26     // These should be ordered in terms of increasing complexity to make the
27     // folders simpler.
28     scConstant, scTruncate, scZeroExtend, scSignExtend, scAddExpr, scMulExpr,
29     scUDivExpr, scAddRecExpr, scUMaxExpr, scSMaxExpr,
30     scFieldOffset, scAllocSize, scUnknown, scCouldNotCompute
31   };
32
33   //===--------------------------------------------------------------------===//
34   /// SCEVConstant - This class represents a constant integer value.
35   ///
36   class SCEVConstant : public SCEV {
37     friend class ScalarEvolution;
38
39     ConstantInt *V;
40     SCEVConstant(const FoldingSetNodeID &ID, ConstantInt *v) :
41       SCEV(ID, scConstant), V(v) {}
42   public:
43     ConstantInt *getValue() const { return V; }
44
45     virtual bool isLoopInvariant(const Loop *L) const {
46       return true;
47     }
48
49     virtual bool hasComputableLoopEvolution(const Loop *L) const {
50       return false;  // Not loop variant
51     }
52
53     virtual const Type *getType() const;
54
55     virtual bool hasOperand(const SCEV *) const {
56       return false;
57     }
58
59     bool dominates(BasicBlock *BB, DominatorTree *DT) const {
60       return true;
61     }
62
63     bool properlyDominates(BasicBlock *BB, DominatorTree *DT) const {
64       return true;
65     }
66
67     virtual void print(raw_ostream &OS) const;
68
69     /// Methods for support type inquiry through isa, cast, and dyn_cast:
70     static inline bool classof(const SCEVConstant *S) { return true; }
71     static inline bool classof(const SCEV *S) {
72       return S->getSCEVType() == scConstant;
73     }
74   };
75
76   //===--------------------------------------------------------------------===//
77   /// SCEVCastExpr - This is the base class for unary cast operator classes.
78   ///
79   class SCEVCastExpr : public SCEV {
80   protected:
81     const SCEV *Op;
82     const Type *Ty;
83
84     SCEVCastExpr(const FoldingSetNodeID &ID,
85                  unsigned SCEVTy, const SCEV *op, const Type *ty);
86
87   public:
88     const SCEV *getOperand() const { return Op; }
89     virtual const Type *getType() const { return Ty; }
90
91     virtual bool isLoopInvariant(const Loop *L) const {
92       return Op->isLoopInvariant(L);
93     }
94
95     virtual bool hasComputableLoopEvolution(const Loop *L) const {
96       return Op->hasComputableLoopEvolution(L);
97     }
98
99     virtual bool hasOperand(const SCEV *O) const {
100       return Op == O || Op->hasOperand(O);
101     }
102
103     virtual bool dominates(BasicBlock *BB, DominatorTree *DT) const;
104
105     virtual bool properlyDominates(BasicBlock *BB, DominatorTree *DT) const;
106
107     /// Methods for support type inquiry through isa, cast, and dyn_cast:
108     static inline bool classof(const SCEVCastExpr *S) { return true; }
109     static inline bool classof(const SCEV *S) {
110       return S->getSCEVType() == scTruncate ||
111              S->getSCEVType() == scZeroExtend ||
112              S->getSCEVType() == scSignExtend;
113     }
114   };
115
116   //===--------------------------------------------------------------------===//
117   /// SCEVTruncateExpr - This class represents a truncation of an integer value
118   /// to a smaller integer value.
119   ///
120   class SCEVTruncateExpr : public SCEVCastExpr {
121     friend class ScalarEvolution;
122
123     SCEVTruncateExpr(const FoldingSetNodeID &ID,
124                      const SCEV *op, const Type *ty);
125
126   public:
127     virtual void print(raw_ostream &OS) const;
128
129     /// Methods for support type inquiry through isa, cast, and dyn_cast:
130     static inline bool classof(const SCEVTruncateExpr *S) { return true; }
131     static inline bool classof(const SCEV *S) {
132       return S->getSCEVType() == scTruncate;
133     }
134   };
135
136   //===--------------------------------------------------------------------===//
137   /// SCEVZeroExtendExpr - This class represents a zero extension of a small
138   /// integer value to a larger integer value.
139   ///
140   class SCEVZeroExtendExpr : public SCEVCastExpr {
141     friend class ScalarEvolution;
142
143     SCEVZeroExtendExpr(const FoldingSetNodeID &ID,
144                        const SCEV *op, const Type *ty);
145
146   public:
147     virtual void print(raw_ostream &OS) const;
148
149     /// Methods for support type inquiry through isa, cast, and dyn_cast:
150     static inline bool classof(const SCEVZeroExtendExpr *S) { return true; }
151     static inline bool classof(const SCEV *S) {
152       return S->getSCEVType() == scZeroExtend;
153     }
154   };
155
156   //===--------------------------------------------------------------------===//
157   /// SCEVSignExtendExpr - This class represents a sign extension of a small
158   /// integer value to a larger integer value.
159   ///
160   class SCEVSignExtendExpr : public SCEVCastExpr {
161     friend class ScalarEvolution;
162
163     SCEVSignExtendExpr(const FoldingSetNodeID &ID,
164                        const SCEV *op, const Type *ty);
165
166   public:
167     virtual void print(raw_ostream &OS) const;
168
169     /// Methods for support type inquiry through isa, cast, and dyn_cast:
170     static inline bool classof(const SCEVSignExtendExpr *S) { return true; }
171     static inline bool classof(const SCEV *S) {
172       return S->getSCEVType() == scSignExtend;
173     }
174   };
175
176
177   //===--------------------------------------------------------------------===//
178   /// SCEVNAryExpr - This node is a base class providing common
179   /// functionality for n'ary operators.
180   ///
181   class SCEVNAryExpr : public SCEV {
182   protected:
183     SmallVector<const SCEV *, 8> Operands;
184
185     SCEVNAryExpr(const FoldingSetNodeID &ID,
186                  enum SCEVTypes T, const SmallVectorImpl<const SCEV *> &ops)
187       : SCEV(ID, T), Operands(ops.begin(), ops.end()) {}
188
189   public:
190     unsigned getNumOperands() const { return (unsigned)Operands.size(); }
191     const SCEV *getOperand(unsigned i) const {
192       assert(i < Operands.size() && "Operand index out of range!");
193       return Operands[i];
194     }
195
196     const SmallVectorImpl<const SCEV *> &getOperands() const {
197       return Operands;
198     }
199     typedef SmallVectorImpl<const SCEV *>::const_iterator op_iterator;
200     op_iterator op_begin() const { return Operands.begin(); }
201     op_iterator op_end() const { return Operands.end(); }
202
203     virtual bool isLoopInvariant(const Loop *L) const {
204       for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
205         if (!getOperand(i)->isLoopInvariant(L)) return false;
206       return true;
207     }
208
209     // hasComputableLoopEvolution - N-ary expressions have computable loop
210     // evolutions iff they have at least one operand that varies with the loop,
211     // but that all varying operands are computable.
212     virtual bool hasComputableLoopEvolution(const Loop *L) const {
213       bool HasVarying = false;
214       for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
215         if (!getOperand(i)->isLoopInvariant(L)) {
216           if (getOperand(i)->hasComputableLoopEvolution(L))
217             HasVarying = true;
218           else
219             return false;
220         }
221       return HasVarying;
222     }
223
224     virtual bool hasOperand(const SCEV *O) const {
225       for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
226         if (O == getOperand(i) || getOperand(i)->hasOperand(O))
227           return true;
228       return false;
229     }
230
231     bool dominates(BasicBlock *BB, DominatorTree *DT) const;
232
233     bool properlyDominates(BasicBlock *BB, DominatorTree *DT) const;
234
235     virtual const Type *getType() const { return getOperand(0)->getType(); }
236
237     /// Methods for support type inquiry through isa, cast, and dyn_cast:
238     static inline bool classof(const SCEVNAryExpr *S) { return true; }
239     static inline bool classof(const SCEV *S) {
240       return S->getSCEVType() == scAddExpr ||
241              S->getSCEVType() == scMulExpr ||
242              S->getSCEVType() == scSMaxExpr ||
243              S->getSCEVType() == scUMaxExpr ||
244              S->getSCEVType() == scAddRecExpr;
245     }
246   };
247
248   //===--------------------------------------------------------------------===//
249   /// SCEVCommutativeExpr - This node is the base class for n'ary commutative
250   /// operators.
251   ///
252   class SCEVCommutativeExpr : public SCEVNAryExpr {
253   protected:
254     SCEVCommutativeExpr(const FoldingSetNodeID &ID,
255                         enum SCEVTypes T,
256                         const SmallVectorImpl<const SCEV *> &ops)
257       : SCEVNAryExpr(ID, T, ops) {}
258
259   public:
260     virtual const char *getOperationStr() const = 0;
261
262     virtual void print(raw_ostream &OS) const;
263
264     /// Methods for support type inquiry through isa, cast, and dyn_cast:
265     static inline bool classof(const SCEVCommutativeExpr *S) { return true; }
266     static inline bool classof(const SCEV *S) {
267       return S->getSCEVType() == scAddExpr ||
268              S->getSCEVType() == scMulExpr ||
269              S->getSCEVType() == scSMaxExpr ||
270              S->getSCEVType() == scUMaxExpr;
271     }
272   };
273
274
275   //===--------------------------------------------------------------------===//
276   /// SCEVAddExpr - This node represents an addition of some number of SCEVs.
277   ///
278   class SCEVAddExpr : public SCEVCommutativeExpr {
279     friend class ScalarEvolution;
280
281     SCEVAddExpr(const FoldingSetNodeID &ID,
282                 const SmallVectorImpl<const SCEV *> &ops)
283       : SCEVCommutativeExpr(ID, scAddExpr, ops) {
284     }
285
286   public:
287     virtual const char *getOperationStr() const { return " + "; }
288
289     /// Methods for support type inquiry through isa, cast, and dyn_cast:
290     static inline bool classof(const SCEVAddExpr *S) { return true; }
291     static inline bool classof(const SCEV *S) {
292       return S->getSCEVType() == scAddExpr;
293     }
294   };
295
296   //===--------------------------------------------------------------------===//
297   /// SCEVMulExpr - This node represents multiplication of some number of SCEVs.
298   ///
299   class SCEVMulExpr : public SCEVCommutativeExpr {
300     friend class ScalarEvolution;
301
302     SCEVMulExpr(const FoldingSetNodeID &ID,
303                 const SmallVectorImpl<const SCEV *> &ops)
304       : SCEVCommutativeExpr(ID, scMulExpr, ops) {
305     }
306
307   public:
308     virtual const char *getOperationStr() const { return " * "; }
309
310     /// Methods for support type inquiry through isa, cast, and dyn_cast:
311     static inline bool classof(const SCEVMulExpr *S) { return true; }
312     static inline bool classof(const SCEV *S) {
313       return S->getSCEVType() == scMulExpr;
314     }
315   };
316
317
318   //===--------------------------------------------------------------------===//
319   /// SCEVUDivExpr - This class represents a binary unsigned division operation.
320   ///
321   class SCEVUDivExpr : public SCEV {
322     friend class ScalarEvolution;
323
324     const SCEV *LHS;
325     const SCEV *RHS;
326     SCEVUDivExpr(const FoldingSetNodeID &ID, const SCEV *lhs, const SCEV *rhs)
327       : SCEV(ID, scUDivExpr), LHS(lhs), RHS(rhs) {}
328
329   public:
330     const SCEV *getLHS() const { return LHS; }
331     const SCEV *getRHS() const { return RHS; }
332
333     virtual bool isLoopInvariant(const Loop *L) const {
334       return LHS->isLoopInvariant(L) && RHS->isLoopInvariant(L);
335     }
336
337     virtual bool hasComputableLoopEvolution(const Loop *L) const {
338       return LHS->hasComputableLoopEvolution(L) &&
339              RHS->hasComputableLoopEvolution(L);
340     }
341
342     virtual bool hasOperand(const SCEV *O) const {
343       return O == LHS || O == RHS || LHS->hasOperand(O) || RHS->hasOperand(O);
344     }
345
346     bool dominates(BasicBlock *BB, DominatorTree *DT) const;
347
348     bool properlyDominates(BasicBlock *BB, DominatorTree *DT) const;
349
350     virtual const Type *getType() const;
351
352     void print(raw_ostream &OS) const;
353
354     /// Methods for support type inquiry through isa, cast, and dyn_cast:
355     static inline bool classof(const SCEVUDivExpr *S) { return true; }
356     static inline bool classof(const SCEV *S) {
357       return S->getSCEVType() == scUDivExpr;
358     }
359   };
360
361
362   //===--------------------------------------------------------------------===//
363   /// SCEVAddRecExpr - This node represents a polynomial recurrence on the trip
364   /// count of the specified loop.  This is the primary focus of the
365   /// ScalarEvolution framework; all the other SCEV subclasses are mostly just
366   /// supporting infrastructure to allow SCEVAddRecExpr expressions to be
367   /// created and analyzed.
368   ///
369   /// All operands of an AddRec are required to be loop invariant.
370   ///
371   class SCEVAddRecExpr : public SCEVNAryExpr {
372     friend class ScalarEvolution;
373
374     const Loop *L;
375
376     SCEVAddRecExpr(const FoldingSetNodeID &ID,
377                    const SmallVectorImpl<const SCEV *> &ops, const Loop *l)
378       : SCEVNAryExpr(ID, scAddRecExpr, ops), L(l) {
379       for (size_t i = 0, e = Operands.size(); i != e; ++i)
380         assert(Operands[i]->isLoopInvariant(l) &&
381                "Operands of AddRec must be loop-invariant!");
382     }
383
384   public:
385     const SCEV *getStart() const { return Operands[0]; }
386     const Loop *getLoop() const { return L; }
387
388     /// getStepRecurrence - This method constructs and returns the recurrence
389     /// indicating how much this expression steps by.  If this is a polynomial
390     /// of degree N, it returns a chrec of degree N-1.
391     const SCEV *getStepRecurrence(ScalarEvolution &SE) const {
392       if (isAffine()) return getOperand(1);
393       return SE.getAddRecExpr(SmallVector<const SCEV *, 3>(op_begin()+1,
394                                                            op_end()),
395                               getLoop());
396     }
397
398     virtual bool hasComputableLoopEvolution(const Loop *QL) const {
399       if (L == QL) return true;
400       return false;
401     }
402
403     virtual bool isLoopInvariant(const Loop *QueryLoop) const;
404
405     /// isAffine - Return true if this is an affine AddRec (i.e., it represents
406     /// an expressions A+B*x where A and B are loop invariant values.
407     bool isAffine() const {
408       // We know that the start value is invariant.  This expression is thus
409       // affine iff the step is also invariant.
410       return getNumOperands() == 2;
411     }
412
413     /// isQuadratic - Return true if this is an quadratic AddRec (i.e., it
414     /// represents an expressions A+B*x+C*x^2 where A, B and C are loop
415     /// invariant values.  This corresponds to an addrec of the form {L,+,M,+,N}
416     bool isQuadratic() const {
417       return getNumOperands() == 3;
418     }
419
420     /// evaluateAtIteration - Return the value of this chain of recurrences at
421     /// the specified iteration number.
422     const SCEV *evaluateAtIteration(const SCEV *It, ScalarEvolution &SE) const;
423
424     /// getNumIterationsInRange - Return the number of iterations of this loop
425     /// that produce values in the specified constant range.  Another way of
426     /// looking at this is that it returns the first iteration number where the
427     /// value is not in the condition, thus computing the exit count.  If the
428     /// iteration count can't be computed, an instance of SCEVCouldNotCompute is
429     /// returned.
430     const SCEV *getNumIterationsInRange(ConstantRange Range,
431                                        ScalarEvolution &SE) const;
432
433     /// getPostIncExpr - Return an expression representing the value of
434     /// this expression one iteration of the loop ahead.
435     const SCEVAddRecExpr *getPostIncExpr(ScalarEvolution &SE) const {
436       return cast<SCEVAddRecExpr>(SE.getAddExpr(this, getStepRecurrence(SE)));
437     }
438
439     bool hasNoUnsignedWrap() const { return SubclassData & (1 << 0); }
440     void setHasNoUnsignedWrap(bool B) {
441       SubclassData = (SubclassData & ~(1 << 0)) | (B << 0);
442     }
443     bool hasNoSignedWrap() const { return SubclassData & (1 << 1); }
444     void setHasNoSignedWrap(bool B) {
445       SubclassData = (SubclassData & ~(1 << 1)) | (B << 1);
446     }
447
448     virtual void print(raw_ostream &OS) const;
449
450     /// Methods for support type inquiry through isa, cast, and dyn_cast:
451     static inline bool classof(const SCEVAddRecExpr *S) { return true; }
452     static inline bool classof(const SCEV *S) {
453       return S->getSCEVType() == scAddRecExpr;
454     }
455   };
456
457
458   //===--------------------------------------------------------------------===//
459   /// SCEVSMaxExpr - This class represents a signed maximum selection.
460   ///
461   class SCEVSMaxExpr : public SCEVCommutativeExpr {
462     friend class ScalarEvolution;
463
464     SCEVSMaxExpr(const FoldingSetNodeID &ID,
465                  const SmallVectorImpl<const SCEV *> &ops)
466       : SCEVCommutativeExpr(ID, scSMaxExpr, ops) {
467     }
468
469   public:
470     virtual const char *getOperationStr() const { return " smax "; }
471
472     /// Methods for support type inquiry through isa, cast, and dyn_cast:
473     static inline bool classof(const SCEVSMaxExpr *S) { return true; }
474     static inline bool classof(const SCEV *S) {
475       return S->getSCEVType() == scSMaxExpr;
476     }
477   };
478
479
480   //===--------------------------------------------------------------------===//
481   /// SCEVUMaxExpr - This class represents an unsigned maximum selection.
482   ///
483   class SCEVUMaxExpr : public SCEVCommutativeExpr {
484     friend class ScalarEvolution;
485
486     SCEVUMaxExpr(const FoldingSetNodeID &ID,
487                  const SmallVectorImpl<const SCEV *> &ops)
488       : SCEVCommutativeExpr(ID, scUMaxExpr, ops) {
489     }
490
491   public:
492     virtual const char *getOperationStr() const { return " umax "; }
493
494     /// Methods for support type inquiry through isa, cast, and dyn_cast:
495     static inline bool classof(const SCEVUMaxExpr *S) { return true; }
496     static inline bool classof(const SCEV *S) {
497       return S->getSCEVType() == scUMaxExpr;
498     }
499   };
500
501   //===--------------------------------------------------------------------===//
502   /// SCEVTargetDataConstant - This node is the base class for representing
503   /// target-dependent values in a target-independent way.
504   ///
505   class SCEVTargetDataConstant : public SCEV {
506   protected:
507     const Type *Ty;
508     SCEVTargetDataConstant(const FoldingSetNodeID &ID, enum SCEVTypes T,
509                            const Type *ty) :
510       SCEV(ID, T), Ty(ty) {}
511
512   public:
513     virtual bool isLoopInvariant(const Loop *) const { return true; }
514     virtual bool hasComputableLoopEvolution(const Loop *) const {
515       return false; // not computable
516     }
517
518     virtual bool hasOperand(const SCEV *) const {
519       return false;
520     }
521
522     bool dominates(BasicBlock *, DominatorTree *) const {
523       return true;
524     }
525
526     bool properlyDominates(BasicBlock *, DominatorTree *) const {
527       return true;
528     }
529
530     virtual const Type *getType() const { return Ty; }
531
532     /// Methods for support type inquiry through isa, cast, and dyn_cast:
533     static inline bool classof(const SCEVTargetDataConstant *S) { return true; }
534     static inline bool classof(const SCEV *S) {
535       return S->getSCEVType() == scFieldOffset ||
536              S->getSCEVType() == scAllocSize;
537     }
538   };
539
540   //===--------------------------------------------------------------------===//
541   /// SCEVFieldOffsetExpr - This node represents an offsetof expression.
542   ///
543   class SCEVFieldOffsetExpr : public SCEVTargetDataConstant {
544     friend class ScalarEvolution;
545
546     const StructType *STy;
547     unsigned FieldNo;
548     SCEVFieldOffsetExpr(const FoldingSetNodeID &ID, const Type *ty,
549                         const StructType *sty, unsigned fieldno) :
550       SCEVTargetDataConstant(ID, scFieldOffset, ty),
551       STy(sty), FieldNo(fieldno) {}
552
553   public:
554     const StructType *getStructType() const { return STy; }
555     unsigned getFieldNo() const { return FieldNo; }
556
557     virtual void print(raw_ostream &OS) const;
558
559     /// Methods for support type inquiry through isa, cast, and dyn_cast:
560     static inline bool classof(const SCEVFieldOffsetExpr *S) { return true; }
561     static inline bool classof(const SCEV *S) {
562       return S->getSCEVType() == scFieldOffset;
563     }
564   };
565
566   //===--------------------------------------------------------------------===//
567   /// SCEVAllocSize - This node represents a sizeof expression.
568   ///
569   class SCEVAllocSizeExpr : public SCEVTargetDataConstant {
570     friend class ScalarEvolution;
571
572     const Type *AllocTy;
573     SCEVAllocSizeExpr(const FoldingSetNodeID &ID,
574                       const Type *ty, const Type *allocty) :
575       SCEVTargetDataConstant(ID, scAllocSize, ty),
576       AllocTy(allocty) {}
577
578   public:
579     const Type *getAllocType() const { return AllocTy; }
580
581     virtual void print(raw_ostream &OS) const;
582
583     /// Methods for support type inquiry through isa, cast, and dyn_cast:
584     static inline bool classof(const SCEVAllocSizeExpr *S) { return true; }
585     static inline bool classof(const SCEV *S) {
586       return S->getSCEVType() == scAllocSize;
587     }
588   };
589
590   //===--------------------------------------------------------------------===//
591   /// SCEVUnknown - This means that we are dealing with an entirely unknown SCEV
592   /// value, and only represent it as its LLVM Value.  This is the "bottom"
593   /// value for the analysis.
594   ///
595   class SCEVUnknown : public SCEV {
596     friend class ScalarEvolution;
597
598     Value *V;
599     SCEVUnknown(const FoldingSetNodeID &ID, Value *v) :
600       SCEV(ID, scUnknown), V(v) {}
601
602   public:
603     Value *getValue() const { return V; }
604
605     virtual bool isLoopInvariant(const Loop *L) const;
606     virtual bool hasComputableLoopEvolution(const Loop *QL) const {
607       return false; // not computable
608     }
609
610     virtual bool hasOperand(const SCEV *) const {
611       return false;
612     }
613
614     bool dominates(BasicBlock *BB, DominatorTree *DT) const;
615
616     bool properlyDominates(BasicBlock *BB, DominatorTree *DT) const;
617
618     virtual const Type *getType() const;
619
620     virtual void print(raw_ostream &OS) const;
621
622     /// Methods for support type inquiry through isa, cast, and dyn_cast:
623     static inline bool classof(const SCEVUnknown *S) { return true; }
624     static inline bool classof(const SCEV *S) {
625       return S->getSCEVType() == scUnknown;
626     }
627   };
628
629   /// SCEVVisitor - This class defines a simple visitor class that may be used
630   /// for various SCEV analysis purposes.
631   template<typename SC, typename RetVal=void>
632   struct SCEVVisitor {
633     RetVal visit(const SCEV *S) {
634       switch (S->getSCEVType()) {
635       case scConstant:
636         return ((SC*)this)->visitConstant((const SCEVConstant*)S);
637       case scTruncate:
638         return ((SC*)this)->visitTruncateExpr((const SCEVTruncateExpr*)S);
639       case scZeroExtend:
640         return ((SC*)this)->visitZeroExtendExpr((const SCEVZeroExtendExpr*)S);
641       case scSignExtend:
642         return ((SC*)this)->visitSignExtendExpr((const SCEVSignExtendExpr*)S);
643       case scAddExpr:
644         return ((SC*)this)->visitAddExpr((const SCEVAddExpr*)S);
645       case scMulExpr:
646         return ((SC*)this)->visitMulExpr((const SCEVMulExpr*)S);
647       case scUDivExpr:
648         return ((SC*)this)->visitUDivExpr((const SCEVUDivExpr*)S);
649       case scAddRecExpr:
650         return ((SC*)this)->visitAddRecExpr((const SCEVAddRecExpr*)S);
651       case scSMaxExpr:
652         return ((SC*)this)->visitSMaxExpr((const SCEVSMaxExpr*)S);
653       case scUMaxExpr:
654         return ((SC*)this)->visitUMaxExpr((const SCEVUMaxExpr*)S);
655       case scFieldOffset:
656         return ((SC*)this)->visitFieldOffsetExpr((const SCEVFieldOffsetExpr*)S);
657       case scAllocSize:
658         return ((SC*)this)->visitAllocSizeExpr((const SCEVAllocSizeExpr*)S);
659       case scUnknown:
660         return ((SC*)this)->visitUnknown((const SCEVUnknown*)S);
661       case scCouldNotCompute:
662         return ((SC*)this)->visitCouldNotCompute((const SCEVCouldNotCompute*)S);
663       default:
664         llvm_unreachable("Unknown SCEV type!");
665       }
666     }
667
668     RetVal visitCouldNotCompute(const SCEVCouldNotCompute *S) {
669       llvm_unreachable("Invalid use of SCEVCouldNotCompute!");
670       return RetVal();
671     }
672   };
673 }
674
675 #endif