Reviewers: titzer,
Description:
[turbofan] Turn JSBuiltinReducer into an AdvancedReducer.
This in turn allows usage of AdvancedReducer::ReplaceWithValue which
has access to the underlying graph reducer. It will allow us to deal
with exception continuations correctly.
[email protected]
Please review this at https://codereview.chromium.org/1158273011/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+23, -21 lines):
M src/compiler/js-builtin-reducer.h
M src/compiler/js-builtin-reducer.cc
M src/compiler/pipeline.cc
M test/unittests/compiler/js-builtin-reducer-unittest.cc
Index: src/compiler/js-builtin-reducer.cc
diff --git a/src/compiler/js-builtin-reducer.cc
b/src/compiler/js-builtin-reducer.cc
index
12b0e2f6cc97d38eb8986ec3f8a19b923ba008a3..86df9f5319ce6271a32867cf748c614fe1b2d774
100644
--- a/src/compiler/js-builtin-reducer.cc
+++ b/src/compiler/js-builtin-reducer.cc
@@ -14,17 +14,6 @@ namespace internal {
namespace compiler {
-// Helper method that assumes replacement nodes are pure values that don't
-// produce an effect. Replaces {node} with {reduction} and relaxes effects.
-static Reduction ReplaceWithPureReduction(Node* node, Reduction reduction)
{
- if (reduction.Changed()) {
- NodeProperties::ReplaceWithValue(node, reduction.replacement());
- return reduction;
- }
- return Reducer::NoChange();
-}
-
-
// Helper class to access JSCallFunction nodes that are potential
candidates
// for reduction when they have a BuiltinFunctionId associated with them.
class JSCallReduction {
@@ -96,8 +85,10 @@ class JSCallReduction {
};
-JSBuiltinReducer::JSBuiltinReducer(JSGraph* jsgraph)
- : jsgraph_(jsgraph), simplified_(jsgraph->zone()) {}
+JSBuiltinReducer::JSBuiltinReducer(Editor* editor, JSGraph* jsgraph)
+ : AdvancedReducer(editor),
+ jsgraph_(jsgraph),
+ simplified_(jsgraph->zone()) {}
// ECMA-262, section 15.8.2.11.
@@ -153,21 +144,30 @@ Reduction JSBuiltinReducer::ReduceMathFround(Node*
node) {
Reduction JSBuiltinReducer::Reduce(Node* node) {
+ Reduction reduction = NoChange();
JSCallReduction r(node);
// Dispatch according to the BuiltinFunctionId if present.
if (!r.HasBuiltinFunctionId()) return NoChange();
switch (r.GetBuiltinFunctionId()) {
case kMathMax:
- return ReplaceWithPureReduction(node, ReduceMathMax(node));
+ reduction = ReduceMathMax(node);
+ break;
case kMathImul:
- return ReplaceWithPureReduction(node, ReduceMathImul(node));
+ reduction = ReduceMathImul(node);
+ break;
case kMathFround:
- return ReplaceWithPureReduction(node, ReduceMathFround(node));
+ reduction = ReduceMathFround(node);
+ break;
default:
break;
}
- return NoChange();
+
+ // Replace builtin call assuming replacement nodes are pure values that
don't
+ // produce an effect. Replaces {node} with {reduction} and relaxes
effects.
+ if (reduction.Changed()) ReplaceWithValue(node, reduction.replacement());
+
+ return reduction;
}
Index: src/compiler/js-builtin-reducer.h
diff --git a/src/compiler/js-builtin-reducer.h
b/src/compiler/js-builtin-reducer.h
index
14bf67595b9ffcceae14865f01588ff664419450..66b5723246c9e83a614a79f900d17a448b575a72
100644
--- a/src/compiler/js-builtin-reducer.h
+++ b/src/compiler/js-builtin-reducer.h
@@ -18,9 +18,9 @@ class JSGraph;
class MachineOperatorBuilder;
-class JSBuiltinReducer final : public Reducer {
+class JSBuiltinReducer final : public AdvancedReducer {
public:
- explicit JSBuiltinReducer(JSGraph* jsgraph);
+ explicit JSBuiltinReducer(Editor* editor, JSGraph* jsgraph);
~JSBuiltinReducer() final {}
Reduction Reduce(Node* node) final;
Index: src/compiler/pipeline.cc
diff --git a/src/compiler/pipeline.cc b/src/compiler/pipeline.cc
index
5c9ee62a459d3ff4474a722959f3b2cfb2ec2497..20f3d60daab8cd33f27a6c5d61c3be0fd71a4fc7
100644
--- a/src/compiler/pipeline.cc
+++ b/src/compiler/pipeline.cc
@@ -570,7 +570,7 @@ struct TypedLoweringPhase {
void Run(PipelineData* data, Zone* temp_zone) {
JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
LoadElimination load_elimination;
- JSBuiltinReducer builtin_reducer(data->jsgraph());
+ JSBuiltinReducer builtin_reducer(&graph_reducer, data->jsgraph());
JSTypedLowering typed_lowering(&graph_reducer, data->jsgraph(),
temp_zone);
JSIntrinsicLowering intrinsic_lowering(
&graph_reducer, data->jsgraph(),
Index: test/unittests/compiler/js-builtin-reducer-unittest.cc
diff --git a/test/unittests/compiler/js-builtin-reducer-unittest.cc
b/test/unittests/compiler/js-builtin-reducer-unittest.cc
index
a56fee1150e3107b367a398b302f105f5afce911..b452ba56c504bede2b523e2ee4facf0b8dc9aeb4
100644
--- a/test/unittests/compiler/js-builtin-reducer-unittest.cc
+++ b/test/unittests/compiler/js-builtin-reducer-unittest.cc
@@ -26,7 +26,9 @@ class JSBuiltinReducerTest : public TypedGraphTest {
MachineOperatorBuilder::Flag::kNoFlags)
{
MachineOperatorBuilder machine(zone(), kMachPtr, flags);
JSGraph jsgraph(isolate(), graph(), common(), javascript(), &machine);
- JSBuiltinReducer reducer(&jsgraph);
+ // TODO(titzer): mock the GraphReducer here for better unit testing.
+ GraphReducer graph_reducer(zone(), graph());
+ JSBuiltinReducer reducer(&graph_reducer, &jsgraph);
return reducer.Reduce(node);
}
--
--
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.