summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2009-04-23 05:15:08 +0000
committerNick Lewycky <nicholas@mxc.ca>2009-04-23 05:15:08 +0000
commitb4d9f7a9b3171d220fd1daf2bc5eaa87958f52c4 (patch)
tree70880c1948dfa04b9a5466aff1e7c03b6674884f /llvm/lib
parentdec9e1ec5e7bce54f85af95391b4d76699ab64e0 (diff)
downloadbcm5719-llvm-b4d9f7a9b3171d220fd1daf2bc5eaa87958f52c4.tar.gz
bcm5719-llvm-b4d9f7a9b3171d220fd1daf2bc5eaa87958f52c4.zip
Simplify trunc(extend(x)) in SCEVs, just for completeness. Also fix some odd
whitespace in the same file. llvm-svn: 69870
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Analysis/ScalarEvolution.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index cebf4d704fe..409bad91669 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -658,6 +658,14 @@ SCEVHandle ScalarEvolution::getTruncateExpr(const SCEVHandle &Op, const Type *Ty
if (SCEVTruncateExpr *ST = dyn_cast<SCEVTruncateExpr>(Op))
return getTruncateExpr(ST->getOperand(), Ty);
+ // trunc(sext(x)) --> sext(x) if widening or trunc(x) if narrowing
+ if (SCEVSignExtendExpr *SS = dyn_cast<SCEVSignExtendExpr>(Op))
+ return getTruncateOrSignExtend(SS->getOperand(), Ty);
+
+ // trunc(zext(x)) --> zext(x) if widening or trunc(x) if narrowing
+ if (SCEVZeroExtendExpr *SZ = dyn_cast<SCEVZeroExtendExpr>(Op))
+ return getTruncateOrZeroExtend(SZ->getOperand(), Ty);
+
// If the input value is a chrec scev made out of constants, truncate
// all of the constants.
if (SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Op)) {
@@ -1152,7 +1160,7 @@ SCEVHandle ScalarEvolution::getAddRecExpr(const SCEVHandle &Start,
/// SCEVAddRecExpr::get - Get a add recurrence expression for the
/// specified loop. Simplify the expression as much as possible.
SCEVHandle ScalarEvolution::getAddRecExpr(std::vector<SCEVHandle> &Operands,
- const Loop *L) {
+ const Loop *L) {
if (Operands.size() == 1) return Operands[0];
if (Operands.back()->isZero()) {
@@ -1484,7 +1492,7 @@ SCEVHandle ScalarEvolution::getNotSCEV(const SCEVHandle &V) {
/// getMinusSCEV - Return a SCEV corresponding to LHS - RHS.
///
SCEVHandle ScalarEvolution::getMinusSCEV(const SCEVHandle &LHS,
- const SCEVHandle &RHS) {
+ const SCEVHandle &RHS) {
// X - Y --> X + -Y
return getAddExpr(LHS, getNegativeSCEV(RHS));
}
@@ -1494,7 +1502,7 @@ SCEVHandle ScalarEvolution::getMinusSCEV(const SCEVHandle &LHS,
/// extended.
SCEVHandle
ScalarEvolution::getTruncateOrZeroExtend(const SCEVHandle &V,
- const Type *Ty) {
+ const Type *Ty) {
const Type *SrcTy = V->getType();
assert((SrcTy->isInteger() || (TD && isa<PointerType>(SrcTy))) &&
(Ty->isInteger() || (TD && isa<PointerType>(Ty))) &&
@@ -1511,7 +1519,7 @@ ScalarEvolution::getTruncateOrZeroExtend(const SCEVHandle &V,
/// extended.
SCEVHandle
ScalarEvolution::getTruncateOrSignExtend(const SCEVHandle &V,
- const Type *Ty) {
+ const Type *Ty) {
const Type *SrcTy = V->getType();
assert((SrcTy->isInteger() || (TD && isa<PointerType>(SrcTy))) &&
(Ty->isInteger() || (TD && isa<PointerType>(Ty))) &&
OpenPOWER on IntegriCloud