From 7f5b9be62c034b29f3bb550478da9af28e88f72b Mon Sep 17 00:00:00 2001 From: TDYa127 Date: Sun, 29 Apr 2012 01:31:49 -0700 Subject: Separate object register and shadow frame entry. The shadow frame already escaped. LLVM can't do optimization for the shadow frame entry. Change-Id: I3a6e4a3066ebcc9a6530e3313061af3a7d18c456 --- src/compiler_llvm/method_compiler.cc | 38 ++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) (limited to 'src/compiler_llvm/method_compiler.cc') diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc index a326b135b8..c8976cdeb8 100644 --- a/src/compiler_llvm/method_compiler.cc +++ b/src/compiler_llvm/method_compiler.cc @@ -3841,18 +3841,9 @@ llvm::Value* MethodCompiler::AllocDalvikLocalVarReg(RegCategory cat, break; case kRegObject: - { - irb_.SetInsertPoint(basic_block_shadow_frame_alloca_); - - llvm::Value* gep_index[] = { - irb_.getInt32(0), // No pointer displacement - irb_.getInt32(1), // SIRT - irb_.getInt32(reg_idx) // Pointer field - }; - - reg_addr = irb_.CreateGEP(shadow_frame_, gep_index, - StringPrintf("p%u", reg_idx)); - } + irb_.SetInsertPoint(basic_block_reg_alloca_); + reg_addr = irb_.CreateAlloca(irb_.getJObjectTy(), 0, + StringPrintf("o%u", reg_idx)); break; default: @@ -3867,6 +3858,29 @@ llvm::Value* MethodCompiler::AllocDalvikLocalVarReg(RegCategory cat, } +llvm::Value* MethodCompiler::AllocShadowFrameEntry(uint32_t reg_idx) { + // Save current IR builder insert point + llvm::IRBuilderBase::InsertPoint irb_ip_original = irb_.saveIP(); + + irb_.SetInsertPoint(basic_block_shadow_frame_alloca_); + + llvm::Value* gep_index[] = { + irb_.getInt32(0), // No pointer displacement + irb_.getInt32(1), // SIRT + irb_.getInt32(reg_idx) // Pointer field + }; + + llvm::Value* reg_addr = + irb_.CreateGEP(shadow_frame_, gep_index, StringPrintf("p%u", reg_idx)); + + // Restore IRBuilder insert point + irb_.restoreIP(irb_ip_original); + + DCHECK_NE(reg_addr, static_cast(NULL)); + return reg_addr; +} + + llvm::Value* MethodCompiler::AllocDalvikRetValReg(RegCategory cat) { // Save current IR builder insert point llvm::IRBuilderBase::InsertPoint irb_ip_original = irb_.saveIP(); -- cgit v1.2.3-59-g8ed1b