| Index: pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
|
| diff --git a/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart b/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
|
| index c06046b3cabbb77801c8616058cfc9fc9a77db14..a6017cbb0454226ec6fa6f9e4aa07b6abc4c049f 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
|
| @@ -24,9 +24,6 @@ class ShrinkingReducer extends Pass {
|
| _worklist = new List<_ReductionTask>();
|
| _RedexVisitor redexVisitor = new _RedexVisitor(_worklist);
|
|
|
| - // Set all parent pointers.
|
| - new ParentVisitor().visit(root);
|
| -
|
| // Sweep over the term, collecting redexes into the worklist.
|
| redexVisitor.visit(root);
|
|
|
| @@ -54,16 +51,9 @@ class ShrinkingReducer extends Pass {
|
| void _removeContinuation(Continuation cont) {
|
| LetCont parent = cont.parent;
|
| if (parent.continuations.length == 1) {
|
| - assert(cont.parent_index == 0);
|
| _removeNode(parent);
|
| } else {
|
| - List<Continuation> continuations = parent.continuations;
|
| - for (int i = cont.parent_index; i < continuations.length - 1; ++i) {
|
| - Continuation current = continuations[i + 1];
|
| - continuations[i] = current;
|
| - current.parent_index = i;
|
| - }
|
| - continuations.removeLast();
|
| + parent.continuations.remove(cont);
|
| }
|
| cont.parent = _DELETED;
|
| }
|
| @@ -204,7 +194,8 @@ class ShrinkingReducer extends Pass {
|
|
|
| Parameter parameter = task.node;
|
| Continuation continuation = parameter.parent;
|
| - int index = parameter.parentIndex;
|
| + int index = continuation.parameters.indexOf(parameter);
|
| + assert(index != -1);
|
|
|
| // Remove the index'th argument from each invocation.
|
| Reference<Continuation> current = continuation.firstRef;
|
| @@ -229,14 +220,7 @@ class ShrinkingReducer extends Pass {
|
| invoke.arguments.removeAt(index);
|
| current = current.next;
|
| }
|
| - // Copy the parameters above index down.
|
| - List<Parameter> parameters = continuation.parameters;
|
| - for (int i = index; i < parameters.length - 1; ++i) {
|
| - Parameter p = parameters[i + 1];
|
| - parameters[i] = p;
|
| - p.parentIndex = i;
|
| - }
|
| - parameters.removeLast();
|
| + continuation.parameters.removeAt(index);
|
|
|
| // Removing an unused parameter can create an eta-redex.
|
| if (_isEtaCont(continuation)) {
|
| @@ -398,7 +382,7 @@ bool _isDeadParameter(Parameter parameter) {
|
| }
|
|
|
| /// Traverses a term and adds any found redexes to the worklist.
|
| -class _RedexVisitor extends RecursiveVisitor {
|
| +class _RedexVisitor extends TrampolineRecursiveVisitor {
|
| final List<_ReductionTask> worklist;
|
|
|
| _RedexVisitor(this.worklist);
|
| @@ -444,7 +428,7 @@ class _RedexVisitor extends RecursiveVisitor {
|
| /// Deleted nodes that might participate in a reduction task are marked so that
|
| /// any corresponding tasks can be skipped. Nodes are marked so by setting
|
| /// their parent to the deleted sentinel.
|
| -class _RemovalVisitor extends RecursiveVisitor {
|
| +class _RemovalVisitor extends TrampolineRecursiveVisitor {
|
| final List<_ReductionTask> worklist;
|
|
|
| _RemovalVisitor(this.worklist);
|
| @@ -490,224 +474,7 @@ class _RemovalVisitor extends RecursiveVisitor {
|
| }
|
| }
|
|
|
| -/// Traverses the CPS term and sets node.parent for each visited node.
|
| -class ParentVisitor extends RecursiveVisitor {
|
| - processFunctionDefinition(FunctionDefinition node) {
|
| - node.body.parent = node;
|
| - if (node.thisParameter != null) node.thisParameter.parent = node;
|
| - int index = 0;
|
| - node.parameters.forEach((Definition parameter) {
|
| - parameter.parent = node;
|
| - if (parameter is Parameter) parameter.parentIndex = index++;
|
| - });
|
| - node.returnContinuation.parent = node;
|
| - node.body.parent = node;
|
| - }
|
| -
|
| - processLetPrim(LetPrim node) {
|
| - node.primitive.parent = node;
|
| - node.body.parent = node;
|
| - }
|
| -
|
| - processLetCont(LetCont node) {
|
| - int index = 0;
|
| - node.continuations.forEach((Continuation continuation) {
|
| - continuation.parent = node;
|
| - continuation.parent_index = index++;
|
| - });
|
| - node.body.parent = node;
|
| - }
|
| -
|
| - processLetHandler(LetHandler node) {
|
| - node.handler.parent = node;
|
| - node.body.parent = node;
|
| - }
|
| -
|
| - processLetMutable(LetMutable node) {
|
| - node.variable.parent = node;
|
| - node.value.parent = node;
|
| - node.body.parent = node;
|
| - }
|
| -
|
| - processInvokeStatic(InvokeStatic node) {
|
| - node.arguments.forEach((Reference ref) => ref.parent = node);
|
| - node.continuation.parent = node;
|
| - }
|
| -
|
| - processInvokeContinuation(InvokeContinuation node) {
|
| - node.continuation.parent = node;
|
| - node.arguments.forEach((Reference ref) => ref.parent = node);
|
| - }
|
| -
|
| - processInvokeMethod(InvokeMethod node) {
|
| - node.receiver.parent = node;
|
| - node.continuation.parent = node;
|
| - node.arguments.forEach((Reference ref) => ref.parent = node);
|
| - }
|
| -
|
| - processInvokeMethodDirectly(InvokeMethodDirectly node) {
|
| - node.receiver.parent = node;
|
| - node.continuation.parent = node;
|
| - node.arguments.forEach((Reference ref) => ref.parent = node);
|
| - }
|
| -
|
| - processInvokeConstructor(InvokeConstructor node) {
|
| - node.continuation.parent = node;
|
| - node.arguments.forEach((Reference ref) => ref.parent = node);
|
| - }
|
| -
|
| - processBranch(Branch node) {
|
| - node.condition.parent = node;
|
| - node.trueContinuation.parent = node;
|
| - node.falseContinuation.parent = node;
|
| - }
|
| -
|
| - processTypeCast(TypeCast node) {
|
| - node.typeArguments.forEach((Reference ref) => ref.parent = node);
|
| - node.continuation.parent = node;
|
| - node.value.parent = node;
|
| - }
|
| -
|
| - processTypeTest(TypeTest node) {
|
| - node.typeArguments.forEach((Reference ref) => ref.parent = node);
|
| - node.value.parent = node;
|
| - if (node.interceptor != null) node.interceptor.parent = node;
|
| - }
|
| -
|
| - processTypeTestViaFlag(TypeTestViaFlag node) {
|
| - node.interceptor.parent = node;
|
| - }
|
| -
|
| - processSetMutable(SetMutable node) {
|
| - node.variable.parent = node;
|
| - node.value.parent = node;
|
| - }
|
| -
|
| - processThrow(Throw node) {
|
| - node.value.parent = node;
|
| - }
|
| -
|
| - processGetLazyStatic(GetLazyStatic node) {
|
| - node.continuation.parent = node;
|
| - }
|
| -
|
| - processLiteralList(LiteralList node) {
|
| - node.values.forEach((Reference ref) => ref.parent = node);
|
| - }
|
| -
|
| - processLiteralMap(LiteralMap node) {
|
| - node.entries.forEach((LiteralMapEntry entry) {
|
| - entry.key.parent = node;
|
| - entry.value.parent = node;
|
| - });
|
| - }
|
| -
|
| - processCreateFunction(CreateFunction node) {
|
| - node.definition.parent = node;
|
| - }
|
| -
|
| - processContinuation(Continuation node) {
|
| - if (node.body != null) node.body.parent = node;
|
| - int index = 0;
|
| - node.parameters.forEach((Parameter parameter) {
|
| - parameter.parent = node;
|
| - parameter.parentIndex = index++;
|
| - });
|
| - }
|
|
|
| - processInterceptor(Interceptor node) {
|
| - node.input.parent = node;
|
| - }
|
| -
|
| - processSetField(SetField node) {
|
| - node.object.parent = node;
|
| - node.value.parent = node;
|
| - }
|
| -
|
| - processGetField(GetField node) {
|
| - node.object.parent = node;
|
| - }
|
| -
|
| - processGetStatic(GetStatic node) {
|
| - }
|
| -
|
| - processSetStatic(SetStatic node) {
|
| - node.value.parent = node;
|
| - }
|
| -
|
| - processGetMutable(GetMutable node) {
|
| - node.variable.parent = node;
|
| - }
|
| -
|
| - processCreateInstance(CreateInstance node) {
|
| - node.arguments.forEach((Reference ref) => ref.parent = node);
|
| - node.typeInformation.forEach((Reference ref) => ref.parent = node);
|
| - }
|
| -
|
| - processCreateBox(CreateBox node) {
|
| - }
|
| -
|
| - processReifyRuntimeType(ReifyRuntimeType node) {
|
| - node.value.parent = node;
|
| - }
|
| -
|
| - processReadTypeVariable(ReadTypeVariable node) {
|
| - node.target.parent = node;
|
| - }
|
| -
|
| - processTypeExpression(TypeExpression node) {
|
| - node.arguments.forEach((Reference ref) => ref.parent = node);
|
| - }
|
| -
|
| - processCreateInvocationMirror(CreateInvocationMirror node) {
|
| - node.arguments.forEach((Reference ref) => ref.parent = node);
|
| - }
|
| -
|
| - processApplyBuiltinOperator(ApplyBuiltinOperator node) {
|
| - node.arguments.forEach((Reference ref) => ref.parent = node);
|
| - }
|
| -
|
| - processApplyBuiltinMethod(ApplyBuiltinMethod node) {
|
| - node.receiver.parent = node;
|
| - node.arguments.forEach((Reference ref) => ref.parent = node);
|
| - }
|
| -
|
| - processForeignCode(ForeignCode node) {
|
| - if (node.continuation != null) {
|
| - node.continuation.parent = node;
|
| - }
|
| - node.arguments.forEach((Reference ref) => ref.parent = node);
|
| - }
|
| -
|
| - processGetLength(GetLength node) {
|
| - node.object.parent = node;
|
| - }
|
| -
|
| - processGetIndex(GetIndex node) {
|
| - node.object.parent = node;
|
| - node.index.parent = node;
|
| - }
|
| -
|
| - processSetIndex(SetIndex node) {
|
| - node.object.parent = node;
|
| - node.index.parent = node;
|
| - node.value.parent = node;
|
| - }
|
| -
|
| - processAwait(Await node) {
|
| - node.continuation.parent = node;
|
| - node.input.parent = node;
|
| - }
|
| -
|
| - processRefinement(Refinement node) {
|
| - node.value.parent = node;
|
| - }
|
| -
|
| - processYield(Yield node) {
|
| - node.continuation.parent = node;
|
| - node.input.parent = node;
|
| - }
|
| -}
|
|
|
| class _ReductionKind {
|
| final String name;
|
| @@ -751,5 +518,6 @@ class _ReductionTask {
|
| /// A dummy class used solely to mark nodes as deleted once they are removed
|
| /// from a term.
|
| class _DeletedNode extends Node {
|
| - accept(_) => null;
|
| + accept(_) {}
|
| + setParentPointers() {}
|
| }
|
|
|