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
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index 3e8a6f8..90731d6 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -139,21 +139,18 @@
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::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_);