summaryrefslogtreecommitdiff
path: root/src/compiler_llvm/method_compiler.cc
diff options
context:
space:
mode:
author TDYa127 <tdy@google.com> 2012-04-29 01:26:35 -0700
committer Shih-wei Liao <sliao@google.com> 2012-05-03 17:35:23 -0700
commit97339c4d9e528609b4778edec113dac6e1c5d682 (patch)
treed118007707b2ad25478f0df979db3f5d16484b64 /src/compiler_llvm/method_compiler.cc
parent6cdebe30fbfcc015481808b32eb5741ed72fe2f1 (diff)
Reorder stack overflow check.
It seems we can't call function before these alloca instructions. Otherwise, LLVM would not promote these locations to registers. Change-Id: I0b77eb29a01ededcf5f386c904182cae6435cd5a
Diffstat (limited to 'src/compiler_llvm/method_compiler.cc')
-rw-r--r--src/compiler_llvm/method_compiler.cc17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index 3e8a6f801e..90731d686a 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -139,21 +139,18 @@ llvm::FunctionType* MethodCompiler::GetFunctionType(uint32_t method_idx,
void MethodCompiler::EmitPrologue() {
// Create basic blocks for prologue
- basic_block_stack_overflow_ =
- llvm::BasicBlock::Create(*context_, "prologue.stack_overflow_check", func_);
-
basic_block_reg_alloca_ =
llvm::BasicBlock::Create(*context_, "prologue.alloca", func_);
+ basic_block_stack_overflow_ =
+ llvm::BasicBlock::Create(*context_, "prologue.stack_overflow_check", func_);
+
basic_block_shadow_frame_alloca_ =
llvm::BasicBlock::Create(*context_, "prologue.shadowframe", func_);
basic_block_reg_arg_init_ =
llvm::BasicBlock::Create(*context_, "prologue.arginit", func_);
- // Before alloca, check stack overflow.
- EmitStackOverflowCheck();
-
// Create register array
for (uint16_t r = 0; r < code_item_->registers_size_; ++r) {
regs_.push_back(DalvikReg::CreateLocalVarReg(*this, r));
@@ -223,10 +220,12 @@ void MethodCompiler::EmitStackOverflowCheck() {
void MethodCompiler::EmitPrologueLastBranch() {
- irb_.SetInsertPoint(basic_block_stack_overflow_);
- irb_.CreateBr(basic_block_reg_alloca_);
-
irb_.SetInsertPoint(basic_block_reg_alloca_);
+ irb_.CreateBr(basic_block_stack_overflow_);
+
+ EmitStackOverflowCheck();
+
+ irb_.SetInsertPoint(basic_block_stack_overflow_);
irb_.CreateBr(basic_block_shadow_frame_alloca_);
irb_.SetInsertPoint(basic_block_shadow_frame_alloca_);