Index: pkg/compiler/lib/src/ssa/builder.dart |
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart |
index e4b5c8bfb39c7b17683b2ac749881d580c3209d6..3462f02ce4883c85b423697cafda89e2ec31777b 100644 |
--- a/pkg/compiler/lib/src/ssa/builder.dart |
+++ b/pkg/compiler/lib/src/ssa/builder.dart |
@@ -1293,12 +1293,6 @@ class SsaBuilder extends NewResolvedVisitor { |
if (cachedCanBeInlined == false) return false; |
bool meetsHardConstraints() { |
- // Don't inline from one output unit to another. If something is deferred |
- // it is to save space in the loading code. |
- if (!compiler.deferredLoadTask |
- .inSameOutputUnit(element,compiler.currentElement)) { |
- return false; |
- } |
if (compiler.disableInlining) return false; |
assert(selector != null |
@@ -1348,12 +1342,18 @@ class SsaBuilder extends NewResolvedVisitor { |
return InlineWeeder.canBeInlined(function, -1, false); |
} |
// TODO(sra): Measure if inlining would 'reduce' the size. One desirable |
- // case we miss my doing nothing is inlining very simple constructors |
+ // case we miss by doing nothing is inlining very simple constructors |
// where all fields are initialized with values from the arguments at this |
// call site. The code is slightly larger (`new Foo(1)` vs `Foo$(1)`) but |
// that usually means the factory constructor is left unused and not |
// emitted. |
- return false; |
+ // We at least inline bodies that are empty (and thus have a size of 1). |
+ return InlineWeeder.canBeInlined(function, 1, true); |
sra1
2015/05/06 20:49:56
Call doesNotContainCode below?
herhut
2015/05/26 14:26:29
Done in https://codereview.chromium.org/1159813002
|
+ } |
+ |
+ bool doesNotContainCode() { |
+ // A function with size 1 does not contain any code. |
+ return InlineWeeder.canBeInlined(function, 1, true); |
} |
bool heuristicSayGoodToGo() { |
@@ -1364,6 +1364,16 @@ class SsaBuilder extends NewResolvedVisitor { |
if (element.isSynthesized) return true; |
+ // Don't inline across deferred import to prevent leaking code. The only |
+ // exception is an empty function (which does not contain code). |
+ bool hasOnlyNonDeferredImportPaths = compiler.deferredLoadTask |
+ .hasOnlyNonDeferredImportPaths(compiler.currentElement, element); |
+ |
+ if (!hasOnlyNonDeferredImportPaths) { |
+ return doesNotContainCode(); |
+ } |
+ |
+ // Do not inline code that is rarely executed unless it reduces size. |
if (inExpressionOfThrow || inLazyInitializerExpression) { |
return reductiveHeuristic(); |
} |