aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2010-11-17 22:27:42 +0000
committerDan Gohman <gohman@apple.com>2010-11-17 22:27:42 +0000
commit4ce32db913beb6ae27df2fa0a9db5d68fd4889d2 (patch)
tree91450bb144255afdc09e8625ffba157068a91e08 /include
parent2f7aed39a3082a3e0bb35475e8ed0cb782fef4b5 (diff)
downloadexternal_llvm-4ce32db913beb6ae27df2fa0a9db5d68fd4889d2.zip
external_llvm-4ce32db913beb6ae27df2fa0a9db5d68fd4889d2.tar.gz
external_llvm-4ce32db913beb6ae27df2fa0a9db5d68fd4889d2.tar.bz2
Make SCEV::getType() and SCEV::print non-virtual. Move SCEV::hasOperand
to ScalarEvolution. Delete SCEV::~SCEV. SCEV is no longer virtual. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119578 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Analysis/ScalarEvolution.h20
-rw-r--r--include/llvm/Analysis/ScalarEvolutionExpressions.h61
2 files changed, 19 insertions, 62 deletions
diff --git a/include/llvm/Analysis/ScalarEvolution.h b/include/llvm/Analysis/ScalarEvolution.h
index 30b019c..750a090 100644
--- a/include/llvm/Analysis/ScalarEvolution.h
+++ b/include/llvm/Analysis/ScalarEvolution.h
@@ -70,8 +70,7 @@ namespace llvm {
private:
SCEV(const SCEV &); // DO NOT IMPLEMENT
void operator=(const SCEV &); // DO NOT IMPLEMENT
- protected:
- virtual ~SCEV();
+
public:
explicit SCEV(const FoldingSetNodeIDRef ID, unsigned SCEVTy) :
FastID(ID), SCEVType(SCEVTy), SubclassData(0) {}
@@ -80,7 +79,7 @@ namespace llvm {
/// getType - Return the LLVM type of this SCEV expression.
///
- virtual const Type *getType() const = 0;
+ const Type *getType() const;
/// isZero - Return true if the expression is a constant zero.
///
@@ -95,14 +94,10 @@ namespace llvm {
///
bool isAllOnesValue() const;
- /// hasOperand - Test whether this SCEV has Op as a direct or
- /// indirect operand.
- virtual bool hasOperand(const SCEV *Op) const = 0;
-
/// print - Print out the internal representation of this scalar to the
/// specified stream. This should really only be used for debugging
/// purposes.
- virtual void print(raw_ostream &OS) const = 0;
+ void print(raw_ostream &OS) const;
/// dump - This method is used for debugging.
///
@@ -137,11 +132,6 @@ namespace llvm {
struct SCEVCouldNotCompute : public SCEV {
SCEVCouldNotCompute();
- // None of these methods are valid for this object.
- virtual const Type *getType() const;
- virtual void print(raw_ostream &OS) const;
- virtual bool hasOperand(const SCEV *Op) const;
-
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVCouldNotCompute *S) { return true; }
static bool classof(const SCEV *S);
@@ -691,6 +681,10 @@ namespace llvm {
/// properly dominate the specified basic block.
bool properlyDominates(const SCEV *S, BasicBlock *BB) const;
+ /// hasOperand - Test whether the given SCEV has Op as a direct or
+ /// indirect operand.
+ bool hasOperand(const SCEV *S, const SCEV *Op) const;
+
virtual bool runOnFunction(Function &F);
virtual void releaseMemory();
virtual void getAnalysisUsage(AnalysisUsage &AU) const;
diff --git a/include/llvm/Analysis/ScalarEvolutionExpressions.h b/include/llvm/Analysis/ScalarEvolutionExpressions.h
index 4d95635..db432c8 100644
--- a/include/llvm/Analysis/ScalarEvolutionExpressions.h
+++ b/include/llvm/Analysis/ScalarEvolutionExpressions.h
@@ -42,13 +42,7 @@ namespace llvm {
public:
ConstantInt *getValue() const { return V; }
- virtual const Type *getType() const;
-
- virtual bool hasOperand(const SCEV *) const {
- return false;
- }
-
- virtual void print(raw_ostream &OS) const;
+ const Type *getType() const { return V->getType(); }
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVConstant *S) { return true; }
@@ -70,11 +64,7 @@ namespace llvm {
public:
const SCEV *getOperand() const { return Op; }
- virtual const Type *getType() const { return Ty; }
-
- virtual bool hasOperand(const SCEV *O) const {
- return Op == O || Op->hasOperand(O);
- }
+ const Type *getType() const { return Ty; }
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVCastExpr *S) { return true; }
@@ -96,8 +86,6 @@ namespace llvm {
const SCEV *op, const Type *ty);
public:
- virtual void print(raw_ostream &OS) const;
-
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVTruncateExpr *S) { return true; }
static inline bool classof(const SCEV *S) {
@@ -116,8 +104,6 @@ namespace llvm {
const SCEV *op, const Type *ty);
public:
- virtual void print(raw_ostream &OS) const;
-
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVZeroExtendExpr *S) { return true; }
static inline bool classof(const SCEV *S) {
@@ -136,8 +122,6 @@ namespace llvm {
const SCEV *op, const Type *ty);
public:
- virtual void print(raw_ostream &OS) const;
-
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVSignExtendExpr *S) { return true; }
static inline bool classof(const SCEV *S) {
@@ -174,9 +158,7 @@ namespace llvm {
op_iterator op_begin() const { return Operands; }
op_iterator op_end() const { return Operands + NumOperands; }
- virtual bool hasOperand(const SCEV *O) const;
-
- virtual const Type *getType() const { return getOperand(0)->getType(); }
+ const Type *getType() const { return getOperand(0)->getType(); }
bool hasNoUnsignedWrap() const { return SubclassData & (1 << 0); }
void setHasNoUnsignedWrap(bool B) {
@@ -209,10 +191,6 @@ namespace llvm {
: SCEVNAryExpr(ID, T, O, N) {}
public:
- virtual const char *getOperationStr() const = 0;
-
- virtual void print(raw_ostream &OS) const;
-
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVCommutativeExpr *S) { return true; }
static inline bool classof(const SCEV *S) {
@@ -236,9 +214,7 @@ namespace llvm {
}
public:
- virtual const char *getOperationStr() const { return " + "; }
-
- virtual const Type *getType() const {
+ const Type *getType() const {
// Use the type of the last operand, which is likely to be a pointer
// type, if there is one. This doesn't usually matter, but it can help
// reduce casts when the expressions are expanded.
@@ -264,8 +240,6 @@ namespace llvm {
}
public:
- virtual const char *getOperationStr() const { return " * "; }
-
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVMulExpr *S) { return true; }
static inline bool classof(const SCEV *S) {
@@ -289,14 +263,15 @@ namespace llvm {
const SCEV *getLHS() const { return LHS; }
const SCEV *getRHS() const { return RHS; }
- virtual bool hasOperand(const SCEV *O) const {
- return O == LHS || O == RHS || LHS->hasOperand(O) || RHS->hasOperand(O);
+ const Type *getType() const {
+ // In most cases the types of LHS and RHS will be the same, but in some
+ // crazy cases one or the other may be a pointer. ScalarEvolution doesn't
+ // depend on the type for correctness, but handling types carefully can
+ // avoid extra casts in the SCEVExpander. The LHS is more likely to be
+ // a pointer type than the RHS, so use the RHS' type here.
+ return getRHS()->getType();
}
- virtual const Type *getType() const;
-
- void print(raw_ostream &OS) const;
-
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVUDivExpr *S) { return true; }
static inline bool classof(const SCEV *S) {
@@ -371,8 +346,6 @@ namespace llvm {
return cast<SCEVAddRecExpr>(SE.getAddExpr(this, getStepRecurrence(SE)));
}
- virtual void print(raw_ostream &OS) const;
-
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVAddRecExpr *S) { return true; }
static inline bool classof(const SCEV *S) {
@@ -396,8 +369,6 @@ namespace llvm {
}
public:
- virtual const char *getOperationStr() const { return " smax "; }
-
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVSMaxExpr *S) { return true; }
static inline bool classof(const SCEV *S) {
@@ -421,8 +392,6 @@ namespace llvm {
}
public:
- virtual const char *getOperationStr() const { return " umax "; }
-
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVUMaxExpr *S) { return true; }
static inline bool classof(const SCEV *S) {
@@ -468,13 +437,7 @@ namespace llvm {
bool isAlignOf(const Type *&AllocTy) const;
bool isOffsetOf(const Type *&STy, Constant *&FieldNo) const;
- virtual bool hasOperand(const SCEV *) const {
- return false;
- }
-
- virtual const Type *getType() const;
-
- virtual void print(raw_ostream &OS) const;
+ const Type *getType() const { return getValPtr()->getType(); }
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SCEVUnknown *S) { return true; }