OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/compiler/access-builder.h" | 7 #include "src/compiler/access-builder.h" |
8 #include "src/compiler/common-operator.h" | 8 #include "src/compiler/common-operator.h" |
9 #include "src/compiler/graph.h" | 9 #include "src/compiler/graph.h" |
10 #include "src/compiler/graph-visualizer.h" | 10 #include "src/compiler/graph-visualizer.h" |
11 #include "src/compiler/js-graph.h" | 11 #include "src/compiler/js-graph.h" |
12 #include "src/compiler/js-operator.h" | 12 #include "src/compiler/js-operator.h" |
13 #include "src/compiler/loop-analysis.h" | 13 #include "src/compiler/loop-analysis.h" |
14 #include "src/compiler/node.h" | 14 #include "src/compiler/node.h" |
15 #include "src/compiler/opcodes.h" | 15 #include "src/compiler/opcodes.h" |
16 #include "src/compiler/operator.h" | 16 #include "src/compiler/operator.h" |
17 #include "src/compiler/schedule.h" | 17 #include "src/compiler/schedule.h" |
18 #include "src/compiler/scheduler.h" | 18 #include "src/compiler/scheduler.h" |
19 #include "src/compiler/simplified-operator.h" | 19 #include "src/compiler/simplified-operator.h" |
20 #include "src/compiler/verifier.h" | 20 #include "src/compiler/verifier.h" |
21 #include "test/cctest/cctest.h" | 21 #include "test/cctest/cctest.h" |
22 | 22 |
23 using namespace v8::internal; | 23 using namespace v8::internal; |
24 using namespace v8::internal::compiler; | 24 using namespace v8::internal::compiler; |
25 | 25 |
26 static Operator kIntAdd(IrOpcode::kInt32Add, Operator::kPure, "Int32Add", 2, 0, | 26 static Operator kIntAdd(IrOpcode::kInt32Add, Operator::kPure, "Int32Add", 2, 0, |
27 0, 1, 0, 0); | 27 0, 1, 0, 0); |
28 static Operator kIntLt(IrOpcode::kInt32LessThan, Operator::kPure, | 28 static Operator kIntLt(IrOpcode::kInt32LessThan, Operator::kPure, |
29 "Int32LessThan", 2, 0, 0, 1, 0, 0); | 29 "Int32LessThan", 2, 0, 0, 1, 0, 0); |
30 static Operator kStore(IrOpcode::kStore, Operator::kNoProperties, "Store", 0, 2, | 30 static Operator kStore(IrOpcode::kStore, Operator::kNoProperties, "Store", 1, 1, |
31 1, 0, 1, 0); | 31 1, 0, 1, 0); |
32 | 32 |
33 static const int kNumLeafs = 4; | 33 static const int kNumLeafs = 4; |
34 | 34 |
35 // A helper for all tests dealing with LoopFinder. | 35 // A helper for all tests dealing with LoopFinder. |
36 class LoopFinderTester : HandleAndZoneScope { | 36 class LoopFinderTester : HandleAndZoneScope { |
37 public: | 37 public: |
38 LoopFinderTester() | 38 LoopFinderTester() |
39 : isolate(main_isolate()), | 39 : isolate(main_isolate()), |
40 common(main_zone()), | 40 common(main_zone()), |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 }; | 227 }; |
228 | 228 |
229 | 229 |
230 struct StoreLoop { | 230 struct StoreLoop { |
231 Node* base; | 231 Node* base; |
232 Node* val; | 232 Node* val; |
233 Node* phi; | 233 Node* phi; |
234 Node* store; | 234 Node* store; |
235 | 235 |
236 explicit StoreLoop(While& w) | 236 explicit StoreLoop(While& w) |
237 : base(w.t.jsgraph.Int32Constant(12)), | 237 : base(w.t.graph.start()), val(w.t.jsgraph.Int32Constant(13)) { |
238 val(w.t.jsgraph.Int32Constant(13)) { | |
239 Build(w); | 238 Build(w); |
240 } | 239 } |
241 | 240 |
242 StoreLoop(While& w, Node* b, Node* v) : base(b), val(v) { Build(w); } | 241 StoreLoop(While& w, Node* b, Node* v) : base(b), val(v) { Build(w); } |
243 | 242 |
244 void Build(While& w) { | 243 void Build(While& w) { |
245 phi = w.t.graph.NewNode(w.t.op(2, true), base, base, w.loop); | 244 phi = w.t.graph.NewNode(w.t.op(2, true), base, base, w.loop); |
246 store = w.t.graph.NewNode(&kStore, phi, val, w.loop); | 245 store = w.t.graph.NewNode(&kStore, val, phi, w.loop); |
247 phi->ReplaceInput(1, store); | 246 phi->ReplaceInput(1, store); |
248 } | 247 } |
249 }; | 248 }; |
250 | 249 |
251 | 250 |
252 TEST(LaLoop1) { | 251 TEST(LaLoop1) { |
253 // One loop. | 252 // One loop. |
254 LoopFinderTester t; | 253 LoopFinderTester t; |
255 While w(t, t.p0); | 254 While w(t, t.p0); |
256 t.Return(t.p0, t.start, w.exit); | 255 t.Return(t.p0, t.start, w.exit); |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 Node* p1b = t.graph.NewNode(op, t.p0, t.p0, w1.loop); | 481 Node* p1b = t.graph.NewNode(op, t.p0, t.p0, w1.loop); |
483 Node* p2a = t.graph.NewNode(op, p1a, t.p0, w2.loop); | 482 Node* p2a = t.graph.NewNode(op, p1a, t.p0, w2.loop); |
484 Node* p2b = t.graph.NewNode(op, p1b, t.p0, w2.loop); | 483 Node* p2b = t.graph.NewNode(op, p1b, t.p0, w2.loop); |
485 | 484 |
486 p1a->ReplaceInput(1, p2b); | 485 p1a->ReplaceInput(1, p2b); |
487 p1b->ReplaceInput(1, p2a); | 486 p1b->ReplaceInput(1, p2a); |
488 | 487 |
489 p2a->ReplaceInput(1, p2b); | 488 p2a->ReplaceInput(1, p2b); |
490 p2b->ReplaceInput(1, p2a); | 489 p2b->ReplaceInput(1, p2a); |
491 | 490 |
492 t.Return(t.p0, p1a, w1.exit); | 491 t.Return(t.p0, t.start, w1.exit); |
493 | 492 |
494 Node* chain[] = {w1.loop, w2.loop}; | 493 Node* chain[] = {w1.loop, w2.loop}; |
495 t.CheckNestedLoops(chain, 2); | 494 t.CheckNestedLoops(chain, 2); |
496 | 495 |
497 Node* h1[] = {w1.loop, p1a, p1b}; | 496 Node* h1[] = {w1.loop, p1a, p1b}; |
498 Node* b1[] = {w1.branch, w1.if_true, w2.loop, p2a, | 497 Node* b1[] = {w1.branch, w1.if_true, w2.loop, p2a, |
499 p2b, w2.branch, w2.if_true, w2.exit}; | 498 p2b, w2.branch, w2.if_true, w2.exit}; |
500 t.CheckLoop(h1, 3, b1, 8); | 499 t.CheckLoop(h1, 3, b1, 8); |
501 | 500 |
502 Node* h2[] = {w2.loop, p2a, p2b}; | 501 Node* h2[] = {w2.loop, p2a, p2b}; |
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1006 TEST(LaManyNested_31) { RunManyNestedLoops_i(31); } | 1005 TEST(LaManyNested_31) { RunManyNestedLoops_i(31); } |
1007 TEST(LaManyNested_32) { RunManyNestedLoops_i(32); } | 1006 TEST(LaManyNested_32) { RunManyNestedLoops_i(32); } |
1008 TEST(LaManyNested_33) { RunManyNestedLoops_i(33); } | 1007 TEST(LaManyNested_33) { RunManyNestedLoops_i(33); } |
1009 TEST(LaManyNested_34) { RunManyNestedLoops_i(34); } | 1008 TEST(LaManyNested_34) { RunManyNestedLoops_i(34); } |
1010 TEST(LaManyNested_62) { RunManyNestedLoops_i(62); } | 1009 TEST(LaManyNested_62) { RunManyNestedLoops_i(62); } |
1011 TEST(LaManyNested_63) { RunManyNestedLoops_i(63); } | 1010 TEST(LaManyNested_63) { RunManyNestedLoops_i(63); } |
1012 TEST(LaManyNested_64) { RunManyNestedLoops_i(64); } | 1011 TEST(LaManyNested_64) { RunManyNestedLoops_i(64); } |
1013 | 1012 |
1014 | 1013 |
1015 TEST(LaPhiTangle) { LoopFinderTester t; } | 1014 TEST(LaPhiTangle) { LoopFinderTester t; } |
OLD | NEW |