diff options
author | Chris Lattner <sabre@nondot.org> | 2001-11-26 16:53:50 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2001-11-26 16:53:50 +0000 |
commit | 882572aa68041e6b79b4ffb092621ecff5615fe1 (patch) | |
tree | 0180ce88be42f594b052c5e307fd0ef97b736fe2 /lib/Analysis | |
parent | 0252755825f49dc5c2083dbf246968767f2aad14 (diff) | |
download | external_llvm-882572aa68041e6b79b4ffb092621ecff5615fe1.zip external_llvm-882572aa68041e6b79b4ffb092621ecff5615fe1.tar.gz external_llvm-882572aa68041e6b79b4ffb092621ecff5615fe1.tar.bz2 |
* Implement more powerful expr analysis of cast instructions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1335 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/Expressions.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/lib/Analysis/Expressions.cpp b/lib/Analysis/Expressions.cpp index ed04f1d..dd92212 100644 --- a/lib/Analysis/Expressions.cpp +++ b/lib/Analysis/Expressions.cpp @@ -284,21 +284,30 @@ ExprType analysis::ClassifyExpression(Value *Expr) { case Instruction::Cast: { ExprType Src(ClassifyExpression(I->getOperand(0))); - if (Src.ExprTy != ExprType::Constant) - return I; - const ConstPoolInt *Offs = Src.Offset; - if (Offs == 0) return ExprType(); - const Type *DestTy = I->getType(); if (DestTy->isPointerType()) DestTy = Type::ULongTy; // Pointer types are represented as ulong - assert(DestTy->isIntegral() && "Can only handle integral types!"); - - const ConstPoolVal *CPV =ConstRules::get(*Offs)->castTo(Offs, DestTy); - if (!CPV) return I; - assert(CPV->getType()->isIntegral() && "Must have an integral type!"); - return cast<ConstPoolInt>(CPV); + /* + if (!Src.getExprType(0)->isLosslesslyConvertableTo(DestTy)) { + if (Src.ExprTy != ExprType::Constant) + return I; // Converting cast, and not a constant value... + } + */ + + const ConstPoolInt *Offset = Src.Offset; + const ConstPoolInt *Scale = Src.Scale; + if (Offset) { + const ConstPoolVal *CPV = ConstantFoldCastInstruction(Offset, DestTy); + if (!CPV) return I; + Offset = cast<ConstPoolInt>(CPV); + } + if (Scale) { + const ConstPoolVal *CPV = ConstantFoldCastInstruction(Scale, DestTy); + if (!CPV) return I; + Scale = cast<ConstPoolInt>(CPV); + } + return ExprType(Scale, Src.Var, Offset); } // end case Instruction::Cast // TODO: Handle SUB, SHR? |