diff options
-rw-r--r-- | compiler/optimizing/code_generator_arm64.cc | 48 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_arm_vixl.cc | 52 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_vector_arm64_neon.cc | 10 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_vector_arm64_sve.cc | 10 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_vector_arm_vixl.cc | 4 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_vector_x86.cc | 10 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_vector_x86_64.cc | 10 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_x86.cc | 14 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_x86_64.cc | 12 | ||||
-rw-r--r-- | compiler/optimizing/common_arm64.h | 2 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics.cc | 13 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_arm64.cc | 2 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_x86.cc | 2 | ||||
-rw-r--r-- | compiler/optimizing/locations.cc | 13 | ||||
-rw-r--r-- | compiler/optimizing/locations.h | 8 |
15 files changed, 116 insertions, 94 deletions
diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index de9ec296f9..41db9a2542 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -2246,9 +2246,10 @@ void LocationsBuilderARM64::HandleFieldSet(HInstruction* instruction) { LocationSummary* locations = new (GetGraph()->GetAllocator()) LocationSummary(instruction, LocationSummary::kNoCall); locations->SetInAt(0, Location::RequiresRegister()); - if (IsZeroBitPattern(instruction->InputAt(1))) { - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); - } else if (DataType::IsFloatingPointType(instruction->InputAt(1)->GetType())) { + HInstruction* value = instruction->InputAt(1); + if (IsZeroBitPattern(value)) { + locations->SetInAt(1, Location::ConstantLocation(value)); + } else if (DataType::IsFloatingPointType(value->GetType())) { locations->SetInAt(1, Location::RequiresFpuRegister()); } else { locations->SetInAt(1, Location::RequiresRegister()); @@ -2479,7 +2480,7 @@ void LocationsBuilderARM64::VisitDataProcWithShifterOp( LocationSummary* locations = new (GetGraph()->GetAllocator()) LocationSummary(instruction, LocationSummary::kNoCall); if (instruction->GetInstrKind() == HInstruction::kNeg) { - locations->SetInAt(0, Location::ConstantLocation(instruction->InputAt(0)->AsConstant())); + locations->SetInAt(0, Location::ConstantLocation(instruction->InputAt(0))); } else { locations->SetInAt(0, Location::RequiresRegister()); } @@ -2572,7 +2573,7 @@ void LocationsBuilderARM64::VisitIntermediateAddressIndex(HIntermediateAddressIn // data offset constant generation out of the loop and reduce the critical path length in the // loop. locations->SetInAt(1, shift->GetValue() == 0 - ? Location::ConstantLocation(instruction->GetOffset()->AsIntConstant()) + ? Location::ConstantLocation(instruction->GetOffset()) : Location::RequiresRegister()); locations->SetInAt(2, Location::ConstantLocation(shift)); locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap); @@ -2847,9 +2848,10 @@ void LocationsBuilderARM64::VisitArraySet(HArraySet* instruction) { instruction, needs_type_check ? LocationSummary::kCallOnSlowPath : LocationSummary::kNoCall); locations->SetInAt(0, Location::RequiresRegister()); - locations->SetInAt(1, Location::RegisterOrConstant(instruction->InputAt(1))); - if (IsZeroBitPattern(instruction->InputAt(2))) { - locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2)->AsConstant())); + locations->SetInAt(1, Location::RegisterOrConstant(instruction->GetIndex())); + HInstruction* value = instruction->GetValue(); + if (IsZeroBitPattern(value)) { + locations->SetInAt(2, Location::ConstantLocation(value)); } else if (DataType::IsFloatingPointType(value_type)) { locations->SetInAt(2, Location::RequiresFpuRegister()); } else { @@ -3030,10 +3032,10 @@ void LocationsBuilderARM64::VisitBoundsCheck(HBoundsCheck* instruction) { HInstruction* length = instruction->InputAt(1); bool both_const = index->IsConstant() && length->IsConstant(); locations->SetInAt(0, both_const - ? Location::ConstantLocation(index->AsConstant()) + ? Location::ConstantLocation(index) : ARM64EncodableConstantOrRegister(index, instruction)); locations->SetInAt(1, both_const - ? Location::ConstantLocation(length->AsConstant()) + ? Location::ConstantLocation(length) : ARM64EncodableConstantOrRegister(length, instruction)); } @@ -3131,6 +3133,7 @@ void LocationsBuilderARM64::VisitCompare(HCompare* compare) { LocationSummary* locations = new (GetGraph()->GetAllocator()) LocationSummary(compare, LocationSummary::kNoCall); DataType::Type in_type = compare->InputAt(0)->GetType(); + HInstruction* rhs = compare->InputAt(1); switch (in_type) { case DataType::Type::kBool: case DataType::Type::kUint8: @@ -3140,7 +3143,7 @@ void LocationsBuilderARM64::VisitCompare(HCompare* compare) { case DataType::Type::kInt32: case DataType::Type::kInt64: { locations->SetInAt(0, Location::RequiresRegister()); - locations->SetInAt(1, ARM64EncodableConstantOrRegister(compare->InputAt(1), compare)); + locations->SetInAt(1, ARM64EncodableConstantOrRegister(rhs, compare)); locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap); break; } @@ -3148,8 +3151,8 @@ void LocationsBuilderARM64::VisitCompare(HCompare* compare) { case DataType::Type::kFloat64: { locations->SetInAt(0, Location::RequiresFpuRegister()); locations->SetInAt(1, - IsFloatingPointZeroConstant(compare->InputAt(1)) - ? Location::ConstantLocation(compare->InputAt(1)->AsConstant()) + IsFloatingPointZeroConstant(rhs) + ? Location::ConstantLocation(rhs) : Location::RequiresFpuRegister()); locations->SetOut(Location::RequiresRegister()); break; @@ -3197,16 +3200,17 @@ void InstructionCodeGeneratorARM64::VisitCompare(HCompare* compare) { void LocationsBuilderARM64::HandleCondition(HCondition* instruction) { LocationSummary* locations = new (GetGraph()->GetAllocator()) LocationSummary(instruction); + HInstruction* rhs = instruction->InputAt(1); if (DataType::IsFloatingPointType(instruction->InputAt(0)->GetType())) { locations->SetInAt(0, Location::RequiresFpuRegister()); locations->SetInAt(1, - IsFloatingPointZeroConstant(instruction->InputAt(1)) - ? Location::ConstantLocation(instruction->InputAt(1)->AsConstant()) + IsFloatingPointZeroConstant(rhs) + ? Location::ConstantLocation(rhs) : Location::RequiresFpuRegister()); } else { // Integer cases. locations->SetInAt(0, Location::RequiresRegister()); - locations->SetInAt(1, ARM64EncodableConstantOrRegister(instruction->InputAt(1), instruction)); + locations->SetInAt(1, ARM64EncodableConstantOrRegister(rhs, instruction)); } if (!instruction->IsEmittedAtUseSite()) { @@ -4052,9 +4056,9 @@ void LocationsBuilderARM64::VisitInstanceOf(HInstanceOf* instruction) { } locations->SetInAt(0, Location::RequiresRegister()); if (type_check_kind == TypeCheckKind::kBitstringCheck) { - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); - locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2)->AsConstant())); - locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); + locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2))); + locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3))); } else { locations->SetInAt(1, Location::RequiresRegister()); } @@ -4298,9 +4302,9 @@ void LocationsBuilderARM64::VisitCheckCast(HCheckCast* instruction) { new (GetGraph()->GetAllocator()) LocationSummary(instruction, call_kind); locations->SetInAt(0, Location::RequiresRegister()); if (type_check_kind == TypeCheckKind::kBitstringCheck) { - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); - locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2)->AsConstant())); - locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); + locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2))); + locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3))); } else { locations->SetInAt(1, Location::RequiresRegister()); } diff --git a/compiler/optimizing/code_generator_arm_vixl.cc b/compiler/optimizing/code_generator_arm_vixl.cc index cc34e76861..d69e77045b 100644 --- a/compiler/optimizing/code_generator_arm_vixl.cc +++ b/compiler/optimizing/code_generator_arm_vixl.cc @@ -1848,7 +1848,7 @@ static Location Arm8BitEncodableConstantOrRegister(HInstruction* constant) { DCHECK(!DataType::IsFloatingPointType(constant->GetType())); if (constant->IsConstant() && CanEncodeConstantAs8BitImmediate(constant->AsConstant())) { - return Location::ConstantLocation(constant->AsConstant()); + return Location::ConstantLocation(constant); } return Location::RequiresRegister(); @@ -4618,10 +4618,11 @@ void LocationsBuilderARMVIXL::VisitDiv(HDiv* div) { switch (div->GetResultType()) { case DataType::Type::kInt32: { - if (div->InputAt(1)->IsConstant()) { + HInstruction* divisor = div->InputAt(1); + if (divisor->IsConstant()) { locations->SetInAt(0, Location::RequiresRegister()); - locations->SetInAt(1, Location::ConstantLocation(div->InputAt(1)->AsConstant())); - int32_t value = Int32ConstantFrom(div->InputAt(1)); + locations->SetInAt(1, Location::ConstantLocation(divisor)); + int32_t value = Int32ConstantFrom(divisor); Location::OutputOverlap out_overlaps = Location::kNoOutputOverlap; if (value == 1 || value == 0 || value == -1) { // No temp register required. @@ -4735,10 +4736,11 @@ void LocationsBuilderARMVIXL::VisitRem(HRem* rem) { switch (type) { case DataType::Type::kInt32: { - if (rem->InputAt(1)->IsConstant()) { + HInstruction* divisor = rem->InputAt(1); + if (divisor->IsConstant()) { locations->SetInAt(0, Location::RequiresRegister()); - locations->SetInAt(1, Location::ConstantLocation(rem->InputAt(1)->AsConstant())); - int32_t value = Int32ConstantFrom(rem->InputAt(1)); + locations->SetInAt(1, Location::ConstantLocation(divisor)); + int32_t value = Int32ConstantFrom(divisor); Location::OutputOverlap out_overlaps = Location::kNoOutputOverlap; if (value == 1 || value == 0 || value == -1) { // No temp register required. @@ -5291,17 +5293,18 @@ void InstructionCodeGeneratorARMVIXL::HandleLongRotate(HRor* ror) { void LocationsBuilderARMVIXL::VisitRor(HRor* ror) { LocationSummary* locations = new (GetGraph()->GetAllocator()) LocationSummary(ror, LocationSummary::kNoCall); + HInstruction* shift = ror->InputAt(1); switch (ror->GetResultType()) { case DataType::Type::kInt32: { locations->SetInAt(0, Location::RequiresRegister()); - locations->SetInAt(1, Location::RegisterOrConstant(ror->InputAt(1))); + locations->SetInAt(1, Location::RegisterOrConstant(shift)); locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap); break; } case DataType::Type::kInt64: { locations->SetInAt(0, Location::RequiresRegister()); - if (ror->InputAt(1)->IsConstant()) { - locations->SetInAt(1, Location::ConstantLocation(ror->InputAt(1)->AsConstant())); + if (shift->IsConstant()) { + locations->SetInAt(1, Location::ConstantLocation(shift)); } else { locations->SetInAt(1, Location::RequiresRegister()); locations->AddTemp(Location::RequiresRegister()); @@ -5338,11 +5341,12 @@ void LocationsBuilderARMVIXL::HandleShift(HBinaryOperation* op) { LocationSummary* locations = new (GetGraph()->GetAllocator()) LocationSummary(op, LocationSummary::kNoCall); + HInstruction* shift = op->InputAt(1); switch (op->GetResultType()) { case DataType::Type::kInt32: { locations->SetInAt(0, Location::RequiresRegister()); - if (op->InputAt(1)->IsConstant()) { - locations->SetInAt(1, Location::ConstantLocation(op->InputAt(1)->AsConstant())); + if (shift->IsConstant()) { + locations->SetInAt(1, Location::ConstantLocation(shift)); locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap); } else { locations->SetInAt(1, Location::RequiresRegister()); @@ -5354,8 +5358,8 @@ void LocationsBuilderARMVIXL::HandleShift(HBinaryOperation* op) { } case DataType::Type::kInt64: { locations->SetInAt(0, Location::RequiresRegister()); - if (op->InputAt(1)->IsConstant()) { - locations->SetInAt(1, Location::ConstantLocation(op->InputAt(1)->AsConstant())); + if (shift->IsConstant()) { + locations->SetInAt(1, Location::ConstantLocation(shift)); // For simplicity, use kOutputOverlap even though we only require that low registers // don't clash with high registers which the register allocator currently guarantees. locations->SetOut(Location::RequiresRegister(), Location::kOutputOverlap); @@ -6091,7 +6095,7 @@ Location LocationsBuilderARMVIXL::ArithmeticZeroOrFpuRegister(HInstruction* inpu DCHECK(DataType::IsFloatingPointType(input->GetType())) << input->GetType(); if ((input->IsFloatConstant() && (input->AsFloatConstant()->IsArithmeticZero())) || (input->IsDoubleConstant() && (input->AsDoubleConstant()->IsArithmeticZero()))) { - return Location::ConstantLocation(input->AsConstant()); + return Location::ConstantLocation(input); } else { return Location::RequiresFpuRegister(); } @@ -6102,7 +6106,7 @@ Location LocationsBuilderARMVIXL::ArmEncodableConstantOrRegister(HInstruction* c DCHECK(!DataType::IsFloatingPointType(constant->GetType())); if (constant->IsConstant() && CanEncodeConstantAsImmediate(constant->AsConstant(), opcode)) { - return Location::ConstantLocation(constant->AsConstant()); + return Location::ConstantLocation(constant); } return Location::RequiresRegister(); } @@ -7153,10 +7157,10 @@ void LocationsBuilderARMVIXL::VisitBoundsCheck(HBoundsCheck* instruction) { // locations. bool both_const = index->IsConstant() && length->IsConstant(); locations->SetInAt(0, both_const - ? Location::ConstantLocation(index->AsConstant()) + ? Location::ConstantLocation(index) : ArmEncodableConstantOrRegister(index, CMP)); locations->SetInAt(1, both_const - ? Location::ConstantLocation(length->AsConstant()) + ? Location::ConstantLocation(length) : ArmEncodableConstantOrRegister(length, CMP)); } @@ -8011,9 +8015,9 @@ void LocationsBuilderARMVIXL::VisitInstanceOf(HInstanceOf* instruction) { } locations->SetInAt(0, Location::RequiresRegister()); if (type_check_kind == TypeCheckKind::kBitstringCheck) { - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); - locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2)->AsConstant())); - locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); + locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2))); + locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3))); } else { locations->SetInAt(1, Location::RequiresRegister()); } @@ -8308,9 +8312,9 @@ void LocationsBuilderARMVIXL::VisitCheckCast(HCheckCast* instruction) { new (GetGraph()->GetAllocator()) LocationSummary(instruction, call_kind); locations->SetInAt(0, Location::RequiresRegister()); if (type_check_kind == TypeCheckKind::kBitstringCheck) { - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); - locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2)->AsConstant())); - locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); + locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2))); + locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3))); } else { locations->SetInAt(1, Location::RequiresRegister()); } diff --git a/compiler/optimizing/code_generator_vector_arm64_neon.cc b/compiler/optimizing/code_generator_vector_arm64_neon.cc index c70c8f522f..6b6e25cf0c 100644 --- a/compiler/optimizing/code_generator_vector_arm64_neon.cc +++ b/compiler/optimizing/code_generator_vector_arm64_neon.cc @@ -65,7 +65,7 @@ inline Location NEONEncodableConstantOrRegister(HInstruction* constant, HInstruction* instr) { if (constant->IsConstant() && NEONCanEncodeConstantAsImmediate(constant->AsConstant(), instr)) { - return Location::ConstantLocation(constant->AsConstant()); + return Location::ConstantLocation(constant); } return Location::RequiresRegister(); @@ -94,7 +94,7 @@ void LocationsBuilderARM64Neon::VisitVecReplicateScalar(HVecReplicateScalar* ins case DataType::Type::kFloat64: if (input->IsConstant() && NEONCanEncodeConstantAsImmediate(input->AsConstant(), instruction)) { - locations->SetInAt(0, Location::ConstantLocation(input->AsConstant())); + locations->SetInAt(0, Location::ConstantLocation(input)); locations->SetOut(Location::RequiresFpuRegister()); } else { locations->SetInAt(0, Location::RequiresFpuRegister()); @@ -881,7 +881,7 @@ static void CreateVecShiftLocations(ArenaAllocator* allocator, HVecBinaryOperati case DataType::Type::kInt32: case DataType::Type::kInt64: locations->SetInAt(0, Location::RequiresFpuRegister()); - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); locations->SetOut(Location::RequiresFpuRegister(), Location::kNoOutputOverlap); break; default: @@ -1008,13 +1008,13 @@ void LocationsBuilderARM64Neon::VisitVecSetScalars(HVecSetScalars* instruction) case DataType::Type::kInt16: case DataType::Type::kInt32: case DataType::Type::kInt64: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresRegister()); locations->SetOut(Location::RequiresFpuRegister()); break; case DataType::Type::kFloat32: case DataType::Type::kFloat64: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresFpuRegister()); locations->SetOut(Location::RequiresFpuRegister()); break; diff --git a/compiler/optimizing/code_generator_vector_arm64_sve.cc b/compiler/optimizing/code_generator_vector_arm64_sve.cc index 87b6d5772b..fe15791d3f 100644 --- a/compiler/optimizing/code_generator_vector_arm64_sve.cc +++ b/compiler/optimizing/code_generator_vector_arm64_sve.cc @@ -64,7 +64,7 @@ static bool SVECanEncodeConstantAsImmediate(HConstant* constant, HInstruction* i inline Location SVEEncodableConstantOrRegister(HInstruction* constant, HInstruction* instr) { if (constant->IsConstant() && SVECanEncodeConstantAsImmediate(constant->AsConstant(), instr)) { - return Location::ConstantLocation(constant->AsConstant()); + return Location::ConstantLocation(constant); } return Location::RequiresRegister(); @@ -93,7 +93,7 @@ void LocationsBuilderARM64Sve::VisitVecReplicateScalar(HVecReplicateScalar* inst case DataType::Type::kFloat64: if (input->IsConstant() && SVECanEncodeConstantAsImmediate(input->AsConstant(), instruction)) { - locations->SetInAt(0, Location::ConstantLocation(input->AsConstant())); + locations->SetInAt(0, Location::ConstantLocation(input)); locations->SetOut(Location::RequiresFpuRegister()); } else { locations->SetInAt(0, Location::RequiresFpuRegister()); @@ -751,7 +751,7 @@ static void CreateVecShiftLocations(ArenaAllocator* allocator, HVecBinaryOperati case DataType::Type::kInt32: case DataType::Type::kInt64: locations->SetInAt(0, Location::RequiresFpuRegister()); - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); locations->SetOut(Location::RequiresFpuRegister(), Location::kNoOutputOverlap); break; default: @@ -875,13 +875,13 @@ void LocationsBuilderARM64Sve::VisitVecSetScalars(HVecSetScalars* instruction) { case DataType::Type::kInt16: case DataType::Type::kInt32: case DataType::Type::kInt64: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresRegister()); locations->SetOut(Location::RequiresFpuRegister()); break; case DataType::Type::kFloat32: case DataType::Type::kFloat64: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresFpuRegister()); locations->SetOut(Location::RequiresFpuRegister()); break; diff --git a/compiler/optimizing/code_generator_vector_arm_vixl.cc b/compiler/optimizing/code_generator_vector_arm_vixl.cc index 1359d89ace..e8ecf28386 100644 --- a/compiler/optimizing/code_generator_vector_arm_vixl.cc +++ b/compiler/optimizing/code_generator_vector_arm_vixl.cc @@ -640,7 +640,7 @@ static void CreateVecShiftLocations(ArenaAllocator* allocator, HVecBinaryOperati case DataType::Type::kInt16: case DataType::Type::kInt32: locations->SetInAt(0, Location::RequiresFpuRegister()); - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); locations->SetOut(Location::RequiresFpuRegister(), Location::kNoOutputOverlap); break; default: @@ -749,7 +749,7 @@ void LocationsBuilderARMVIXL::VisitVecSetScalars(HVecSetScalars* instruction) { switch (instruction->GetPackedType()) { case DataType::Type::kInt32: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresRegister()); locations->SetOut(Location::RequiresFpuRegister()); break; diff --git a/compiler/optimizing/code_generator_vector_x86.cc b/compiler/optimizing/code_generator_vector_x86.cc index 0e576043fd..343a6e1af4 100644 --- a/compiler/optimizing/code_generator_vector_x86.cc +++ b/compiler/optimizing/code_generator_vector_x86.cc @@ -42,13 +42,13 @@ void LocationsBuilderX86::VisitVecReplicateScalar(HVecReplicateScalar* instructi case DataType::Type::kUint16: case DataType::Type::kInt16: case DataType::Type::kInt32: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresRegister()); locations->SetOut(Location::RequiresFpuRegister()); break; case DataType::Type::kFloat32: case DataType::Type::kFloat64: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresFpuRegister()); locations->SetOut(is_zero ? Location::RequiresFpuRegister() : Location::SameAsFirstInput()); @@ -981,7 +981,7 @@ static void CreateVecShiftLocations(ArenaAllocator* allocator, HVecBinaryOperati case DataType::Type::kInt32: case DataType::Type::kInt64: locations->SetInAt(0, Location::RequiresFpuRegister()); - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); locations->SetOut(Location::SameAsFirstInput()); break; default: @@ -1094,13 +1094,13 @@ void LocationsBuilderX86::VisitVecSetScalars(HVecSetScalars* instruction) { case DataType::Type::kUint16: case DataType::Type::kInt16: case DataType::Type::kInt32: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresRegister()); locations->SetOut(Location::RequiresFpuRegister()); break; case DataType::Type::kFloat32: case DataType::Type::kFloat64: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresFpuRegister()); locations->SetOut(Location::RequiresFpuRegister()); break; diff --git a/compiler/optimizing/code_generator_vector_x86_64.cc b/compiler/optimizing/code_generator_vector_x86_64.cc index 10b84d6072..fb6e4e753f 100644 --- a/compiler/optimizing/code_generator_vector_x86_64.cc +++ b/compiler/optimizing/code_generator_vector_x86_64.cc @@ -37,13 +37,13 @@ void LocationsBuilderX86_64::VisitVecReplicateScalar(HVecReplicateScalar* instru case DataType::Type::kInt16: case DataType::Type::kInt32: case DataType::Type::kInt64: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresRegister()); locations->SetOut(Location::RequiresFpuRegister()); break; case DataType::Type::kFloat32: case DataType::Type::kFloat64: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresFpuRegister()); locations->SetOut(is_zero ? Location::RequiresFpuRegister() : Location::SameAsFirstInput()); @@ -964,7 +964,7 @@ static void CreateVecShiftLocations(ArenaAllocator* allocator, HVecBinaryOperati case DataType::Type::kInt32: case DataType::Type::kInt64: locations->SetInAt(0, Location::RequiresFpuRegister()); - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); locations->SetOut(Location::SameAsFirstInput()); break; default: @@ -1072,13 +1072,13 @@ void LocationsBuilderX86_64::VisitVecSetScalars(HVecSetScalars* instruction) { case DataType::Type::kInt16: case DataType::Type::kInt32: case DataType::Type::kInt64: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresRegister()); locations->SetOut(Location::RequiresFpuRegister()); break; case DataType::Type::kFloat32: case DataType::Type::kFloat64: - locations->SetInAt(0, is_zero ? Location::ConstantLocation(input->AsConstant()) + locations->SetInAt(0, is_zero ? Location::ConstantLocation(input) : Location::RequiresFpuRegister()); locations->SetOut(Location::RequiresFpuRegister()); break; diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index 0cbdbe391d..cb1cecc45a 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -2994,7 +2994,7 @@ void LocationsBuilderX86::VisitTypeConversion(HTypeConversion* conversion) { case DataType::Type::kInt64: { HInstruction* input = conversion->InputAt(0); Location input_location = input->IsConstant() - ? Location::ConstantLocation(input->AsConstant()) + ? Location::ConstantLocation(input) : Location::RegisterPairLocation(EAX, EDX); locations->SetInAt(0, input_location); // Make the output overlap to please the register allocator. This greatly simplifies @@ -7566,9 +7566,9 @@ void LocationsBuilderX86::VisitInstanceOf(HInstanceOf* instruction) { } locations->SetInAt(0, Location::RequiresRegister()); if (type_check_kind == TypeCheckKind::kBitstringCheck) { - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); - locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2)->AsConstant())); - locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); + locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2))); + locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3))); } else { locations->SetInAt(1, Location::Any()); } @@ -7834,9 +7834,9 @@ void LocationsBuilderX86::VisitCheckCast(HCheckCast* instruction) { // a memory address. locations->SetInAt(1, Location::RequiresRegister()); } else if (type_check_kind == TypeCheckKind::kBitstringCheck) { - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); - locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2)->AsConstant())); - locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); + locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2))); + locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3))); } else { locations->SetInAt(1, Location::Any()); } diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index 47de888f32..eea6b204fa 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -6828,9 +6828,9 @@ void LocationsBuilderX86_64::VisitInstanceOf(HInstanceOf* instruction) { } locations->SetInAt(0, Location::RequiresRegister()); if (type_check_kind == TypeCheckKind::kBitstringCheck) { - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); - locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2)->AsConstant())); - locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); + locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2))); + locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3))); } else { locations->SetInAt(1, Location::Any()); } @@ -7106,9 +7106,9 @@ void LocationsBuilderX86_64::VisitCheckCast(HCheckCast* instruction) { // a memory address. locations->SetInAt(1, Location::RequiresRegister()); } else if (type_check_kind == TypeCheckKind::kBitstringCheck) { - locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)->AsConstant())); - locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2)->AsConstant())); - locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3)->AsConstant())); + locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1))); + locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2))); + locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3))); } else { locations->SetInAt(1, Location::Any()); } diff --git a/compiler/optimizing/common_arm64.h b/compiler/optimizing/common_arm64.h index 35abb82565..20b0e38af5 100644 --- a/compiler/optimizing/common_arm64.h +++ b/compiler/optimizing/common_arm64.h @@ -315,7 +315,7 @@ inline Location ARM64EncodableConstantOrRegister(HInstruction* constant, HInstruction* instr) { if (constant->IsConstant() && Arm64CanEncodeConstantAsImmediate(constant->AsConstant(), instr)) { - return Location::ConstantLocation(constant->AsConstant()); + return Location::ConstantLocation(constant); } return Location::RequiresRegister(); diff --git a/compiler/optimizing/intrinsics.cc b/compiler/optimizing/intrinsics.cc index aa5e4f3e22..774deec438 100644 --- a/compiler/optimizing/intrinsics.cc +++ b/compiler/optimizing/intrinsics.cc @@ -171,6 +171,7 @@ void IntrinsicVisitor::ComputeIntegerValueOfLocations(HInvoke* invoke, if (!CanReferenceBootImageObjects(invoke, compiler_options)) { return; } + HInstruction* const input = invoke->InputAt(0); if (compiler_options.IsBootImage()) { if (!compiler_options.IsImageClass(kIntegerCacheDescriptor) || !compiler_options.IsImageClass(kIntegerDescriptor)) { @@ -207,8 +208,8 @@ void IntrinsicVisitor::ComputeIntegerValueOfLocations(HInvoke* invoke, CHECK_EQ(value_field->GetInt(current_object), low + i); } } - if (invoke->InputAt(0)->IsIntConstant()) { - int32_t value = invoke->InputAt(0)->AsIntConstant()->GetValue(); + if (input->IsIntConstant()) { + int32_t value = input->AsIntConstant()->GetValue(); if (static_cast<uint32_t>(value) - static_cast<uint32_t>(low) < static_cast<uint32_t>(high - low + 1)) { // No call, we shall use direct pointer to the Integer object. @@ -232,8 +233,8 @@ void IntrinsicVisitor::ComputeIntegerValueOfLocations(HInvoke* invoke, } else { DCHECK(compiler_options.IsAotCompiler()); DCHECK(CheckIntegerCache(self, runtime->GetClassLinker(), boot_image_live_objects, cache)); - if (invoke->InputAt(0)->IsIntConstant()) { - int32_t value = invoke->InputAt(0)->AsIntConstant()->GetValue(); + if (input->IsIntConstant()) { + int32_t value = input->AsIntConstant()->GetValue(); // Retrieve the `value` from the lowest cached Integer. ObjPtr<mirror::Object> low_integer = IntrinsicObjects::GetIntegerValueOfObject(boot_image_live_objects, 0u); @@ -255,11 +256,11 @@ void IntrinsicVisitor::ComputeIntegerValueOfLocations(HInvoke* invoke, ArenaAllocator* allocator = codegen->GetGraph()->GetAllocator(); LocationSummary* locations = new (allocator) LocationSummary(invoke, call_kind, kIntrinsified); if (call_kind == LocationSummary::kCallOnMainOnly) { - locations->SetInAt(0, Location::RegisterOrConstant(invoke->InputAt(0))); + locations->SetInAt(0, Location::RegisterOrConstant(input)); locations->AddTemp(first_argument_location); locations->SetOut(return_location); } else { - locations->SetInAt(0, Location::ConstantLocation(invoke->InputAt(0)->AsConstant())); + locations->SetInAt(0, Location::ConstantLocation(input)); locations->SetOut(Location::RequiresRegister()); } } diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc index a7a69ba3b0..d2dbaa32e3 100644 --- a/compiler/optimizing/intrinsics_arm64.cc +++ b/compiler/optimizing/intrinsics_arm64.cc @@ -4757,7 +4757,7 @@ static LocationSummary* CreateVarHandleCommonLocations(HInvoke* invoke) { for (size_t arg_index = arguments_start; arg_index != number_of_arguments; ++arg_index) { HInstruction* arg = invoke->InputAt(arg_index); if (IsZeroBitPattern(arg)) { - locations->SetInAt(arg_index, Location::ConstantLocation(arg->AsConstant())); + locations->SetInAt(arg_index, Location::ConstantLocation(arg)); } else if (DataType::IsFloatingPointType(arg->GetType())) { locations->SetInAt(arg_index, Location::RequiresFpuRegister()); } else { diff --git a/compiler/optimizing/intrinsics_x86.cc b/compiler/optimizing/intrinsics_x86.cc index 868fd4a120..d2072201f8 100644 --- a/compiler/optimizing/intrinsics_x86.cc +++ b/compiler/optimizing/intrinsics_x86.cc @@ -3963,7 +3963,7 @@ static void CreateVarHandleSetLocations(HInvoke* invoke) { case DataType::Type::kInt64: // We only handle constant non-atomic int64 values. DCHECK(value->IsConstant()); - locations->SetInAt(value_index, Location::ConstantLocation(value->AsConstant())); + locations->SetInAt(value_index, Location::ConstantLocation(value)); break; case DataType::Type::kReference: locations->SetInAt(value_index, Location::RequiresRegister()); diff --git a/compiler/optimizing/locations.cc b/compiler/optimizing/locations.cc index 595064f8e5..f40b7f4f0c 100644 --- a/compiler/optimizing/locations.cc +++ b/compiler/optimizing/locations.cc @@ -57,7 +57,7 @@ LocationSummary::LocationSummary(HInstruction* instruction, Location Location::RegisterOrConstant(HInstruction* instruction) { return instruction->IsConstant() - ? Location::ConstantLocation(instruction->AsConstant()) + ? Location::ConstantLocation(instruction) : Location::RequiresRegister(); } @@ -85,16 +85,23 @@ Location Location::FpuRegisterOrInt32Constant(HInstruction* instruction) { Location Location::ByteRegisterOrConstant(int reg, HInstruction* instruction) { return instruction->IsConstant() - ? Location::ConstantLocation(instruction->AsConstant()) + ? Location::ConstantLocation(instruction) : Location::RegisterLocation(reg); } Location Location::FpuRegisterOrConstant(HInstruction* instruction) { return instruction->IsConstant() - ? Location::ConstantLocation(instruction->AsConstant()) + ? Location::ConstantLocation(instruction) : Location::RequiresFpuRegister(); } +void Location::DCheckInstructionIsConstant(HInstruction* instruction) { + DCHECK(instruction != nullptr); + DCHECK(instruction->IsConstant()); + DCHECK_EQ(reinterpret_cast<uintptr_t>(instruction), + reinterpret_cast<uintptr_t>(instruction->AsConstant())); +} + std::ostream& operator<<(std::ostream& os, const Location& location) { os << location.DebugString(); if (location.IsRegister() || location.IsFpuRegister()) { diff --git a/compiler/optimizing/locations.h b/compiler/optimizing/locations.h index dc87284a7a..7ee076f442 100644 --- a/compiler/optimizing/locations.h +++ b/compiler/optimizing/locations.h @@ -103,8 +103,12 @@ class Location : public ValueObject { return (value_ & kLocationConstantMask) == kConstant; } - static Location ConstantLocation(HConstant* constant) { + static Location ConstantLocation(HInstruction* constant) { DCHECK(constant != nullptr); + if (kIsDebugBuild) { + // Call out-of-line helper to avoid circular dependency with `nodes.h`. + DCheckInstructionIsConstant(constant); + } return Location(kConstant | reinterpret_cast<uintptr_t>(constant)); } @@ -426,6 +430,8 @@ class Location : public ValueObject { return PayloadField::Decode(value_); } + static void DCheckInstructionIsConstant(HInstruction* instruction); + using KindField = BitField<Kind, 0, kBitsForKind>; using PayloadField = BitField<uintptr_t, kBitsForKind, kBitsForPayload>; |