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
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index a326b13..c8976cd 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -3841,18 +3841,9 @@
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::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<llvm::Value*>(NULL));
+ return reg_addr;
+}
+
+
llvm::Value* MethodCompiler::AllocDalvikRetValReg(RegCategory cat) {
// Save current IR builder insert point
llvm::IRBuilderBase::InsertPoint irb_ip_original = irb_.saveIP();