| Index: pkg/compiler/lib/src/ssa/optimize.dart | 
| diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart | 
| index 28f0632fd1ad6a96d65176f166615ed9a5305a26..43300de10847e01f9f77fbdcec0b598ad766fc20 100644 | 
| --- a/pkg/compiler/lib/src/ssa/optimize.dart | 
| +++ b/pkg/compiler/lib/src/ssa/optimize.dart | 
| @@ -33,6 +33,7 @@ class SsaOptimizerTask extends CompilerTask { | 
| void optimize(CodegenWorkItem work, HGraph graph) { | 
| ConstantSystem constantSystem = compiler.backend.constantSystem; | 
| JavaScriptItemCompilationContext context = work.compilationContext; | 
| +    bool trustPrimitives = compiler.trustPrimitives; | 
| measure(() { | 
| SsaDeadCodeEliminator dce; | 
| List<OptimizationPhase> phases = <OptimizationPhase>[ | 
| @@ -46,9 +47,11 @@ class SsaOptimizerTask extends CompilerTask { | 
| // After type propagation, more instructions can be | 
| // simplified. | 
| new SsaInstructionSimplifier(constantSystem, backend, work), | 
| -          new SsaCheckInserter(backend, work, context.boundsChecked), | 
| +          new SsaCheckInserter( | 
| +              trustPrimitives, backend, work, context.boundsChecked), | 
| new SsaInstructionSimplifier(constantSystem, backend, work), | 
| -          new SsaCheckInserter(backend, work, context.boundsChecked), | 
| +          new SsaCheckInserter( | 
| +              trustPrimitives, backend, work, context.boundsChecked), | 
| new SsaTypePropagator(compiler), | 
| // Run a dead code eliminator before LICM because dead | 
| // interceptors are often in the way of LICM'able instructions. | 
| @@ -65,7 +68,8 @@ class SsaOptimizerTask extends CompilerTask { | 
| // Previous optimizations may have generated new | 
| // opportunities for instruction simplification. | 
| new SsaInstructionSimplifier(constantSystem, backend, work), | 
| -          new SsaCheckInserter(backend, work, context.boundsChecked), | 
| +          new SsaCheckInserter( | 
| +              trustPrimitives, backend, work, context.boundsChecked), | 
| new SsaSimplifyInterceptors(compiler, constantSystem, work), | 
| dce = new SsaDeadCodeEliminator(compiler), | 
| new SsaTypePropagator(compiler)]; | 
| @@ -76,7 +80,8 @@ class SsaOptimizerTask extends CompilerTask { | 
| new SsaCodeMotion(), | 
| new SsaValueRangeAnalyzer(compiler, constantSystem, work), | 
| new SsaInstructionSimplifier(constantSystem, backend, work), | 
| -            new SsaCheckInserter(backend, work, context.boundsChecked), | 
| +            new SsaCheckInserter( | 
| +                trustPrimitives, backend, work, context.boundsChecked), | 
| new SsaSimplifyInterceptors(compiler, constantSystem, work), | 
| new SsaDeadCodeEliminator(compiler)]; | 
| } else { | 
| @@ -886,16 +891,24 @@ class SsaInstructionSimplifier extends HBaseVisitor | 
| class SsaCheckInserter extends HBaseVisitor implements OptimizationPhase { | 
| final Set<HInstruction> boundsChecked; | 
| final CodegenWorkItem work; | 
| +  final bool trustPrimitives; | 
| final JavaScriptBackend backend; | 
| final String name = "SsaCheckInserter"; | 
| HGraph graph; | 
|  | 
| -  SsaCheckInserter(this.backend, | 
| +  SsaCheckInserter(this.trustPrimitives, | 
| +                   this.backend, | 
| this.work, | 
| this.boundsChecked); | 
|  | 
| void visitGraph(HGraph graph) { | 
| this.graph = graph; | 
| + | 
| +    // In --trust-primitives mode we don't add bounds checks.  This is better | 
| +    // than trying to remove them later as the limit expression would become | 
| +    // dead and require DCE. | 
| +    if (trustPrimitives) return; | 
| + | 
| visitDominatorTree(graph); | 
| } | 
|  | 
|  |