Commit c42bbec9 authored by ivica.bogosavljevic's avatar ivica.bogosavljevic Committed by Commit bot

MIPS: Reland of `Fix bad RegisterConfiguration usage in InstructionSequence unit tests`

Reland 0cf56232

The original patch got reverted because testing RegisterConfiguration was
overwritten by turbofan RegisterConfiguration. This caused some test cases not being
properly tested. The new patch uses correct RegisterConfiguration.

Original commit message:
Test InstructionSequenceTest has been initialized with a testing RegisterConfiguration
instance defined in instruction-sequence-unittest.h, whereas class ExplicitOperand which
is being tested used RegisterConfiguration from instruction.cc. In case these two
instances are different, the tests would fail. The issue is fixed by using the same
instance of RegisterConfiguration both for test code and code under test.

Additionally, the tests in register-allocator-unittest.cc use hardcoded values
for register and begin failing is the hardcoded register is not available for
allocation. Fix by forcing the use of allocatable registers only.

TEST=unittests.MoveOptimizerTest.RemovesRedundantExplicit,unittests.RegisterAllocatorTest.SpillPhi
BUG=

Review-Url: https://codereview.chromium.org/2595293002
Cr-Commit-Position: refs/heads/master@{#41938}
parent b571c6d1
......@@ -12,7 +12,8 @@ namespace v8 {
namespace internal {
namespace compiler {
const auto GetRegConfig = RegisterConfiguration::Turbofan;
const RegisterConfiguration* (*GetRegConfig)() =
RegisterConfiguration::Turbofan;
FlagsCondition CommuteFlagsCondition(FlagsCondition condition) {
switch (condition) {
......@@ -985,6 +986,21 @@ void InstructionSequence::PrintBlock(int block_id) const {
PrintBlock(GetRegConfig(), block_id);
}
const RegisterConfiguration*
InstructionSequence::registerConfigurationForTesting_ = nullptr;
const RegisterConfiguration*
InstructionSequence::RegisterConfigurationForTesting() {
DCHECK(registerConfigurationForTesting_ != nullptr);
return registerConfigurationForTesting_;
}
void InstructionSequence::SetRegisterConfigurationForTesting(
const RegisterConfiguration* regConfig) {
registerConfigurationForTesting_ = regConfig;
GetRegConfig = InstructionSequence::RegisterConfigurationForTesting;
}
FrameStateDescriptor::FrameStateDescriptor(
Zone* zone, FrameStateType type, BailoutId bailout_id,
OutputFrameStateCombine state_combine, size_t parameters_count,
......
......@@ -1570,12 +1570,19 @@ class V8_EXPORT_PRIVATE InstructionSequence final
void ValidateDeferredBlockEntryPaths() const;
void ValidateSSA() const;
static void SetRegisterConfigurationForTesting(
const RegisterConfiguration* regConfig);
static void ClearRegisterConfigurationForTesting();
private:
friend V8_EXPORT_PRIVATE std::ostream& operator<<(
std::ostream& os, const PrintableInstructionSequence& code);
typedef ZoneMap<const Instruction*, SourcePosition> SourcePositionMap;
static const RegisterConfiguration* RegisterConfigurationForTesting();
static const RegisterConfiguration* registerConfigurationForTesting_;
Isolate* isolate_;
Zone* const zone_;
InstructionBlocks* const instruction_blocks_;
......
......@@ -85,7 +85,7 @@ int InstructionSequenceTest::GetAllocatableCode(int index,
}
}
RegisterConfiguration* InstructionSequenceTest::config() {
const RegisterConfiguration* InstructionSequenceTest::config() {
if (!config_) {
config_.reset(new RegisterConfiguration(
num_general_registers_, num_double_registers_, num_general_registers_,
......@@ -105,6 +105,8 @@ InstructionSequence* InstructionSequenceTest::sequence() {
if (sequence_ == nullptr) {
sequence_ = new (zone())
InstructionSequence(isolate(), zone(), &instruction_blocks_);
sequence_->SetRegisterConfigurationForTesting(
InstructionSequenceTest::config());
}
return sequence_;
}
......
......@@ -158,7 +158,7 @@ class InstructionSequenceTest : public TestWithIsolateAndZone {
void SetNumRegs(int num_general_registers, int num_double_registers);
int GetNumRegs(MachineRepresentation rep);
int GetAllocatableCode(int index, MachineRepresentation rep = kNoRep);
RegisterConfiguration* config();
const RegisterConfiguration* config();
InstructionSequence* sequence();
void StartLoop(int loop_blocks);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment