Changes in directory llvm/lib/Transforms/Scalar:
InstructionCombining.cpp updated: 1.395 -> 1.396 --- Log message: Teach instcombine to promote stuff like (cast (malloc sbyte, 8*X) to int*) into: malloc int, (2*X) --- Diffs of the changes: (+26 -7) InstructionCombining.cpp | 33 ++++++++++++++++++++++++++------- 1 files changed, 26 insertions(+), 7 deletions(-) Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.395 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.396 --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.395 Thu Oct 27 01:12:00 2005 +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Thu Oct 27 01:24:46 2005 @@ -3834,19 +3834,38 @@ if (ConstantUInt *CI = dyn_cast<ConstantUInt>(NumElements)) { ArraySizeScale = CI->getValue(); NumElements = ConstantUInt::get(Type::UIntTy, 1); + } else if (ShiftInst *SI = dyn_cast<ShiftInst>(NumElements)) { + if (SI->getOpcode() == Instruction::Shl) + if (ConstantUInt *CUI = dyn_cast<ConstantUInt>(SI->getOperand(1))) { + // This is a value scaled by '1 << the shift amt'. + NumElements = SI->getOperand(0); + ArraySizeScale = 1U << CUI->getValue(); + } + } else if (isa<Instruction>(NumElements) && + cast<Instruction>(NumElements)->getOpcode() == Instruction::Mul){ + BinaryOperator *BO = cast<BinaryOperator>(NumElements); + if (ConstantUInt *Scale = cast<ConstantUInt>(BO->getOperand(1))) { + // This value is scaled by 'Scale'. + NumElements = BO->getOperand(0); + ArraySizeScale = Scale->getValue(); + } } // If we can now satisfy the modulus, by using a non-1 scale, we really can // do the xform. if ((AllocElTySize*ArraySizeScale) % CastElTySize != 0) return 0; - Amt = ConstantUInt::get(Type::UIntTy, - (AllocElTySize*ArraySizeScale)/CastElTySize); - if (ConstantUInt *CI = dyn_cast<ConstantUInt>(NumElements)) - Amt = ConstantExpr::getMul(CI, cast<ConstantUInt>(Amt)); - else { - Instruction *Tmp = BinaryOperator::createMul(Amt, NumElements, "tmp"); - Amt = InsertNewInstBefore(Tmp, AI); + unsigned Scale = (AllocElTySize*ArraySizeScale)/CastElTySize; + if (Scale == 1) { + Amt = NumElements; + } else { + Amt = ConstantUInt::get(Type::UIntTy, Scale); + if (ConstantUInt *CI = dyn_cast<ConstantUInt>(NumElements)) + Amt = ConstantExpr::getMul(CI, cast<ConstantUInt>(Amt)); + else if (cast<ConstantUInt>(Amt)->getValue() == 1) { + Instruction *Tmp = BinaryOperator::createMul(Amt, NumElements, "tmp"); + Amt = InsertNewInstBefore(Tmp, AI); + } } } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits