[turbofan] phis cannot take registers as inputs

BUG=
R=bmeurer@chromium.org

Review URL: https://codereview.chromium.org/704153002

Cr-Commit-Position: refs/heads/master@{#25191}
git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@25191 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
dcarney@chromium.org 2014-11-06 12:56:18 +00:00
parent f26d93e6f0
commit a350f0d608
3 changed files with 108 additions and 1 deletions

View File

@ -1525,7 +1525,13 @@ void RegisterAllocator::BuildLiveRanges() {
for (UsePosition* pos = range->first_pos(); pos != NULL;
pos = pos->next_) {
pos->register_beneficial_ = true;
pos->requires_reg_ = true;
// TODO(dcarney): should the else case assert requires_reg_ == false?
// Can't mark phis as needing a register.
if (!code()
->InstructionAt(pos->pos().InstructionIndex())
->IsGapMoves()) {
pos->requires_reg_ = true;
}
}
}
}

View File

@ -0,0 +1,46 @@
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
function Module() {
"use asm";
function f() {
var $0 = 0, $25 = 0, $i$014$i = 0, $sum$013$i = 0, $v_0$01$i = 0, $v_1$02$i = 0, $v_10$011$i = 0, $v_11$012$i = 0, $v_2$03$i = 0, $v_3$04$i = 0, $v_4$05$i = 0, $v_5$06$i = 0, $v_6$07$i = 0, $v_7$08$i = 0, $v_8$09$i = 0, $v_9$010$i = 0;
$i$014$i = 0;
$sum$013$i = 0;
$v_0$01$i = 8;
$v_1$02$i = 9;
$v_10$011$i = 18;
$v_11$012$i = 19;
$v_2$03$i = 10;
$v_3$04$i = 11;
$v_4$05$i = 12;
$v_5$06$i = 13;
$v_6$07$i = 14;
$v_7$08$i = 15;
$v_8$09$i = 16;
$v_9$010$i = 17;
do {
$v_0$01$i = $v_3$04$i + $v_9$010$i + $v_0$01$i | 0;
$v_1$02$i = $v_4$05$i + $v_10$011$i + $v_1$02$i | 0;
$v_2$03$i = $v_5$06$i + $v_11$012$i + $v_2$03$i | 0;
$v_3$04$i = $v_3$04$i + $v_6$07$i + $v_0$01$i | 0;
$v_4$05$i = $v_4$05$i + $v_7$08$i + $v_1$02$i | 0;
$v_5$06$i = $v_5$06$i + $v_8$09$i + $v_2$03$i | 0;
$v_6$07$i = $v_6$07$i + $v_9$010$i + $v_3$04$i | 0;
$v_7$08$i = $v_7$08$i + $v_10$011$i + $v_4$05$i | 0;
$v_8$09$i = $v_8$09$i + $v_11$012$i + $v_5$06$i | 0;
$v_9$010$i = $v_0$01$i + $v_9$010$i + $v_6$07$i | 0;
$v_10$011$i = $v_1$02$i + $v_10$011$i + $v_7$08$i | 0;
$v_11$012$i = $v_2$03$i + $v_11$012$i + $v_8$09$i | 0;
$25 = $v_0$01$i + $v_1$02$i | 0;
$sum$013$i = $v_2$03$i + $sum$013$i + $v_5$06$i + $v_4$05$i + $v_8$09$i + $v_3$04$i + $25 + $v_7$08$i + $v_11$012$i + $v_6$07$i + $v_10$011$i + $v_9$010$i | 0;
$i$014$i = $i$014$i + 1 | 0;
} while (($i$014$i | 0) <= 0);
return $sum$013$i - ($v_5$06$i + $v_2$03$i + $v_4$05$i + $v_8$09$i + $25 + $v_3$04$i + $v_7$08$i + $v_11$012$i + $v_6$07$i + $v_10$011$i + $v_9$010$i);
}
return { f: f };
}
Module().f();

View File

@ -453,6 +453,61 @@ TEST_F(RegisterAllocatorTest, SimpleBranch) {
Allocate();
}
TEST_F(RegisterAllocatorTest, RegressionPhisNeedTooManyRegisters) {
const size_t kNumRegs = 3;
const size_t kParams = kNumRegs + 1;
int parameters[kParams];
// Override number of registers.
SetNumRegs(kNumRegs, kNumRegs);
// Initial block.
StartBlock();
int constant = DefineConstant();
for (size_t i = 0; i < arraysize(parameters); ++i) {
parameters[i] = DefineConstant();
}
EndBlock();
PhiInstruction* phis[kParams];
{
StartLoop(2);
// Loop header.
StartBlock();
for (size_t i = 0; i < arraysize(parameters); ++i) {
phis[i] = Phi(parameters[i]);
}
// Perform some computations.
// something like phi[i] += const
for (size_t i = 0; i < arraysize(parameters); ++i) {
int result = NewReg();
EmitFRU(result, phis[i]->virtual_register(), constant);
phis[i]->operands().push_back(result);
}
EndBlock(Branch(DefineConstant(), 1, 2));
// Jump back to loop header.
StartBlock();
EndBlock(Jump(-1));
EndLoop();
}
// End block.
StartLastBlock();
// Return sum.
Return(DefineConstant());
EndBlock();
Allocate();
}
} // namespace compiler
} // namespace internal
} // namespace v8