mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
[NFC] Preparatory work for D77292
This commit is contained in:
parent
b890445131
commit
03a8e72720
@ -1858,10 +1858,6 @@ bool IRTranslator::translateAlloca(const User &U,
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Now we're in the harder dynamic case.
|
// Now we're in the harder dynamic case.
|
||||||
Type *Ty = AI.getAllocatedType();
|
|
||||||
unsigned Align =
|
|
||||||
std::max((unsigned)DL->getPrefTypeAlignment(Ty), AI.getAlignment());
|
|
||||||
|
|
||||||
Register NumElts = getOrCreateVReg(*AI.getArraySize());
|
Register NumElts = getOrCreateVReg(*AI.getArraySize());
|
||||||
|
|
||||||
Type *IntPtrIRTy = DL->getIntPtrType(AI.getType());
|
Type *IntPtrIRTy = DL->getIntPtrType(AI.getType());
|
||||||
@ -1872,19 +1868,18 @@ bool IRTranslator::translateAlloca(const User &U,
|
|||||||
NumElts = ExtElts;
|
NumElts = ExtElts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Type *Ty = AI.getAllocatedType();
|
||||||
|
|
||||||
Register AllocSize = MRI->createGenericVirtualRegister(IntPtrTy);
|
Register AllocSize = MRI->createGenericVirtualRegister(IntPtrTy);
|
||||||
Register TySize =
|
Register TySize =
|
||||||
getOrCreateVReg(*ConstantInt::get(IntPtrIRTy, DL->getTypeAllocSize(Ty)));
|
getOrCreateVReg(*ConstantInt::get(IntPtrIRTy, DL->getTypeAllocSize(Ty)));
|
||||||
MIRBuilder.buildMul(AllocSize, NumElts, TySize);
|
MIRBuilder.buildMul(AllocSize, NumElts, TySize);
|
||||||
|
|
||||||
unsigned StackAlign =
|
|
||||||
MF->getSubtarget().getFrameLowering()->getStackAlignment();
|
|
||||||
if (Align <= StackAlign)
|
|
||||||
Align = 0;
|
|
||||||
|
|
||||||
// Round the size of the allocation up to the stack alignment size
|
// Round the size of the allocation up to the stack alignment size
|
||||||
// by add SA-1 to the size. This doesn't overflow because we're computing
|
// by add SA-1 to the size. This doesn't overflow because we're computing
|
||||||
// an address inside an alloca.
|
// an address inside an alloca.
|
||||||
|
unsigned StackAlign =
|
||||||
|
MF->getSubtarget().getFrameLowering()->getStackAlignment();
|
||||||
auto SAMinusOne = MIRBuilder.buildConstant(IntPtrTy, StackAlign - 1);
|
auto SAMinusOne = MIRBuilder.buildConstant(IntPtrTy, StackAlign - 1);
|
||||||
auto AllocAdd = MIRBuilder.buildAdd(IntPtrTy, AllocSize, SAMinusOne,
|
auto AllocAdd = MIRBuilder.buildAdd(IntPtrTy, AllocSize, SAMinusOne,
|
||||||
MachineInstr::NoUWrap);
|
MachineInstr::NoUWrap);
|
||||||
@ -1892,6 +1887,10 @@ bool IRTranslator::translateAlloca(const User &U,
|
|||||||
MIRBuilder.buildConstant(IntPtrTy, ~(uint64_t)(StackAlign - 1));
|
MIRBuilder.buildConstant(IntPtrTy, ~(uint64_t)(StackAlign - 1));
|
||||||
auto AlignedAlloc = MIRBuilder.buildAnd(IntPtrTy, AllocAdd, AlignCst);
|
auto AlignedAlloc = MIRBuilder.buildAnd(IntPtrTy, AllocAdd, AlignCst);
|
||||||
|
|
||||||
|
unsigned Align =
|
||||||
|
std::max((unsigned)DL->getPrefTypeAlignment(Ty), AI.getAlignment());
|
||||||
|
if (Align <= StackAlign)
|
||||||
|
Align = 0;
|
||||||
MIRBuilder.buildDynStackAlloc(getOrCreateVReg(AI), AlignedAlloc, Align);
|
MIRBuilder.buildDynStackAlloc(getOrCreateVReg(AI), AlignedAlloc, Align);
|
||||||
|
|
||||||
MF->getFrameInfo().CreateVariableSizedObject(Align ? Align : 1, &AI);
|
MF->getFrameInfo().CreateVariableSizedObject(Align ? Align : 1, &AI);
|
||||||
|
Loading…
Reference in New Issue
Block a user