diff options
| author | 2014-01-31 22:15:53 +0000 | |
|---|---|---|
| committer | 2014-01-31 22:15:53 +0000 | |
| commit | 616ffafa3130d0ef9cdd18c7adbf4e688026a724 (patch) | |
| tree | b6ef3e190072cf7bf680d5263f1d6070167fd42e /compiler/dex/quick/codegen_util.cc | |
| parent | f0c3718cf42e2c45859f136e05bceb224871eae6 (diff) | |
| parent | da7a69b3fa7bb22d087567364b7eb5a75824efd8 (diff) | |
Merge "Enable compiler temporaries"
Diffstat (limited to 'compiler/dex/quick/codegen_util.cc')
| -rw-r--r-- | compiler/dex/quick/codegen_util.cc | 28 | 
1 files changed, 21 insertions, 7 deletions
diff --git a/compiler/dex/quick/codegen_util.cc b/compiler/dex/quick/codegen_util.cc index 2d0fa03dd6..481a70f1da 100644 --- a/compiler/dex/quick/codegen_util.cc +++ b/compiler/dex/quick/codegen_util.cc @@ -252,7 +252,7 @@ void Mir2Lir::DumpLIRInsn(LIR* lir, unsigned char* base_addr) {  }  void Mir2Lir::DumpPromotionMap() { -  int num_regs = cu_->num_dalvik_registers + cu_->num_compiler_temps + 1; +  int num_regs = cu_->num_dalvik_registers + mir_graph_->GetNumUsedCompilerTemps();    for (int i = 0; i < num_regs; i++) {      PromotionMap v_reg_map = promotion_map_[i];      std::string buf; @@ -289,7 +289,7 @@ void Mir2Lir::CodegenDump() {    LOG(INFO) << "Outs         : " << cu_->num_outs;    LOG(INFO) << "CoreSpills       : " << num_core_spills_;    LOG(INFO) << "FPSpills       : " << num_fp_spills_; -  LOG(INFO) << "CompilerTemps    : " << cu_->num_compiler_temps; +  LOG(INFO) << "CompilerTemps    : " << mir_graph_->GetNumUsedCompilerTemps();    LOG(INFO) << "Frame size       : " << frame_size_;    LOG(INFO) << "code size is " << total_size_ <<      " bytes, Dalvik size is " << insns_size * 2; @@ -1004,7 +1004,7 @@ Mir2Lir::Mir2Lir(CompilationUnit* cu, MIRGraph* mir_graph, ArenaAllocator* arena        first_lir_insn_(NULL),        last_lir_insn_(NULL) {    promotion_map_ = static_cast<PromotionMap*> -      (arena_->Alloc((cu_->num_dalvik_registers  + cu_->num_compiler_temps + 1) * +      (arena_->Alloc((cu_->num_dalvik_registers  + mir_graph_->GetNumUsedCompilerTemps()) *                        sizeof(promotion_map_[0]), ArenaAllocator::kAllocRegAlloc));    // Reserve pointer id 0 for NULL.    size_t null_idx = WrapPointer(NULL); @@ -1081,13 +1081,27 @@ CompiledMethod* Mir2Lir::GetCompiledMethod() {    return result;  } +size_t Mir2Lir::GetMaxPossibleCompilerTemps() const { +  // Chose a reasonably small value in order to contain stack growth. +  // Backends that are smarter about spill region can return larger values. +  const size_t max_compiler_temps = 10; +  return max_compiler_temps; +} + +size_t Mir2Lir::GetNumBytesForCompilerTempSpillRegion() { +  // By default assume that the Mir2Lir will need one slot for each temporary. +  // If the backend can better determine temps that have non-overlapping ranges and +  // temps that do not need spilled, it can actually provide a small region. +  return (mir_graph_->GetNumUsedCompilerTemps() * sizeof(uint32_t)); +} +  int Mir2Lir::ComputeFrameSize() {    /* Figure out the frame size */    static const uint32_t kAlignMask = kStackAlignment - 1; -  uint32_t size = (num_core_spills_ + num_fp_spills_ + -                   1 /* filler word */ + cu_->num_regs + cu_->num_outs + -                   cu_->num_compiler_temps + 1 /* cur_method* */) -                   * sizeof(uint32_t); +  uint32_t size = ((num_core_spills_ + num_fp_spills_ + +                   1 /* filler word */ + cu_->num_regs + cu_->num_outs) +                   * sizeof(uint32_t)) + +                   GetNumBytesForCompilerTempSpillRegion();    /* Align and set */    return (size + kAlignMask) & ~(kAlignMask);  }  |