Move all alloca to the first basic block.
Change-Id: I30581c70cb84ffc812f9a834ac1fd25e21bb7008
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index 474b89e..3a02ee9 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -66,7 +66,7 @@
reg_to_shadow_frame_index_(code_item_->registers_size_, -1),
retval_reg_(NULL),
basic_block_stack_overflow_(NULL),
- basic_block_reg_alloca_(NULL), basic_block_shadow_frame_alloca_(NULL),
+ basic_block_alloca_(NULL), basic_block_shadow_frame_(NULL),
basic_block_reg_arg_init_(NULL),
basic_blocks_(code_item_->insns_size_in_code_units_),
basic_block_landing_pads_(code_item_->tries_size_, NULL),
@@ -150,13 +150,13 @@
llvm::BasicBlock* entry =
llvm::BasicBlock::Create(*context_, PrettyMethod(method_idx_, *dex_file_), func_);
#endif
- basic_block_reg_alloca_ =
+ basic_block_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_ =
+ basic_block_shadow_frame_ =
llvm::BasicBlock::Create(*context_, "prologue.shadowframe", func_);
basic_block_reg_arg_init_ =
@@ -164,9 +164,12 @@
#if !defined(NDEBUG)
irb_.SetInsertPoint(entry);
- irb_.CreateBr(basic_block_reg_alloca_);
+ irb_.CreateBr(basic_block_alloca_);
#endif
+ irb_.SetInsertPoint(basic_block_alloca_);
+ jvalue_temp_ = irb_.CreateAlloca(irb_.getJValueTy());
+
// Create register array
for (uint16_t r = 0; r < code_item_->registers_size_; ++r) {
regs_[r] = DalvikReg::CreateLocalVarReg(*this, r);
@@ -239,7 +242,7 @@
void MethodCompiler::EmitPrologueLastBranch() {
- irb_.SetInsertPoint(basic_block_reg_alloca_);
+ irb_.SetInsertPoint(basic_block_alloca_);
irb_.CreateBr(basic_block_stack_overflow_);
// If a method will not call to other method, and the method is small, we can avoid stack overflow
@@ -251,15 +254,15 @@
}
irb_.SetInsertPoint(basic_block_stack_overflow_);
- irb_.CreateBr(basic_block_shadow_frame_alloca_);
+ irb_.CreateBr(basic_block_shadow_frame_);
- irb_.SetInsertPoint(basic_block_shadow_frame_alloca_);
+ irb_.SetInsertPoint(basic_block_shadow_frame_);
irb_.CreateBr(basic_block_reg_arg_init_);
}
void MethodCompiler::EmitPrologueAllocShadowFrame() {
- irb_.SetInsertPoint(basic_block_shadow_frame_alloca_);
+ irb_.SetInsertPoint(basic_block_alloca_);
// Allocate the shadow frame now!
uint32_t sirt_size = 0;
@@ -274,6 +277,8 @@
llvm::StructType* shadow_frame_type = irb_.getShadowFrameTy(sirt_size);
shadow_frame_ = irb_.CreateAlloca(shadow_frame_type);
+ irb_.SetInsertPoint(basic_block_shadow_frame_);
+
// Zero-initialization of the shadow frame
llvm::ConstantAggregateZero* zero_initializer =
llvm::ConstantAggregateZero::get(shadow_frame_type);
@@ -2908,17 +2913,15 @@
irb_.SetInsertPoint(block_proxy_stub);
}
{ // proxy stub
- llvm::Value* temp_space_addr;
if (ret_shorty != 'V') {
- temp_space_addr = irb_.CreateAlloca(irb_.getJValueTy());
- args.push_back(temp_space_addr);
+ args.push_back(jvalue_temp_);
}
// TODO: Remove this after we solve the proxy trampoline calling convention problem.
irb_.CreateCall(irb_.GetRuntime(ProxyInvokeHandler), args);
if (ret_shorty != 'V') {
llvm::Type* accurate_ret_type = irb_.getJType(ret_shorty, kAccurate);
llvm::Value* result_addr =
- irb_.CreateBitCast(temp_space_addr, accurate_ret_type->getPointerTo());
+ irb_.CreateBitCast(jvalue_temp_, accurate_ret_type->getPointerTo());
llvm::Value* retval = irb_.CreateLoad(result_addr, kTBAAStackTemp);
EmitStoreDalvikRetValReg(ret_shorty, kAccurate, retval);
}
@@ -3867,7 +3870,7 @@
// Save current IR builder insert point
llvm::IRBuilderBase::InsertPoint irb_ip_original = irb_.saveIP();
- irb_.SetInsertPoint(basic_block_reg_alloca_);
+ irb_.SetInsertPoint(basic_block_alloca_);
// Alloca
llvm::Value* reg_addr = irb_.CreateAlloca(reg_type, 0, reg_name);
@@ -3899,7 +3902,7 @@
// Save current IR builder insert point
llvm::IRBuilderBase::InsertPoint irb_ip_original = irb_.saveIP();
- irb_.SetInsertPoint(basic_block_shadow_frame_alloca_);
+ irb_.SetInsertPoint(basic_block_shadow_frame_);
llvm::Value* gep_index[] = {
irb_.getInt32(0), // No pointer displacement
@@ -3928,7 +3931,7 @@
// Save current IR builder insert point
llvm::IRBuilderBase::InsertPoint irb_ip_original = irb_.saveIP();
- irb_.SetInsertPoint(basic_block_reg_alloca_);
+ irb_.SetInsertPoint(basic_block_alloca_);
// Alloca
llvm::Value* reg_addr = irb_.CreateAlloca(reg_type, 0, reg_name);