diff options
Diffstat (limited to 'lib/Analysis/ConstantFolding.cpp')
| -rw-r--r-- | lib/Analysis/ConstantFolding.cpp | 14 | 
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/Analysis/ConstantFolding.cpp b/lib/Analysis/ConstantFolding.cpp index 1cdadbfcea41..96f738edad4e 100644 --- a/lib/Analysis/ConstantFolding.cpp +++ b/lib/Analysis/ConstantFolding.cpp @@ -564,6 +564,7 @@ static Constant *SymbolicallyEvaluateGEP(Constant *const *Ops, unsigned NumOps,    // we eliminate over-indexing of the notional static type array bounds.    // This makes it easy to determine if the getelementptr is "inbounds".    // Also, this helps GlobalOpt do SROA on GlobalVariables. +  Ptr = cast<Constant>(Ptr->stripPointerCasts());    const Type *Ty = Ptr->getType();    SmallVector<Constant*, 32> NewIdxs;    do { @@ -671,8 +672,13 @@ Constant *llvm::ConstantFoldInstruction(Instruction *I, const TargetData *TD) {  Constant *llvm::ConstantFoldConstantExpression(ConstantExpr *CE,                                                 const TargetData *TD) {    SmallVector<Constant*, 8> Ops; -  for (User::op_iterator i = CE->op_begin(), e = CE->op_end(); i != e; ++i) -    Ops.push_back(cast<Constant>(*i)); +  for (User::op_iterator i = CE->op_begin(), e = CE->op_end(); i != e; ++i) { +    Constant *NewC = cast<Constant>(*i); +    // Recursively fold the ConstantExpr's operands. +    if (ConstantExpr *NewCE = dyn_cast<ConstantExpr>(NewC)) +      NewC = ConstantFoldConstantExpression(NewCE, TD); +    Ops.push_back(NewC); +  }    if (CE->isCompare())      return ConstantFoldCompareInstOperands(CE->getPredicate(), Ops[0], Ops[1], @@ -687,6 +693,10 @@ Constant *llvm::ConstantFoldConstantExpression(ConstantExpr *CE,  /// attempting to fold instructions like loads and stores, which have no  /// constant expression form.  /// +/// TODO: This function neither utilizes nor preserves nsw/nuw/inbounds/etc +/// information, due to only being passed an opcode and operands. Constant +/// folding using this function strips this information. +///  Constant *llvm::ConstantFoldInstOperands(unsigned Opcode, const Type *DestTy,                                            Constant* const* Ops, unsigned NumOps,                                           const TargetData *TD) {  | 
