From f10743d765c456db7c9cd2a9fe4c528d75bb5b8f Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Fri, 31 Jan 2014 23:45:12 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200593 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../SelectionDAG/FunctionLoweringInfo.cpp | 8 +++++++- lib/Target/X86/X86FastISel.cpp | 1 + test/CodeGen/X86/dynamic-alloca-in-entry.ll | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/X86/dynamic-alloca-in-entry.ll diff --git a/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp b/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp index 82e97f40fc0..d842fabae25 100644 --- a/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp +++ b/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp @@ -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(I)) + if (const AllocaInst *AI = dyn_cast(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(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(); diff --git a/lib/Target/X86/X86FastISel.cpp b/lib/Target/X86/X86FastISel.cpp index d653c871b29..be6f13899c1 100644 --- a/lib/Target/X86/X86FastISel.cpp +++ b/lib/Target/X86/X86FastISel.cpp @@ -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)) diff --git a/test/CodeGen/X86/dynamic-alloca-in-entry.ll b/test/CodeGen/X86/dynamic-alloca-in-entry.ll new file mode 100644 index 00000000000..2ac89baaf9f --- /dev/null +++ b/test/CodeGen/X86/dynamic-alloca-in-entry.ll @@ -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