From 3cd4fc8bbb40a57d2ffde85f543c124f53237c1d Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Thu, 14 May 2015 15:15:42 +0100 Subject: Eliminate redundant constructor barriers when inlining. Bug: 20410297 Change-Id: I2097743d00eb795d050d390b1918e38c7f41d506 --- compiler/optimizing/builder.cc | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'compiler/optimizing/builder.cc') diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index a5c6f23343..c4eaabf899 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -539,11 +539,6 @@ void HGraphBuilder::Binop_22b(const Instruction& instruction, bool reverse) { } 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()); @@ -551,9 +546,12 @@ static bool RequiresConstructorBarrier(const DexCompilationUnit* cu, const Compi 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_)) { + if (graph_->ShouldGenerateConstructorBarrier()) { + // The compilation unit is null during testing. + if (dex_compilation_unit_ != nullptr) { + DCHECK(RequiresConstructorBarrier(dex_compilation_unit_, *compiler_driver_)) + << "Inconsistent use of ShouldGenerateConstructorBarrier. Should not generate a barrier."; + } current_block_->AddInstruction(new (arena_) HMemoryBarrier(kStoreStore)); } current_block_->AddInstruction(new (arena_) HReturnVoid()); -- cgit v1.2.3-59-g8ed1b