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

Reland 0cf5623220

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}
This commit is contained in:
ivica.bogosavljevic 2016-12-23 02:51:08 -08:00 committed by Commit bot
parent b571c6d1ce
commit c42bbec953
4 changed files with 28 additions and 3 deletions

View File

@ -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,

View File

@ -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_;

View File

@ -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_;
}

View File

@ -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);