From eb3948be16c37396fb3c50ef2c51f7f2da9c34d9 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Wed, 29 Apr 2009 22:29:01 +0000 Subject: [PATCH] Implement getSCEVAtScope for SCEV cast expressions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70422 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ScalarEvolution.cpp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 257186f4599..8ecdd11d13a 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -2707,8 +2707,31 @@ SCEVHandle ScalarEvolution::getSCEVAtScope(SCEV *V, const Loop *L) { return UnknownValue; } - //assert(0 && "Unknown SCEV type!"); - return UnknownValue; + if (SCEVZeroExtendExpr *Cast = dyn_cast(V)) { + SCEVHandle Op = getSCEVAtScope(Cast->getOperand(), L); + if (Op == UnknownValue) return Op; + if (Op == Cast->getOperand()) + return Cast; // must be loop invariant + return getZeroExtendExpr(Op, Cast->getType()); + } + + if (SCEVSignExtendExpr *Cast = dyn_cast(V)) { + SCEVHandle Op = getSCEVAtScope(Cast->getOperand(), L); + if (Op == UnknownValue) return Op; + if (Op == Cast->getOperand()) + return Cast; // must be loop invariant + return getSignExtendExpr(Op, Cast->getType()); + } + + if (SCEVTruncateExpr *Cast = dyn_cast(V)) { + SCEVHandle Op = getSCEVAtScope(Cast->getOperand(), L); + if (Op == UnknownValue) return Op; + if (Op == Cast->getOperand()) + return Cast; // must be loop invariant + return getTruncateExpr(Op, Cast->getType()); + } + + assert(0 && "Unknown SCEV type!"); } /// getSCEVAtScope - Return a SCEV expression handle for the specified value