mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-01 02:33:44 +00:00
instcombine: alloca: Limit array size type promotion
Move type promotion of the size of the array allocation to the end of `simplifyAllocaArraySize()`. This avoids promoting the type of the array size if it's a `ConstantInt`, since the next -instcombine iteration will drop it to a scalar allocation anyway. Similarly, this avoids promoting the type if it's an `UndefValue`, in which case the alloca gets RAUW'ed. This is NFC when considered over the lifetime of -instcombine, since it's just reducing the number of iterations needed to reach fixed point. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232201 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
95ff656ae0
commit
5c71858076
@ -169,15 +169,6 @@ static Instruction *simplifyAllocaArraySize(InstCombiner &IC, AllocaInst &AI) {
|
|||||||
if (!AI.isArrayAllocation())
|
if (!AI.isArrayAllocation())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
// Ensure that the alloca array size argument has type intptr_t, so that
|
|
||||||
// any casting is exposed early.
|
|
||||||
Type *IntPtrTy = IC.getDataLayout().getIntPtrType(AI.getType());
|
|
||||||
if (AI.getArraySize()->getType() != IntPtrTy) {
|
|
||||||
Value *V = IC.Builder->CreateIntCast(AI.getArraySize(), IntPtrTy, false);
|
|
||||||
AI.setOperand(0, V);
|
|
||||||
return &AI;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert: alloca Ty, C - where C is a constant != 1 into: alloca [C x Ty], 1
|
// Convert: alloca Ty, C - where C is a constant != 1 into: alloca [C x Ty], 1
|
||||||
if (const ConstantInt *C = dyn_cast<ConstantInt>(AI.getArraySize())) {
|
if (const ConstantInt *C = dyn_cast<ConstantInt>(AI.getArraySize())) {
|
||||||
Type *NewTy = ArrayType::get(AI.getAllocatedType(), C->getZExtValue());
|
Type *NewTy = ArrayType::get(AI.getAllocatedType(), C->getZExtValue());
|
||||||
@ -209,6 +200,15 @@ static Instruction *simplifyAllocaArraySize(InstCombiner &IC, AllocaInst &AI) {
|
|||||||
if (isa<UndefValue>(AI.getArraySize()))
|
if (isa<UndefValue>(AI.getArraySize()))
|
||||||
return IC.ReplaceInstUsesWith(AI, Constant::getNullValue(AI.getType()));
|
return IC.ReplaceInstUsesWith(AI, Constant::getNullValue(AI.getType()));
|
||||||
|
|
||||||
|
// Ensure that the alloca array size argument has type intptr_t, so that
|
||||||
|
// any casting is exposed early.
|
||||||
|
Type *IntPtrTy = IC.getDataLayout().getIntPtrType(AI.getType());
|
||||||
|
if (AI.getArraySize()->getType() != IntPtrTy) {
|
||||||
|
Value *V = IC.Builder->CreateIntCast(AI.getArraySize(), IntPtrTy, false);
|
||||||
|
AI.setOperand(0, V);
|
||||||
|
return &AI;
|
||||||
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user