Chromium Code Reviews| 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 3c55c53fbf232ae09de1ba053af0b1e2921f0501..c0980beca5a0c5ed1b101bba5a0167bdc77cae7d 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. |
|
floitsch
2015/05/04 23:32:58
this comment is incomplete: we must not inline cod
herhut
2015/05/05 14:19:12
I changed it to not inline across deferred imports
|
| - if (!compiler.deferredLoadTask |
| - .inSameOutputUnit(element,compiler.currentElement)) { |
| - return false; |
| - } |
| if (compiler.disableInlining) return false; |
| assert(selector != null |
| @@ -1348,12 +1342,13 @@ 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); |
| } |
| bool heuristicSayGoodToGo() { |
| @@ -1364,7 +1359,14 @@ class SsaBuilder extends NewResolvedVisitor { |
| if (element.isSynthesized) return true; |
| - if (inExpressionOfThrow || inLazyInitializerExpression) { |
| + // Don't inline from one output unit to another, unless it reduces size. |
| + // Similarly do not inline code that is rarely executed. |
| + bool fromDifferentOutputUnit = !compiler.deferredLoadTask |
| + .inSameOutputUnit(element,compiler.currentElement); |
| + |
| + if (inExpressionOfThrow || |
| + inLazyInitializerExpression || |
| + fromDifferentOutputUnit) { |
| return reductiveHeuristic(); |
| } |