Revision: 25191
Author: [email protected]
Date: Thu Nov 6 12:56:18 2014 UTC
Log: [turbofan] phis cannot take registers as inputs
BUG=
[email protected]
Review URL: https://codereview.chromium.org/704153002
https://code.google.com/p/v8/source/detail?r=25191
Added:
/branches/bleeding_edge/test/mjsunit/compiler/regress-register-allocator3.js
Modified:
/branches/bleeding_edge/src/compiler/register-allocator.cc
/branches/bleeding_edge/test/unittests/compiler/register-allocator-unittest.cc
=======================================
--- /dev/null
+++
/branches/bleeding_edge/test/mjsunit/compiler/regress-register-allocator3.js
Thu Nov 6 12:56:18 2014 UTC
@@ -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();
=======================================
--- /branches/bleeding_edge/src/compiler/register-allocator.cc Wed Nov 5
12:46:43 2014 UTC
+++ /branches/bleeding_edge/src/compiler/register-allocator.cc Thu Nov 6
12:56:18 2014 UTC
@@ -1525,7 +1525,13 @@
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;
+ }
}
}
}
=======================================
---
/branches/bleeding_edge/test/unittests/compiler/register-allocator-unittest.cc
Thu Nov 6 08:28:15 2014 UTC
+++
/branches/bleeding_edge/test/unittests/compiler/register-allocator-unittest.cc
Thu Nov 6 12:56:18 2014 UTC
@@ -452,6 +452,61 @@
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
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.