summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/optimizing/code_generator_arm64.cc48
-rw-r--r--compiler/optimizing/code_generator_arm_vixl.cc52
-rw-r--r--compiler/optimizing/code_generator_vector_arm64_neon.cc10
-rw-r--r--compiler/optimizing/code_generator_vector_arm64_sve.cc10
-rw-r--r--compiler/optimizing/code_generator_vector_arm_vixl.cc4
-rw-r--r--compiler/optimizing/code_generator_vector_x86.cc10
-rw-r--r--compiler/optimizing/code_generator_vector_x86_64.cc10
-rw-r--r--compiler/optimizing/code_generator_x86.cc14
-rw-r--r--compiler/optimizing/code_generator_x86_64.cc12
-rw-r--r--compiler/optimizing/common_arm64.h2
-rw-r--r--compiler/optimizing/intrinsics.cc13
-rw-r--r--compiler/optimizing/intrinsics_arm64.cc2
-rw-r--r--compiler/optimizing/intrinsics_x86.cc2
-rw-r--r--compiler/optimizing/locations.cc13
-rw-r--r--compiler/optimizing/locations.h8
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>;