diff options
| author | 2012-04-29 01:31:49 -0700 | |
|---|---|---|
| committer | 2012-05-03 18:28:57 -0700 | |
| commit | 7f5b9be62c034b29f3bb550478da9af28e88f72b (patch) | |
| tree | 123880aa0d911e9bdf635cc87633704b3d4392b0 /src | |
| parent | 5e5a804e7be57876df789c88dc0503879f969f39 (diff) | |
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
Diffstat (limited to 'src')
| -rw-r--r-- | src/compiler_llvm/dalvik_reg.cc | 17 | ||||
| -rw-r--r-- | src/compiler_llvm/dalvik_reg.h | 2 | ||||
| -rw-r--r-- | src/compiler_llvm/method_compiler.cc | 38 | ||||
| -rw-r--r-- | src/compiler_llvm/method_compiler.h | 2 |
4 files changed, 45 insertions, 14 deletions
diff --git a/src/compiler_llvm/dalvik_reg.cc b/src/compiler_llvm/dalvik_reg.cc index 379fcb0b68..492d33bead 100644 --- a/src/compiler_llvm/dalvik_reg.cc +++ b/src/compiler_llvm/dalvik_reg.cc @@ -29,6 +29,8 @@ namespace { public: DalvikLocalVarReg(MethodCompiler& method_compiler, uint32_t reg_idx); + virtual void SetValue(JType jty, JTypeSpace space, llvm::Value* value); + virtual ~DalvikLocalVarReg(); private: @@ -39,6 +41,7 @@ namespace { llvm::Value* reg_32_; llvm::Value* reg_64_; llvm::Value* reg_obj_; + llvm::Value* reg_shadow_frame_; }; class DalvikRetValReg : public DalvikReg { @@ -201,7 +204,7 @@ llvm::Value* DalvikReg::GetAddr(JType jty, JTypeSpace space) { DalvikLocalVarReg::DalvikLocalVarReg(MethodCompiler& method_compiler, uint32_t reg_idx) : DalvikReg(method_compiler), reg_idx_(reg_idx), - reg_32_(NULL), reg_64_(NULL), reg_obj_(NULL) { + reg_32_(NULL), reg_64_(NULL), reg_obj_(NULL), reg_shadow_frame_(NULL) { } @@ -209,6 +212,17 @@ DalvikLocalVarReg::~DalvikLocalVarReg() { } +void DalvikLocalVarReg::SetValue(JType jty, JTypeSpace space, llvm::Value* value) { + DalvikReg::SetValue(jty, space, value); + + if (jty == kObject) { + DCHECK_NE(reg_shadow_frame_, static_cast<llvm::Value*>(NULL)) + << "Didn't allocate shadow frame entry."; + irb_.CreateStore(value, reg_shadow_frame_); + } +} + + llvm::Value* DalvikLocalVarReg::GetRawAddr(JType jty, JTypeSpace space) { switch (GetRegCategoryFromJType(jty)) { case kRegCat1nr: @@ -226,6 +240,7 @@ llvm::Value* DalvikLocalVarReg::GetRawAddr(JType jty, JTypeSpace space) { case kRegObject: if (reg_obj_ == NULL) { reg_obj_ = method_compiler_->AllocDalvikLocalVarReg(kRegObject, reg_idx_); + reg_shadow_frame_ = method_compiler_->AllocShadowFrameEntry(reg_idx_); } return reg_obj_; diff --git a/src/compiler_llvm/dalvik_reg.h b/src/compiler_llvm/dalvik_reg.h index e6e5b05de6..2b17541254 100644 --- a/src/compiler_llvm/dalvik_reg.h +++ b/src/compiler_llvm/dalvik_reg.h @@ -47,7 +47,7 @@ class DalvikReg { return GetValue(GetJTypeFromShorty(shorty), space); } - void SetValue(JType jty, JTypeSpace space, llvm::Value* value); + virtual void SetValue(JType jty, JTypeSpace space, llvm::Value* value); void SetValue(char shorty, JTypeSpace space, llvm::Value* value) { return SetValue(GetJTypeFromShorty(shorty), space, value); 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<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(); diff --git a/src/compiler_llvm/method_compiler.h b/src/compiler_llvm/method_compiler.h index d5a4374ca2..e1465dcce6 100644 --- a/src/compiler_llvm/method_compiler.h +++ b/src/compiler_llvm/method_compiler.h @@ -83,6 +83,8 @@ class MethodCompiler { llvm::Value* AllocDalvikLocalVarReg(RegCategory cat, uint32_t reg_idx); + llvm::Value* AllocShadowFrameEntry(uint32_t reg_idx); + llvm::Value* AllocDalvikRetValReg(RegCategory cat); |