From e679288a30e150f4b1bbe6cc1ccd80fb650a0d7b Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 27 Oct 2005 06:24:46 +0000 Subject: [PATCH] Teach instcombine to promote stuff like (cast (malloc sbyte, 8*X) to int*) into: malloc int, (2*X) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24032 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Scalar/InstructionCombining.cpp | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 7ac1eccdf22..1a9b9d7424a 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -3834,19 +3834,38 @@ Instruction *InstCombiner::PromoteCastOfAllocation(CastInst &CI, if (ConstantUInt *CI = dyn_cast(NumElements)) { ArraySizeScale = CI->getValue(); NumElements = ConstantUInt::get(Type::UIntTy, 1); + } else if (ShiftInst *SI = dyn_cast(NumElements)) { + if (SI->getOpcode() == Instruction::Shl) + if (ConstantUInt *CUI = dyn_cast(SI->getOperand(1))) { + // This is a value scaled by '1 << the shift amt'. + NumElements = SI->getOperand(0); + ArraySizeScale = 1U << CUI->getValue(); + } + } else if (isa(NumElements) && + cast(NumElements)->getOpcode() == Instruction::Mul){ + BinaryOperator *BO = cast(NumElements); + if (ConstantUInt *Scale = cast(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(NumElements)) - Amt = ConstantExpr::getMul(CI, cast(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(NumElements)) + Amt = ConstantExpr::getMul(CI, cast(Amt)); + else if (cast(Amt)->getValue() == 1) { + Instruction *Tmp = BinaryOperator::createMul(Amt, NumElements, "tmp"); + Amt = InsertNewInstBefore(Tmp, AI); + } } } -- 2.34.1