mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
Don't put non-static allocas in the static alloca map
Allocas marked inalloca are never static, but we were trying to put them into the static alloca map if they were in the entry block. Also add an assertion in x86 fastisel. llvm-svn: 200593
This commit is contained in:
parent
30c78ed783
commit
80a8045bb4
@ -74,7 +74,12 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf) {
|
||||
// them.
|
||||
Function::const_iterator BB = Fn->begin(), EB = Fn->end();
|
||||
for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
|
||||
if (const AllocaInst *AI = dyn_cast<AllocaInst>(I))
|
||||
if (const AllocaInst *AI = dyn_cast<AllocaInst>(I)) {
|
||||
// Don't fold inalloca allocas or other dynamic allocas into the initial
|
||||
// stack frame allocation, even if they are in the entry block.
|
||||
if (!AI->isStaticAlloca())
|
||||
continue;
|
||||
|
||||
if (const ConstantInt *CUI = dyn_cast<ConstantInt>(AI->getArraySize())) {
|
||||
Type *Ty = AI->getAllocatedType();
|
||||
uint64_t TySize = TLI->getDataLayout()->getTypeAllocSize(Ty);
|
||||
@ -88,6 +93,7 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf) {
|
||||
StaticAllocaMap[AI] =
|
||||
MF->getFrameInfo()->CreateStackObject(TySize, Align, false, AI);
|
||||
}
|
||||
}
|
||||
|
||||
for (; BB != EB; ++BB)
|
||||
for (BasicBlock::const_iterator I = BB->begin(), E = BB->end();
|
||||
|
@ -2483,6 +2483,7 @@ unsigned X86FastISel::TargetMaterializeAlloca(const AllocaInst *C) {
|
||||
// X86SelectAddrss, and TargetMaterializeAlloca.
|
||||
if (!FuncInfo.StaticAllocaMap.count(C))
|
||||
return 0;
|
||||
assert(C->isStaticAlloca() && "dynamic alloca in the static alloca map?");
|
||||
|
||||
X86AddressMode AM;
|
||||
if (!X86SelectAddress(C, AM))
|
||||
|
19
test/CodeGen/X86/dynamic-alloca-in-entry.ll
Normal file
19
test/CodeGen/X86/dynamic-alloca-in-entry.ll
Normal file
@ -0,0 +1,19 @@
|
||||
; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck %s
|
||||
|
||||
; Allocas with unknown size in the entry block are dynamic.
|
||||
define void @foo(i32 %n) {
|
||||
%m = alloca i32, i32 %n
|
||||
ret void
|
||||
}
|
||||
; CHECK-LABEL: _foo:
|
||||
; CHECK: calll __chkstk
|
||||
; CHECK: retl
|
||||
|
||||
; Use of inalloca implies that that the alloca is not static.
|
||||
define void @bar() {
|
||||
%m = alloca i32, inalloca
|
||||
ret void
|
||||
}
|
||||
; CHECK-LABEL: _bar:
|
||||
; CHECK: calll __chkstk
|
||||
; CHECK: retl
|
Loading…
x
Reference in New Issue
Block a user