Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Unified Diff: sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart

Issue 108553006: Dummy receiver optimization (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add DummyReceiverConstant Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
index e4a4ad825268f78016408b3c07a567ed5a23077c..a7df4f5fd232f171eb69400a0a1531ed3949ed56 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
@@ -215,7 +215,29 @@ class SsaSimplifyInterceptors extends HBaseVisitor
HInstruction receiver = node.receiver;
if (canUseSelfForInterceptor(receiver, interceptedClasses)) {
+ var users = node.usedBy.toList();
floitsch 2013/12/18 19:20:12 We use types.
sra1 2013/12/19 03:28:15 Done.
node.block.rewrite(node, receiver);
+
+ // Replace occurences of the receiver in invocations with a dummy receiver
+ // if the selector matches only methods that ignore the receiver.
+ JavaScriptBackend backend = compiler.backend;
+ for (var user in users) {
floitsch 2013/12/18 19:20:12 ditto.
sra1 2013/12/19 03:28:15 Done.
+ if (user is HInvokeDynamic) {
+ HInvokeDynamic invoke = user;
+ if (invoke.getDartReceiver(compiler) == receiver
+ && !backend.isInterceptedMixinSelector(invoke.selector)) {
+ // [receiver] might not be the direct input since `node.receiver`
+ // looks through type conversion nodes like [TypeKnown].
+ HInstruction immediateReceiver = invoke.inputs[1];
+ Constant constant = new DummyReceiverConstant(
+ immediateReceiver.instructionType);
+ var dummy = graph.addConstant(constant, compiler);
floitsch 2013/12/18 19:20:12 ditto.
sra1 2013/12/19 03:28:15 Done.
+ immediateReceiver.usedBy.remove(invoke);
+ invoke.inputs[1] = dummy;
+ dummy.usedBy.add(invoke);
+ }
+ }
+ }
return false;
}

Powered by Google App Engine
This is Rietveld 408576698