From 6e332529c33be4d7dae5dad3609a839f4c0d3bfc Mon Sep 17 00:00:00 2001 From: David Brazdil Date: Tue, 2 Feb 2016 16:15:27 +0000 Subject: [PATCH] ART: Remove HTemporary Change-Id: I21b984224370a9ce7a4a13a9652503cfb03c5f03 --- compiler/optimizing/builder.cc | 60 ------------------ compiler/optimizing/code_generator.cc | 13 ---- compiler/optimizing/code_generator.h | 2 - compiler/optimizing/code_generator_arm.cc | 92 --------------------------- compiler/optimizing/code_generator_arm.h | 1 - compiler/optimizing/code_generator_arm64.cc | 56 ----------------- compiler/optimizing/code_generator_arm64.h | 2 - compiler/optimizing/code_generator_mips.cc | 48 -------------- compiler/optimizing/code_generator_mips.h | 1 - compiler/optimizing/code_generator_mips64.cc | 67 -------------------- compiler/optimizing/code_generator_mips64.h | 2 - compiler/optimizing/code_generator_x86.cc | 93 ---------------------------- compiler/optimizing/code_generator_x86.h | 1 - compiler/optimizing/code_generator_x86_64.cc | 84 ------------------------- compiler/optimizing/code_generator_x86_64.h | 1 - compiler/optimizing/codegen_test.cc | 6 +- compiler/optimizing/nodes.h | 28 --------- compiler/optimizing/ssa_builder.cc | 5 -- compiler/optimizing/ssa_builder.h | 1 - 19 files changed, 3 insertions(+), 560 deletions(-) diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index 8d77daf18..a1d62760a 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -37,41 +37,6 @@ namespace art { -/** - * Helper class to add HTemporary instructions. This class is used when - * converting a DEX instruction to multiple HInstruction, and where those - * instructions do not die at the following instruction, but instead spans - * multiple instructions. - */ -class Temporaries : public ValueObject { - public: - explicit Temporaries(HGraph* graph) : graph_(graph), index_(0) {} - - void Add(HInstruction* instruction) { - HInstruction* temp = new (graph_->GetArena()) HTemporary(index_, instruction->GetDexPc()); - instruction->GetBlock()->AddInstruction(temp); - - DCHECK(temp->GetPrevious() == instruction); - - size_t offset; - if (instruction->GetType() == Primitive::kPrimLong - || instruction->GetType() == Primitive::kPrimDouble) { - offset = 2; - } else { - offset = 1; - } - index_ += offset; - - graph_->UpdateTemporariesVRegSlots(index_); - } - - private: - HGraph* const graph_; - - // Current index in the temporary stack, updated by `Add`. - size_t index_; -}; - void HGraphBuilder::InitializeLocals(uint16_t count) { graph_->SetNumberOfVRegs(count); locals_.resize(count); @@ -1166,12 +1131,10 @@ bool HGraphBuilder::HandleInvoke(HInvoke* invoke, size_t start_index = 0; size_t argument_index = 0; if (invoke->GetOriginalInvokeType() != InvokeType::kStatic) { // Instance call. - Temporaries temps(graph_); HInstruction* arg = LoadLocal( is_range ? register_index : args[0], Primitive::kPrimNot, invoke->GetDexPc()); HNullCheck* null_check = new (arena_) HNullCheck(arg, invoke->GetDexPc()); current_block_->AddInstruction(null_check); - temps.Add(null_check); invoke->SetArgumentAt(0, null_check); start_index = 1; argument_index = 1; @@ -1269,9 +1232,6 @@ bool HGraphBuilder::BuildInstanceFieldAccess(const Instruction& instruction, ? GetFieldAccessType(*dex_file_, field_index) : resolved_field->GetTypeAsPrimitiveType(); if (is_put) { - Temporaries temps(graph_); - // We need one temporary for the null check. - temps.Add(null_check); HInstruction* value = LoadLocal(source_or_dest_reg, field_type, dex_pc); HInstruction* field_set = nullptr; if (resolved_field == nullptr) { @@ -1456,8 +1416,6 @@ bool HGraphBuilder::BuildStaticFieldAccess(const Instruction& instruction, uint16_t class_def_index = klass->GetDexClassDefIndex(); if (is_put) { // We need to keep the class alive before loading the value. - Temporaries temps(graph_); - temps.Add(cls); HInstruction* value = LoadLocal(source_or_dest_reg, field_type, dex_pc); DCHECK_EQ(value->GetType(), field_type); current_block_->AddInstruction(new (arena_) HStaticFieldSet(cls, @@ -1510,9 +1468,7 @@ void HGraphBuilder::BuildCheckedDivRem(uint16_t out_vreg, || (type == Primitive::kPrimInt && second->AsIntConstant()->GetValue() == 0) || (type == Primitive::kPrimLong && second->AsLongConstant()->GetValue() == 0)) { second = new (arena_) HDivZeroCheck(second, dex_pc); - Temporaries temps(graph_); current_block_->AddInstruction(second); - temps.Add(current_block_->GetLastInstruction()); } if (isDiv) { @@ -1531,21 +1487,15 @@ void HGraphBuilder::BuildArrayAccess(const Instruction& instruction, uint8_t array_reg = instruction.VRegB_23x(); uint8_t index_reg = instruction.VRegC_23x(); - // We need one temporary for the null check, one for the index, and one for the length. - Temporaries temps(graph_); - HInstruction* object = LoadLocal(array_reg, Primitive::kPrimNot, dex_pc); object = new (arena_) HNullCheck(object, dex_pc); current_block_->AddInstruction(object); - temps.Add(object); HInstruction* length = new (arena_) HArrayLength(object, dex_pc); current_block_->AddInstruction(length); - temps.Add(length); HInstruction* index = LoadLocal(index_reg, Primitive::kPrimInt, dex_pc); index = new (arena_) HBoundsCheck(index, length, dex_pc); current_block_->AddInstruction(index); - temps.Add(index); if (is_put) { HInstruction* value = LoadLocal(source_or_dest_reg, anticipated_type, dex_pc); // TODO: Insert a type check node if the type is Object. @@ -1586,8 +1536,6 @@ void HGraphBuilder::BuildFilledNewArray(uint32_t dex_pc, bool is_reference_array = (primitive == 'L') || (primitive == '['); Primitive::Type type = is_reference_array ? Primitive::kPrimNot : Primitive::kPrimInt; - Temporaries temps(graph_); - temps.Add(object); for (size_t i = 0; i < number_of_vreg_arguments; ++i) { HInstruction* value = LoadLocal(is_range ? register_index + i : args[i], type, dex_pc); HInstruction* index = graph_->GetIntConstant(i, dex_pc); @@ -1612,11 +1560,9 @@ void HGraphBuilder::BuildFillArrayData(HInstruction* object, } void HGraphBuilder::BuildFillArrayData(const Instruction& instruction, uint32_t dex_pc) { - Temporaries temps(graph_); HInstruction* array = LoadLocal(instruction.VRegA_31t(), Primitive::kPrimNot, dex_pc); HNullCheck* null_check = new (arena_) HNullCheck(array, dex_pc); current_block_->AddInstruction(null_check); - temps.Add(null_check); HInstruction* length = new (arena_) HArrayLength(null_check, dex_pc); current_block_->AddInstruction(length); @@ -1733,10 +1679,6 @@ void HGraphBuilder::BuildTypeCheck(const Instruction& instruction, compiler_driver_->CanAssumeTypeIsPresentInDexCache(dex_file, type_index)); current_block_->AddInstruction(cls); - // The class needs a temporary before being used by the type check. - Temporaries temps(graph_); - temps.Add(cls); - TypeCheckKind check_kind = ComputeTypeCheckKind(resolved_class); if (instruction.Opcode() == Instruction::INSTANCE_OF) { current_block_->AddInstruction(new (arena_) HInstanceOf(object, cls, check_kind, dex_pc)); @@ -2815,8 +2757,6 @@ bool HGraphBuilder::AnalyzeDexInstruction(const Instruction& instruction, uint32 case Instruction::ARRAY_LENGTH: { HInstruction* object = LoadLocal(instruction.VRegB_12x(), Primitive::kPrimNot, dex_pc); - // No need for a temporary for the null check, it is the only input of the following - // instruction. object = new (arena_) HNullCheck(object, dex_pc); current_block_->AddInstruction(object); current_block_->AddInstruction(new (arena_) HArrayLength(object, dex_pc)); diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc index e1b83f05d..c2c8ccfc5 100644 --- a/compiler/optimizing/code_generator.cc +++ b/compiler/optimizing/code_generator.cc @@ -287,19 +287,6 @@ void CodeGenerator::InitializeCodeGeneration(size_t number_of_spill_slots, } } -Location CodeGenerator::GetTemporaryLocation(HTemporary* temp) const { - uint16_t number_of_locals = GetGraph()->GetNumberOfLocalVRegs(); - // The type of the previous instruction tells us if we need a single or double stack slot. - Primitive::Type type = temp->GetType(); - int32_t temp_size = (type == Primitive::kPrimLong) || (type == Primitive::kPrimDouble) ? 2 : 1; - // Use the temporary region (right below the dex registers). - int32_t slot = GetFrameSize() - FrameEntrySpillSize() - - kVRegSize // filler - - (number_of_locals * kVRegSize) - - ((temp_size + temp->GetIndex()) * kVRegSize); - return temp_size == 2 ? Location::DoubleStackSlot(slot) : Location::StackSlot(slot); -} - int32_t CodeGenerator::GetStackSlot(HLocal* local) const { uint16_t reg_number = local->GetRegNumber(); uint16_t number_of_locals = GetGraph()->GetNumberOfLocalVRegs(); diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h index 0a688cf64..49c193e7b 100644 --- a/compiler/optimizing/code_generator.h +++ b/compiler/optimizing/code_generator.h @@ -187,7 +187,6 @@ class CodeGenerator { virtual void GenerateFrameEntry() = 0; virtual void GenerateFrameExit() = 0; virtual void Bind(HBasicBlock* block) = 0; - virtual void Move(HInstruction* instruction, Location location, HInstruction* move_for) = 0; virtual void MoveConstant(Location destination, int32_t value) = 0; virtual void MoveLocation(Location dst, Location src, Primitive::Type dst_type) = 0; virtual void AddLocationAsTemp(Location location, LocationSummary* locations) = 0; @@ -203,7 +202,6 @@ class CodeGenerator { size_t number_of_out_slots, const ArenaVector& block_order); int32_t GetStackSlot(HLocal* local) const; - Location GetTemporaryLocation(HTemporary* temp) const; uint32_t GetFrameSize() const { return frame_size_; } void SetFrameSize(uint32_t size) { frame_size_ = size; } diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index e43493280..005b6c189 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -1195,90 +1195,6 @@ void CodeGeneratorARM::Move64(Location destination, Location source) { } } -void CodeGeneratorARM::Move(HInstruction* instruction, Location location, HInstruction* move_for) { - LocationSummary* locations = instruction->GetLocations(); - if (instruction->IsCurrentMethod()) { - Move32(location, Location::StackSlot(kCurrentMethodStackOffset)); - } else if (locations != nullptr && locations->Out().Equals(location)) { - return; - } else if (locations != nullptr && locations->Out().IsConstant()) { - HConstant* const_to_move = locations->Out().GetConstant(); - if (const_to_move->IsIntConstant() || const_to_move->IsNullConstant()) { - int32_t value = GetInt32ValueOf(const_to_move); - if (location.IsRegister()) { - __ LoadImmediate(location.AsRegister(), value); - } else { - DCHECK(location.IsStackSlot()); - __ LoadImmediate(IP, value); - __ StoreToOffset(kStoreWord, IP, SP, location.GetStackIndex()); - } - } else { - DCHECK(const_to_move->IsLongConstant()) << const_to_move->DebugName(); - int64_t value = const_to_move->AsLongConstant()->GetValue(); - if (location.IsRegisterPair()) { - __ LoadImmediate(location.AsRegisterPairLow(), Low32Bits(value)); - __ LoadImmediate(location.AsRegisterPairHigh(), High32Bits(value)); - } else { - DCHECK(location.IsDoubleStackSlot()); - __ LoadImmediate(IP, Low32Bits(value)); - __ StoreToOffset(kStoreWord, IP, SP, location.GetStackIndex()); - __ LoadImmediate(IP, High32Bits(value)); - __ StoreToOffset(kStoreWord, IP, SP, location.GetHighStackIndex(kArmWordSize)); - } - } - } else if (instruction->IsLoadLocal()) { - uint32_t stack_slot = GetStackSlot(instruction->AsLoadLocal()->GetLocal()); - switch (instruction->GetType()) { - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - case Primitive::kPrimInt: - case Primitive::kPrimNot: - case Primitive::kPrimFloat: - Move32(location, Location::StackSlot(stack_slot)); - break; - - case Primitive::kPrimLong: - case Primitive::kPrimDouble: - Move64(location, Location::DoubleStackSlot(stack_slot)); - break; - - default: - LOG(FATAL) << "Unexpected type " << instruction->GetType(); - } - } else if (instruction->IsTemporary()) { - Location temp_location = GetTemporaryLocation(instruction->AsTemporary()); - if (temp_location.IsStackSlot()) { - Move32(location, temp_location); - } else { - DCHECK(temp_location.IsDoubleStackSlot()); - Move64(location, temp_location); - } - } else { - DCHECK((instruction->GetNext() == move_for) || instruction->GetNext()->IsTemporary()); - switch (instruction->GetType()) { - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - case Primitive::kPrimNot: - case Primitive::kPrimInt: - case Primitive::kPrimFloat: - Move32(location, locations->Out()); - break; - - case Primitive::kPrimLong: - case Primitive::kPrimDouble: - Move64(location, locations->Out()); - break; - - default: - LOG(FATAL) << "Unexpected type " << instruction->GetType(); - } - } -} - void CodeGeneratorARM::MoveConstant(Location location, int32_t value) { DCHECK(location.IsRegister()); __ LoadImmediate(location.AsRegister(), value); @@ -4933,14 +4849,6 @@ void CodeGeneratorARM::MarkGCCard(Register temp, } } -void LocationsBuilderARM::VisitTemporary(HTemporary* temp) { - temp->SetLocations(nullptr); -} - -void InstructionCodeGeneratorARM::VisitTemporary(HTemporary* temp ATTRIBUTE_UNUSED) { - // Nothing to do, this is driven by the code generator. -} - void LocationsBuilderARM::VisitParallelMove(HParallelMove* instruction ATTRIBUTE_UNUSED) { LOG(FATAL) << "Unreachable"; } diff --git a/compiler/optimizing/code_generator_arm.h b/compiler/optimizing/code_generator_arm.h index 558c9cf0e..cfd7a3bc1 100644 --- a/compiler/optimizing/code_generator_arm.h +++ b/compiler/optimizing/code_generator_arm.h @@ -307,7 +307,6 @@ class CodeGeneratorARM : public CodeGenerator { void GenerateFrameEntry() OVERRIDE; void GenerateFrameExit() OVERRIDE; void Bind(HBasicBlock* block) OVERRIDE; - void Move(HInstruction* instruction, Location location, HInstruction* move_for) OVERRIDE; void MoveConstant(Location destination, int32_t value) OVERRIDE; void MoveLocation(Location dst, Location src, Primitive::Type dst_type) OVERRIDE; void AddLocationAsTemp(Location location, LocationSummary* locations) OVERRIDE; diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index cfdf6b18c..de23fe8ee 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -1066,54 +1066,6 @@ void CodeGeneratorARM64::Bind(HBasicBlock* block) { __ Bind(GetLabelOf(block)); } -void CodeGeneratorARM64::Move(HInstruction* instruction, - Location location, - HInstruction* move_for) { - LocationSummary* locations = instruction->GetLocations(); - Primitive::Type type = instruction->GetType(); - DCHECK_NE(type, Primitive::kPrimVoid); - - if (instruction->IsCurrentMethod()) { - MoveLocation(location, - Location::DoubleStackSlot(kCurrentMethodStackOffset), - Primitive::kPrimVoid); - } else if (locations != nullptr && locations->Out().Equals(location)) { - return; - } else if (instruction->IsIntConstant() - || instruction->IsLongConstant() - || instruction->IsNullConstant()) { - int64_t value = GetInt64ValueOf(instruction->AsConstant()); - if (location.IsRegister()) { - Register dst = RegisterFrom(location, type); - DCHECK(((instruction->IsIntConstant() || instruction->IsNullConstant()) && dst.Is32Bits()) || - (instruction->IsLongConstant() && dst.Is64Bits())); - __ Mov(dst, value); - } else { - DCHECK(location.IsStackSlot() || location.IsDoubleStackSlot()); - UseScratchRegisterScope temps(GetVIXLAssembler()); - Register temp = (instruction->IsIntConstant() || instruction->IsNullConstant()) - ? temps.AcquireW() - : temps.AcquireX(); - __ Mov(temp, value); - __ Str(temp, StackOperandFrom(location)); - } - } else if (instruction->IsTemporary()) { - Location temp_location = GetTemporaryLocation(instruction->AsTemporary()); - MoveLocation(location, temp_location, type); - } else if (instruction->IsLoadLocal()) { - uint32_t stack_slot = GetStackSlot(instruction->AsLoadLocal()->GetLocal()); - if (Primitive::Is64BitType(type)) { - MoveLocation(location, Location::DoubleStackSlot(stack_slot), type); - } else { - MoveLocation(location, Location::StackSlot(stack_slot), type); - } - - } else { - DCHECK((instruction->GetNext() == move_for) || instruction->GetNext()->IsTemporary()); - MoveLocation(location, locations->Out(), type); - } -} - void CodeGeneratorARM64::MoveConstant(Location location, int32_t value) { DCHECK(location.IsRegister()); __ Mov(RegisterFrom(location, Primitive::kPrimInt), value); @@ -4445,14 +4397,6 @@ void InstructionCodeGeneratorARM64::VisitSuspendCheck(HSuspendCheck* instruction GenerateSuspendCheck(instruction, nullptr); } -void LocationsBuilderARM64::VisitTemporary(HTemporary* temp) { - temp->SetLocations(nullptr); -} - -void InstructionCodeGeneratorARM64::VisitTemporary(HTemporary* temp ATTRIBUTE_UNUSED) { - // Nothing to do, this is driven by the code generator. -} - void LocationsBuilderARM64::VisitThrow(HThrow* instruction) { LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kCall); diff --git a/compiler/optimizing/code_generator_arm64.h b/compiler/optimizing/code_generator_arm64.h index a9d1bbde9..360488eb4 100644 --- a/compiler/optimizing/code_generator_arm64.h +++ b/compiler/optimizing/code_generator_arm64.h @@ -350,8 +350,6 @@ class CodeGeneratorARM64 : public CodeGenerator { return CommonGetLabelOf(block_labels_, block); } - void Move(HInstruction* instruction, Location location, HInstruction* move_for) OVERRIDE; - size_t GetWordSize() const OVERRIDE { return kArm64WordSize; } diff --git a/compiler/optimizing/code_generator_mips.cc b/compiler/optimizing/code_generator_mips.cc index e9c0b6ae7..3eda8639c 100644 --- a/compiler/optimizing/code_generator_mips.cc +++ b/compiler/optimizing/code_generator_mips.cc @@ -976,46 +976,6 @@ void CodeGeneratorMIPS::MoveConstant(Location destination, int32_t value) { __ LoadConst32(dst, value); } -void CodeGeneratorMIPS::Move(HInstruction* instruction, - Location location, - HInstruction* move_for) { - LocationSummary* locations = instruction->GetLocations(); - Primitive::Type type = instruction->GetType(); - DCHECK_NE(type, Primitive::kPrimVoid); - - if (instruction->IsCurrentMethod()) { - Move32(location, Location::StackSlot(kCurrentMethodStackOffset)); - } else if (locations != nullptr && locations->Out().Equals(location)) { - return; - } else if (instruction->IsIntConstant() - || instruction->IsLongConstant() - || instruction->IsNullConstant()) { - MoveConstant(location, instruction->AsConstant()); - } else if (instruction->IsTemporary()) { - Location temp_location = GetTemporaryLocation(instruction->AsTemporary()); - if (temp_location.IsStackSlot()) { - Move32(location, temp_location); - } else { - DCHECK(temp_location.IsDoubleStackSlot()); - Move64(location, temp_location); - } - } else if (instruction->IsLoadLocal()) { - uint32_t stack_slot = GetStackSlot(instruction->AsLoadLocal()->GetLocal()); - if (Primitive::Is64BitType(type)) { - Move64(location, Location::DoubleStackSlot(stack_slot)); - } else { - Move32(location, Location::StackSlot(stack_slot)); - } - } else { - DCHECK((instruction->GetNext() == move_for) || instruction->GetNext()->IsTemporary()); - if (Primitive::Is64BitType(type)) { - Move64(location, locations->Out()); - } else { - Move32(location, locations->Out()); - } - } -} - void CodeGeneratorMIPS::AddLocationAsTemp(Location location, LocationSummary* locations) { if (location.IsRegister()) { locations->AddTemp(location); @@ -4795,14 +4755,6 @@ void InstructionCodeGeneratorMIPS::VisitSuspendCheck(HSuspendCheck* instruction) GenerateSuspendCheck(instruction, nullptr); } -void LocationsBuilderMIPS::VisitTemporary(HTemporary* temp) { - temp->SetLocations(nullptr); -} - -void InstructionCodeGeneratorMIPS::VisitTemporary(HTemporary* temp ATTRIBUTE_UNUSED) { - // Nothing to do, this is driven by the code generator. -} - void LocationsBuilderMIPS::VisitThrow(HThrow* instruction) { LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kCall); diff --git a/compiler/optimizing/code_generator_mips.h b/compiler/optimizing/code_generator_mips.h index 2cde0ed90..12964b0b6 100644 --- a/compiler/optimizing/code_generator_mips.h +++ b/compiler/optimizing/code_generator_mips.h @@ -268,7 +268,6 @@ class CodeGeneratorMIPS : public CodeGenerator { void Bind(HBasicBlock* block) OVERRIDE; - void Move(HInstruction* instruction, Location location, HInstruction* move_for) OVERRIDE; void Move32(Location destination, Location source); void Move64(Location destination, Location source); void MoveConstant(Location location, HConstant* c); diff --git a/compiler/optimizing/code_generator_mips64.cc b/compiler/optimizing/code_generator_mips64.cc index da98a89f6..71d65e84a 100644 --- a/compiler/optimizing/code_generator_mips64.cc +++ b/compiler/optimizing/code_generator_mips64.cc @@ -869,65 +869,6 @@ void CodeGeneratorMIPS64::SwapLocations(Location loc1, Location loc2, Primitive: } } -void CodeGeneratorMIPS64::Move(HInstruction* instruction, - Location location, - HInstruction* move_for) { - LocationSummary* locations = instruction->GetLocations(); - Primitive::Type type = instruction->GetType(); - DCHECK_NE(type, Primitive::kPrimVoid); - - if (instruction->IsCurrentMethod()) { - MoveLocation(location, Location::DoubleStackSlot(kCurrentMethodStackOffset), type); - } else if (locations != nullptr && locations->Out().Equals(location)) { - return; - } else if (instruction->IsIntConstant() - || instruction->IsLongConstant() - || instruction->IsNullConstant()) { - if (location.IsRegister()) { - // Move to GPR from constant - GpuRegister dst = location.AsRegister(); - if (instruction->IsNullConstant() || instruction->IsIntConstant()) { - __ LoadConst32(dst, GetInt32ValueOf(instruction->AsConstant())); - } else { - __ LoadConst64(dst, instruction->AsLongConstant()->GetValue()); - } - } else { - DCHECK(location.IsStackSlot() || location.IsDoubleStackSlot()); - // Move to stack from constant - GpuRegister gpr = ZERO; - if (location.IsStackSlot()) { - int32_t value = GetInt32ValueOf(instruction->AsConstant()); - if (value != 0) { - gpr = TMP; - __ LoadConst32(gpr, value); - } - __ StoreToOffset(kStoreWord, gpr, SP, location.GetStackIndex()); - } else { - DCHECK(location.IsDoubleStackSlot()); - int64_t value = instruction->AsLongConstant()->GetValue(); - if (value != 0) { - gpr = TMP; - __ LoadConst64(gpr, value); - } - __ StoreToOffset(kStoreDoubleword, gpr, SP, location.GetStackIndex()); - } - } - } else if (instruction->IsTemporary()) { - Location temp_location = GetTemporaryLocation(instruction->AsTemporary()); - MoveLocation(location, temp_location, type); - } else if (instruction->IsLoadLocal()) { - uint32_t stack_slot = GetStackSlot(instruction->AsLoadLocal()->GetLocal()); - if (Primitive::Is64BitType(type)) { - MoveLocation(location, Location::DoubleStackSlot(stack_slot), type); - } else { - MoveLocation(location, Location::StackSlot(stack_slot), type); - } - } else { - DCHECK((instruction->GetNext() == move_for) || instruction->GetNext()->IsTemporary()); - MoveLocation(location, locations->Out(), type); - } -} - void CodeGeneratorMIPS64::MoveConstant(Location location, int32_t value) { DCHECK(location.IsRegister()); __ LoadConst32(location.AsRegister(), value); @@ -3946,14 +3887,6 @@ void InstructionCodeGeneratorMIPS64::VisitSuspendCheck(HSuspendCheck* instructio GenerateSuspendCheck(instruction, nullptr); } -void LocationsBuilderMIPS64::VisitTemporary(HTemporary* temp) { - temp->SetLocations(nullptr); -} - -void InstructionCodeGeneratorMIPS64::VisitTemporary(HTemporary* temp ATTRIBUTE_UNUSED) { - // Nothing to do, this is driven by the code generator. -} - void LocationsBuilderMIPS64::VisitThrow(HThrow* instruction) { LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kCall); diff --git a/compiler/optimizing/code_generator_mips64.h b/compiler/optimizing/code_generator_mips64.h index c836f837d..116125379 100644 --- a/compiler/optimizing/code_generator_mips64.h +++ b/compiler/optimizing/code_generator_mips64.h @@ -268,8 +268,6 @@ class CodeGeneratorMIPS64 : public CodeGenerator { void Bind(HBasicBlock* block) OVERRIDE; - void Move(HInstruction* instruction, Location location, HInstruction* move_for) OVERRIDE; - size_t GetWordSize() const OVERRIDE { return kMips64DoublewordSize; } size_t GetFloatingPointSpillSlotSize() const OVERRIDE { return kMips64DoublewordSize; } diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index de6201010..371369033 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -1127,91 +1127,6 @@ void CodeGeneratorX86::Move64(Location destination, Location source) { } } -void CodeGeneratorX86::Move(HInstruction* instruction, Location location, HInstruction* move_for) { - LocationSummary* locations = instruction->GetLocations(); - if (instruction->IsCurrentMethod()) { - Move32(location, Location::StackSlot(kCurrentMethodStackOffset)); - } else if (locations != nullptr && locations->Out().Equals(location)) { - return; - } else if (locations != nullptr && locations->Out().IsConstant()) { - HConstant* const_to_move = locations->Out().GetConstant(); - if (const_to_move->IsIntConstant() || const_to_move->IsNullConstant()) { - Immediate imm(GetInt32ValueOf(const_to_move)); - if (location.IsRegister()) { - __ movl(location.AsRegister(), imm); - } else if (location.IsStackSlot()) { - __ movl(Address(ESP, location.GetStackIndex()), imm); - } else { - DCHECK(location.IsConstant()); - DCHECK_EQ(location.GetConstant(), const_to_move); - } - } else if (const_to_move->IsLongConstant()) { - int64_t value = const_to_move->AsLongConstant()->GetValue(); - if (location.IsRegisterPair()) { - __ movl(location.AsRegisterPairLow(), Immediate(Low32Bits(value))); - __ movl(location.AsRegisterPairHigh(), Immediate(High32Bits(value))); - } else if (location.IsDoubleStackSlot()) { - __ movl(Address(ESP, location.GetStackIndex()), Immediate(Low32Bits(value))); - __ movl(Address(ESP, location.GetHighStackIndex(kX86WordSize)), - Immediate(High32Bits(value))); - } else { - DCHECK(location.IsConstant()); - DCHECK_EQ(location.GetConstant(), instruction); - } - } - } else if (instruction->IsTemporary()) { - Location temp_location = GetTemporaryLocation(instruction->AsTemporary()); - if (temp_location.IsStackSlot()) { - Move32(location, temp_location); - } else { - DCHECK(temp_location.IsDoubleStackSlot()); - Move64(location, temp_location); - } - } else if (instruction->IsLoadLocal()) { - int slot = GetStackSlot(instruction->AsLoadLocal()->GetLocal()); - switch (instruction->GetType()) { - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - case Primitive::kPrimInt: - case Primitive::kPrimNot: - case Primitive::kPrimFloat: - Move32(location, Location::StackSlot(slot)); - break; - - case Primitive::kPrimLong: - case Primitive::kPrimDouble: - Move64(location, Location::DoubleStackSlot(slot)); - break; - - default: - LOG(FATAL) << "Unimplemented local type " << instruction->GetType(); - } - } else { - DCHECK((instruction->GetNext() == move_for) || instruction->GetNext()->IsTemporary()); - switch (instruction->GetType()) { - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - case Primitive::kPrimInt: - case Primitive::kPrimNot: - case Primitive::kPrimFloat: - Move32(location, locations->Out()); - break; - - case Primitive::kPrimLong: - case Primitive::kPrimDouble: - Move64(location, locations->Out()); - break; - - default: - LOG(FATAL) << "Unexpected type " << instruction->GetType(); - } - } -} - void CodeGeneratorX86::MoveConstant(Location location, int32_t value) { DCHECK(location.IsRegister()); __ movl(location.AsRegister(), Immediate(value)); @@ -5513,14 +5428,6 @@ void InstructionCodeGeneratorX86::VisitBoundsCheck(HBoundsCheck* instruction) { } } -void LocationsBuilderX86::VisitTemporary(HTemporary* temp) { - temp->SetLocations(nullptr); -} - -void InstructionCodeGeneratorX86::VisitTemporary(HTemporary* temp ATTRIBUTE_UNUSED) { - // Nothing to do, this is driven by the code generator. -} - void LocationsBuilderX86::VisitParallelMove(HParallelMove* instruction ATTRIBUTE_UNUSED) { LOG(FATAL) << "Unreachable"; } diff --git a/compiler/optimizing/code_generator_x86.h b/compiler/optimizing/code_generator_x86.h index 45e8ffa84..2fb6d60ad 100644 --- a/compiler/optimizing/code_generator_x86.h +++ b/compiler/optimizing/code_generator_x86.h @@ -317,7 +317,6 @@ class CodeGeneratorX86 : public CodeGenerator { void GenerateFrameEntry() OVERRIDE; void GenerateFrameExit() OVERRIDE; void Bind(HBasicBlock* block) OVERRIDE; - void Move(HInstruction* instruction, Location location, HInstruction* move_for) OVERRIDE; void MoveConstant(Location destination, int32_t value) OVERRIDE; void MoveLocation(Location dst, Location src, Primitive::Type dst_type) OVERRIDE; void AddLocationAsTemp(Location location, LocationSummary* locations) OVERRIDE; diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index 4f0f5f0ff..35603aa03 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -1206,82 +1206,6 @@ void CodeGeneratorX86_64::Move(Location destination, Location source) { } } -void CodeGeneratorX86_64::Move(HInstruction* instruction, - Location location, - HInstruction* move_for) { - LocationSummary* locations = instruction->GetLocations(); - if (instruction->IsCurrentMethod()) { - Move(location, Location::DoubleStackSlot(kCurrentMethodStackOffset)); - } else if (locations != nullptr && locations->Out().Equals(location)) { - return; - } else if (locations != nullptr && locations->Out().IsConstant()) { - HConstant* const_to_move = locations->Out().GetConstant(); - if (const_to_move->IsIntConstant() || const_to_move->IsNullConstant()) { - Immediate imm(GetInt32ValueOf(const_to_move)); - if (location.IsRegister()) { - __ movl(location.AsRegister(), imm); - } else if (location.IsStackSlot()) { - __ movl(Address(CpuRegister(RSP), location.GetStackIndex()), imm); - } else { - DCHECK(location.IsConstant()); - DCHECK_EQ(location.GetConstant(), const_to_move); - } - } else if (const_to_move->IsLongConstant()) { - int64_t value = const_to_move->AsLongConstant()->GetValue(); - if (location.IsRegister()) { - Load64BitValue(location.AsRegister(), value); - } else if (location.IsDoubleStackSlot()) { - Store64BitValueToStack(location, value); - } else { - DCHECK(location.IsConstant()); - DCHECK_EQ(location.GetConstant(), const_to_move); - } - } - } else if (instruction->IsLoadLocal()) { - switch (instruction->GetType()) { - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - case Primitive::kPrimInt: - case Primitive::kPrimNot: - case Primitive::kPrimFloat: - Move(location, Location::StackSlot(GetStackSlot(instruction->AsLoadLocal()->GetLocal()))); - break; - - case Primitive::kPrimLong: - case Primitive::kPrimDouble: - Move(location, - Location::DoubleStackSlot(GetStackSlot(instruction->AsLoadLocal()->GetLocal()))); - break; - - default: - LOG(FATAL) << "Unexpected local type " << instruction->GetType(); - } - } else if (instruction->IsTemporary()) { - Location temp_location = GetTemporaryLocation(instruction->AsTemporary()); - Move(location, temp_location); - } else { - DCHECK((instruction->GetNext() == move_for) || instruction->GetNext()->IsTemporary()); - switch (instruction->GetType()) { - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - case Primitive::kPrimInt: - case Primitive::kPrimNot: - case Primitive::kPrimLong: - case Primitive::kPrimFloat: - case Primitive::kPrimDouble: - Move(location, locations->Out()); - break; - - default: - LOG(FATAL) << "Unexpected type " << instruction->GetType(); - } - } -} - void CodeGeneratorX86_64::MoveConstant(Location location, int32_t value) { DCHECK(location.IsRegister()); Load64BitValue(location.AsRegister(), static_cast(value)); @@ -5142,14 +5066,6 @@ void CodeGeneratorX86_64::MarkGCCard(CpuRegister temp, } } -void LocationsBuilderX86_64::VisitTemporary(HTemporary* temp) { - temp->SetLocations(nullptr); -} - -void InstructionCodeGeneratorX86_64::VisitTemporary(HTemporary* temp ATTRIBUTE_UNUSED) { - // Nothing to do, this is driven by the code generator. -} - void LocationsBuilderX86_64::VisitParallelMove(HParallelMove* instruction ATTRIBUTE_UNUSED) { LOG(FATAL) << "Unimplemented"; } diff --git a/compiler/optimizing/code_generator_x86_64.h b/compiler/optimizing/code_generator_x86_64.h index 72dddfddf..97f6f8423 100644 --- a/compiler/optimizing/code_generator_x86_64.h +++ b/compiler/optimizing/code_generator_x86_64.h @@ -299,7 +299,6 @@ class CodeGeneratorX86_64 : public CodeGenerator { void GenerateFrameEntry() OVERRIDE; void GenerateFrameExit() OVERRIDE; void Bind(HBasicBlock* block) OVERRIDE; - void Move(HInstruction* instruction, Location location, HInstruction* move_for) OVERRIDE; void MoveConstant(Location destination, int32_t value) OVERRIDE; void MoveLocation(Location dst, Location src, Primitive::Type dst_type) OVERRIDE; void AddLocationAsTemp(Location location, LocationSummary* locations) OVERRIDE; diff --git a/compiler/optimizing/codegen_test.cc b/compiler/optimizing/codegen_test.cc index 322a577bb..4f37c37e3 100644 --- a/compiler/optimizing/codegen_test.cc +++ b/compiler/optimizing/codegen_test.cc @@ -777,9 +777,9 @@ TEST_F(CodegenTest, MaterializedCondition2) { HIntConstant* cst_rhs = graph->GetIntConstant(rhs[i]); HLessThan cmp_lt(cst_lhs, cst_rhs); if_block->AddInstruction(&cmp_lt); - // We insert a temporary to separate the HIf from the HLessThan and force - // the materialization of the condition. - HTemporary force_materialization(0); + // We insert a dummy instruction to separate the HIf from the HLessThan + // and force the materialization of the condition. + HMemoryBarrier force_materialization(MemBarrierKind::kAnyAny, 0); if_block->AddInstruction(&force_materialization); HIf if_lt(&cmp_lt); if_block->AddInstruction(&if_lt); diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index 7f463a36e..2697af33e 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -1235,7 +1235,6 @@ class HLoopInformationOutwardIterator : public ValueObject { M(StoreLocal, Instruction) \ M(Sub, BinaryOperation) \ M(SuspendCheck, Instruction) \ - M(Temporary, Instruction) \ M(Throw, Instruction) \ M(TryBoundary, Instruction) \ M(TypeConversion, Instruction) \ @@ -4941,33 +4940,6 @@ class HBoundsCheck : public HExpression<2> { DISALLOW_COPY_AND_ASSIGN(HBoundsCheck); }; -/** - * Some DEX instructions are folded into multiple HInstructions that need - * to stay live until the last HInstruction. This class - * is used as a marker for the baseline compiler to ensure its preceding - * HInstruction stays live. `index` represents the stack location index of the - * instruction (the actual offset is computed as index * vreg_size). - */ -class HTemporary : public HTemplateInstruction<0> { - public: - explicit HTemporary(size_t index, uint32_t dex_pc = kNoDexPc) - : HTemplateInstruction(SideEffects::None(), dex_pc), index_(index) {} - - size_t GetIndex() const { return index_; } - - Primitive::Type GetType() const OVERRIDE { - // The previous instruction is the one that will be stored in the temporary location. - DCHECK(GetPrevious() != nullptr); - return GetPrevious()->GetType(); - } - - DECLARE_INSTRUCTION(Temporary); - - private: - const size_t index_; - DISALLOW_COPY_AND_ASSIGN(HTemporary); -}; - class HSuspendCheck : public HTemplateInstruction<0> { public: explicit HSuspendCheck(uint32_t dex_pc) diff --git a/compiler/optimizing/ssa_builder.cc b/compiler/optimizing/ssa_builder.cc index 165d09d1a..cd529716e 100644 --- a/compiler/optimizing/ssa_builder.cc +++ b/compiler/optimizing/ssa_builder.cc @@ -899,11 +899,6 @@ void SsaBuilder::VisitInstruction(HInstruction* instruction) { } } -void SsaBuilder::VisitTemporary(HTemporary* temp) { - // Temporaries are only used by the baseline register allocator. - temp->GetBlock()->RemoveInstruction(temp); -} - void SsaBuilder::VisitArrayGet(HArrayGet* aget) { Primitive::Type type = aget->GetType(); DCHECK(!Primitive::IsFloatingPointType(type)); diff --git a/compiler/optimizing/ssa_builder.h b/compiler/optimizing/ssa_builder.h index ccef8ea38..4cba41f38 100644 --- a/compiler/optimizing/ssa_builder.h +++ b/compiler/optimizing/ssa_builder.h @@ -75,7 +75,6 @@ class SsaBuilder : public HGraphVisitor { void VisitLoadLocal(HLoadLocal* load) OVERRIDE; void VisitStoreLocal(HStoreLocal* store) OVERRIDE; void VisitInstruction(HInstruction* instruction) OVERRIDE; - void VisitTemporary(HTemporary* instruction) OVERRIDE; void VisitArrayGet(HArrayGet* aget) OVERRIDE; void VisitArraySet(HArraySet* aset) OVERRIDE; void VisitInvokeStaticOrDirect(HInvokeStaticOrDirect* invoke) OVERRIDE; -- 2.11.0