diff options
Diffstat (limited to 'compiler/optimizing/builder.cc')
| -rw-r--r-- | compiler/optimizing/builder.cc | 16 | 
1 files changed, 16 insertions, 0 deletions
| diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index 8a64d81485..818d671b5b 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -520,8 +520,24 @@ void HGraphBuilder::Binop_22b(const Instruction& instruction, bool reverse) {    UpdateLocal(instruction.VRegA(), current_block_->GetLastInstruction());  } +static bool RequiresConstructorBarrier(const DexCompilationUnit* cu, const CompilerDriver& driver) { +  // dex compilation unit is null only when unit testing. +  if (cu == nullptr) { +    return false; +  } + +  Thread* self = Thread::Current(); +  return cu->IsConstructor() +      && driver.RequiresConstructorBarrier(self, cu->GetDexFile(), cu->GetClassDefIndex()); +} +  void HGraphBuilder::BuildReturn(const Instruction& instruction, Primitive::Type type) {    if (type == Primitive::kPrimVoid) { +    // Note that we might insert redundant barriers when inlining `super` calls. +    // TODO: add a data flow analysis to get rid of duplicate barriers. +    if (RequiresConstructorBarrier(dex_compilation_unit_, *compiler_driver_)) { +      current_block_->AddInstruction(new (arena_) HMemoryBarrier(kStoreStore)); +    }      current_block_->AddInstruction(new (arena_) HReturnVoid());    } else {      HInstruction* value = LoadLocal(instruction.VRegA(), type); |