Commit Graph

454 Commits

Author SHA1 Message Date
srdjan@google.com cd92319223 Optimize string length one comparisons by comparing char codes only. Implemented for one byte strings only at the moment. Will add other string types/mixed compares later.
R=fschneider@google.com

Review URL: https://codereview.chromium.org//105143011

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31347 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-20 20:11:38 +00:00
fschneider@google.com e994d8b697 Revert r31326.
TBR=johnmccutchan@google.com,

Review URL: https://codereview.chromium.org//118133004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31332 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-20 12:21:09 +00:00
fschneider@google.com fe726e1971 Use parallel move resolver for optimized try-catch.
This CL has no change in functionality and is purely clean up and
refactoring. Instead of manually generating the moves at throwing
instructions in try-catch, construct a parallel move and use the resolver
to emit the native code. This eliminates a lot of duplicated code
from all platforms.

It will also allow to re-use stack space that is currently allocated
separately for each individual try-catch in a function.

I added a few more unrelated minor changes in various parts of the VM
* Simpilify guard code generation
* Resolve refactoring TODO in deoptimization
* Improve names

R=johnmccutchan@google.com

Review URL: https://codereview.chromium.org//119213002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31326 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-20 09:41:42 +00:00
fschneider@google.com 21d0b251e0 Update double unboxing heuristic.
R=srdjan@google.com

Review URL: https://codereview.chromium.org//119103002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31324 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-20 09:18:40 +00:00
srdjan@google.com 761d4d04cd Constant propagation in LoadIndexed when inputs are array/string and index constants.
R=fschneider@google.com, johnmccutchan@google.com

Review URL: https://codereview.chromium.org//102973007

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31230 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-18 16:55:12 +00:00
fschneider@google.com f7149b05c8 Fix bug in double unboxing.
The state bit that record if a field is unboxed or not has to be checked
in unoptimized code as well, since that code does not change when deoptimizing.

I also compacted the kind_bits bit field in the Field class to start from bit 0.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//106623006

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31229 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-18 15:46:39 +00:00
fschneider@google.com 6abd6e326e Add mutable double boxes for fields.
This allows the optimizing compiler to generate unboxed loads/stores
to fields containing double values. The double value is stored
in a reusable double object.

Unboxed loads/stores are generated for optimized code. Unoptimized code
allocates a new double on loads. To avoid performance regressions
for fields that are only written few times (e.g. only in the constructor)
I put a heuristic in place that
compares the usage count of setters and getters. Unboxed operations
are only generated if the setter is invoked a significant amount of
times (threshold is 10% of getter invocations).

The CL is so big because it changes the way LocationSummmary
is allocated: We now have a bit to generate different summaries
for optimized and unoptimized code.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//99573005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31164 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-16 15:11:31 +00:00
ajohnsen@google.com 7d4e2f9ac8 Alternative Timer implementation using simply list-based priority heap.
The current implementation is not memory-optimized yet, to make it
easier to review.

BUG=
R=fschneider@google.com, lrn@google.com, sgjesse@google.com

Committed: https://code.google.com/p/dart/source/detail?r=31132

Review URL: https://codereview.chromium.org//99203010

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31158 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-16 12:56:37 +00:00
srdjan@google.com 98a1355ef9 Restoring the remaining CL 104893003. For instance call representing numerical comparisons and binary operations (double and Smi supported for now) that were never visited before optimization occurs, we guess the cids if one of the argument cids is known, e.g. ‘a == 1’ we guess that a is also going to be 1 thus avoiding emitting an IC-call in optimized code and propagating the type accordingly.
Remove AssertAssignableInstr::RecomputeType as it may cause incorrect behavior: it changes the type of its value based on input, the graph below will then incorrectly remove CheckSmi.

v27 <- BinaryMintOp:14(..

v28 <- AssertAssignable(v27)
CheckSmi(v28)
v17 <- BinarySmiOp:86(+, v28, v12)

R=fschneider@google.com

Review URL: https://codereview.chromium.org//114543004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31137 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-13 17:15:05 +00:00
srdjan@google.com d1485f3058 Some cleanups, fixes. Parts of the cid guessing CL that was revrted.
R=fschneider@google.com

Review URL: https://codereview.chromium.org//112243002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31085 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-11 22:25:38 +00:00
srdjan@google.com 92c6188860 Revert r31036, because of bit redness.
Review URL: https://codereview.chromium.org//101373006

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31039 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-10 21:16:02 +00:00
srdjan@google.com 07775d340e For instance call representing numerical comparisons and binary operations (double and Smi supported for now) that were never visited before optimization occurs, we guess the cids if one of the argument cids is known, e.g. ‘a == 1’ we guess that a is also going to be 1 thus avoiding emitting an IC-call in optimized code and propagating the type accordingly.
R=fschneider@google.com

Review URL: https://codereview.chromium.org//104893003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31036 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-10 19:09:44 +00:00
fschneider@google.com be4ffc62d6 VM: Generalize using propagated cids for to >1 arguments.
When ic-data are missing (optimized code that was not executed yet),
the compiler tries to fill in information calculated with type propagation.
The approach was only used for calls with 1 tested argument. This
enables it for all calls where we want to use propagated type
information if ic-data are missing.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//110703004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31020 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-10 15:23:14 +00:00
srdjan@google.com b93e8d9267 Removed debuggging printf.
Review URL: https://codereview.chromium.org//102213003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30829 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-03 22:07:16 +00:00
srdjan@google.com a8f549dbc3 Merge sin(a), cos(a) into one instruction. On IA32 use x87 fsincos operation, on x64 call runtime routine whihc merges sin/cos intos sincos.
TODO: Implement for ARM and MIPS.

R=fschneider@google.com

Review URL: https://codereview.chromium.org//92433002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30827 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-03 22:00:27 +00:00
fschneider@google.com 8b0b3fde4d Generalize if-conversion to arbitrary smi comparisons.
Until now only == and != comparisons were supported.

Further changes are:
 Remove flag FLAG_new_identity_spec: It is not needed anymore.
 Invoke Canonicalize another time before branch optimizations.
 Fixes support for TestSmiInstr with the branch-simplifier pass.

R=kmillikin@google.com

Review URL: https://codereview.chromium.org//78733002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30622 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-25 12:57:21 +00:00
regis@google.com d1e945994e Improve type test and type equality for generics (issue 15148).
R=srdjan@google.com

Review URL: https://codereview.chromium.org//81363002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30546 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-21 21:30:51 +00:00
srdjan@google.com 3165e204e3 Merge TRUNCDIV and MOD into one instruction. Icorporated feedback from CL https://codereview.chromium.org/68663003
R=fschneider@google.com

Review URL: https://codereview.chromium.org//79653002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30536 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-21 17:56:54 +00:00
regis@google.com db2cec593d Distinguish between malformed and malbounded types more efficiently using the
recently introduced LanguageError 'kind' field.

R=hausner@google.com

Review URL: https://codereview.chromium.org//75713002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30383 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-18 23:31:12 +00:00
fschneider@google.com 35225e5888 Constant propagation support for type asserts.
R=kmillikin@google.com

Review URL: https://codereview.chromium.org//70133004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30232 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-13 15:57:26 +00:00
srdjan@google.com 16f4e5c690 Constant fold strict comparison based on incoming types: different (exact) types means that the result is false. LoadStaticField computes type for final fields. Make a temporary buffer final.
R=kmillikin@google.com

Review URL: https://codereview.chromium.org//57703004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30119 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-08 17:42:45 +00:00
srdjan@google.com b97c8e894c Inline integer modulo operation.
R=zra@google.com

Review URL: https://codereview.chromium.org//61123003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30075 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-07 21:50:26 +00:00
johnmccutchan@google.com efbf86f30a Take representation into account in ConstantPropagator::VisitInstanceOfInstr
BUG=
R=fschneider@google.com, srdjan@google.com

Review URL: https://codereview.chromium.org//25604003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30012 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-06 23:47:54 +00:00
fschneider@google.com aa789a7b27 Merge (x & y) == 0 pattern to emit a single test instruction.
This is based on a previous uncommitted CL by vegorov@
(https://codereview.chromium.org/14251023/).

It is rebased and fixes a bug in the MIPS implementation: BranchOnCondition
requires the comparison result in fixed registers CMPRES1/CMPRES2.

Remove register alias TMP1 (=TMP) and CMPRES (=CMPRES1). It is confusing to
have them around and easy to forget that they are actually the same.

R=srdjan@google.com, zra@google.com

Review URL: https://codereview.chromium.org//59613005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29966 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-06 12:13:29 +00:00
zra@google.com ca82c461a0 Impelments IfThenElse instruction for ARM and MIPS.
R=fschneider@google.com

Review URL: https://codereview.chromium.org//58003003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29933 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-05 20:45:25 +00:00
johnmccutchan@google.com 29c01044bc This is the final breaking change in dart:typed_data needed for Dart 1.0. We need this change because the ECMAScript SIMD specification only includes Int32x4 and Int32x4List and our types must match.
R=srdjan@google.com

Review URL: https://codereview.chromium.org//56023004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29849 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-04 21:56:59 +00:00
fschneider@google.com 9031c80c88 Change == into an instance call to allow polymorphic inlining of ==.
In unoptimized code equality is now just another instance call.

The optimizer replaces it with a specialized implementation based on static
 type information and type feedback.

Many of the manual optimizations of == in the optimizer are now just handled
 by the generic inliner, plus polymorphic inlining of == calls is now possible.
This also eliminates the need for a lot of duplicated code in the backend.

I adapted the inlining heuristics to compensate for the slightly larger
inital flow graph size.

Review URL: https://codereview.chromium.org//27307005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29800 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-04 11:32:52 +00:00
johnmccutchan@google.com 5f63715d47 SIMD shuffle API changes
R=srdjan@google.com, zra@google.com

Review URL: https://codereview.chromium.org//51373004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29723 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-01 07:09:54 +00:00
fschneider@google.com ce9573722c VM: Fix checked mode crash (issue 13831).
The AST for static getters differs between parsing the first time, and
subsequent parsings. This leads to a mismatch in deoptimization-ids
between the optimized and the unoptimized code.

This CL avoids creating different ASTs for the same static getters. To allow
better inlining of these getters, the initialization expression is wrapped in a
hidden static initializer-function. As a result the size of such getters is
constant and does not depend on the initializer expression.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//51123003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29680 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-31 16:49:55 +00:00
johnmccutchan@google.com 8a0fd8ce4d Add Uint32x4List to typed_data
R=asiva@google.com, srdjan@google.com, vsm@google.com

Review URL: https://codereview.chromium.org//51333005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29639 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-31 04:57:38 +00:00
srdjan@google.com cacd63cf7b Improve indexOf for one byte string receiver to work with other string classes.
Optimize access to core class’s class-ids.

R=zra@google.com

Review URL: https://codereview.chromium.org//47073009

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29610 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-30 23:51:42 +00:00
fschneider@google.com be9875fb2b VM: Fix bug in polymorphic inlining of recognized methods.
The inliner has to insert a redefinition of the receiver to
prevent illegal hoisting of instructions that depend on the
receiver class id.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//47933004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29389 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-28 20:20:11 +00:00
srdjan@google.com 8e7c6a5fae Move Stringinterpolation constant folding from constant propagator to canonicalizer. StrinIterpolateInstr cannot directlly refer to interpolation arguments but only to the array that holds them, therefore constant propagation cannot be applied.
R=fschneider@google.com

Review URL: https://codereview.chromium.org//34523007

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29118 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-23 20:37:18 +00:00
fschneider@google.com 4ecceeebb6 Use enums for the index of IL operands.
Addressing comments from a previous CL (https://codereview.chromium.org/28633003/).

R=srdjan@google.com

Review URL: https://codereview.chromium.org//35893012

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29087 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-23 15:27:09 +00:00
johnmccutchan@google.com 4ebeadba11 This CL enables the polymorphic inliner to inline loads on typed array views.
It also contains a small cleanup so that the signatures of BuildByteArrayViewLoad and BuildByteArrayViewStore match.

R=fschneider@google.com

Review URL: https://codereview.chromium.org//26191002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29066 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-23 09:18:52 +00:00
fschneider@google.com 593abec44c Fix bug with load elimination in checked mode.
Definitions that are redefined through AssertAssignable must be
unwrapped to number loads/stores correctly for them.

Fix test expectations for tests that are passing now that the
corresponding co19 test was changed.

BUG=https://code.google.com/p/dart/issues/detail?id=13543
R=srdjan@google.com

Review URL: https://codereview.chromium.org//35093002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29001 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-22 16:03:48 +00:00
fschneider@google.com 369a58132e Fix bugs in load elimination and type propagation.
Load elimination should consider the representation of loads/stores
when numbering places. Different representations result now in different
places so that there can't be mixed representations at phis after
load elimination.

Removed the flag --propagate-types because type propagation is required
for correctness of smi-check hoisting. Therefore, switching it off does not
 make sense anymore.

BUG=https://code.google.com/p/dart/issues/detail?id=6663, https://code.google.com/p/dart/issues/detail?id=14271
R=kmillikin@google.com

Review URL: https://codereview.chromium.org//28633003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28931 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-21 13:59:56 +00:00
fschneider@google.com 8779bc8d7f Optimize identical-comparisons based on propagated type information.
If the propagated type allows, eliminate the check for numbers at
identical operations in optimized code.

The previous optimizaton was done before full type propagation was run
and was therefore not very effective.

* Made flow-graph printing having no side-effects: calling Type() lazily
initializes the type_ and reaching_type_ fields of Value and Definition.
Access fields directly when printing instead.

Also, fixed two random spelling mistakes.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//27727002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28851 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-18 11:13:59 +00:00
srdjan@google.com 14b7cc4b18 Temporary disable string-interpolation constant folding until failures witj --optimization-counter-threshold=5 are resolved.
Review URL: https://codereview.chromium.org//27581002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28749 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-16 20:53:03 +00:00
srdjan@google.com b83bda9e0e Add new style of string interpolation optimization: new nodes, working constant folding.
TODO: partial constant fold of incoming arguments.

R=kmillikin@google.com

Review URL: https://codereview.chromium.org//27192005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28741 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-16 18:12:08 +00:00
regis@google.com 2f900dab13 Cache number of type arguments in class object instead of recalculating it.
Reduce size of num_native_fields field in class object.

R=asiva@google.com

Review URL: https://codereview.chromium.org//26682003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28670 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-15 18:31:31 +00:00
srdjan@google.com 2f0a906dbf Cleanups, refactoring in anticipation of new string interpolation nodes. Removed unnecessary code.
R=hausner@google.com

Review URL: https://codereview.chromium.org//27006003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28619 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-14 23:21:52 +00:00
johnmccutchan@google.com 90895e8d39 Forward stores to loads for SIMD arrays
R=srdjan@google.com

Review URL: https://codereview.chromium.org//25809002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28467 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-10 17:43:50 +00:00
fschneider@google.com 30e536845d Fix bug in inlining of []= operators.
When inserting the StoreIndexedInstruction, it needs the
environment of the call attached to it.

BUG=https://code.google.com/p/dart/issues/detail?id=13797
R=kmillikin@google.com

Review URL: https://codereview.chromium.org//25991002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28257 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-04 09:51:27 +00:00
fschneider@google.com 2cff01970b Polymorphic inlining for []= operators.
This CL allows the inliner to do polymorphic inlining of recognized
[]= operators. Before, only monomorphic calls were handled in the
optimizer.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//25411004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28202 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-03 09:43:50 +00:00
srdjan@google.com 07366f0524 Disable string interpolation optimization until fixed.
Review URL: https://codereview.chromium.org//25417003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28176 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-02 18:48:07 +00:00
srdjan@google.com 008229fa11 Optimize string interpolation by running it at compile time if all inputs are constant. This is done during constant propagation, however, the argument construction instructions must be removed manually. It is unclear how safe it is to modify graph during constant propagation.
R=kmillikin@google.com

Review URL: https://codereview.chromium.org//24837002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28175 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-02 17:49:14 +00:00
fschneider@google.com 0b57a04965 Bug fix in load elimination, constant propagation for LoadClassId.
Handle LoadClassId in constant propagation. This helps with eliminating
unreachable code after polymorphic inlining. It exposed a bug which is
also fixed in this CL.

Redefinitions of values have to be considered for load/store forwarding:
Loads/stores to an object defined by a RedefinitionInstr (inserted by
polymorphic inlining) must be treated properly as loads/stores to the
original object.

R=kmillikin@google.com

Review URL: https://codereview.chromium.org//25640004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28159 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-02 13:27:55 +00:00
fschneider@google.com e9f0b93eb1 Revert r28050 due to crashes with --optimization-counter-threshold=5.
TBR=kmillikin@google.com

Review URL: https://codereview.chromium.org//25277002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28052 260f80e4-7a28-3924-810f-c04153c831b5
2013-09-30 14:29:44 +00:00
fschneider@google.com acb389dbf9 Optimize conditional branches that have same true/false targets.
Branches that have the same true/false target, or where both
target blocks reach the same common join block via empty blocks
can be replaced by a goto to the common join block.

In code like this

var a = unknown();
var b = null;
if (a == null || b == null) {
  ...
}

it eliminates the test (a == null) if b is known to be null. Until now,
the compiler could only eliminate the test for b, if a was known.

R=kmillikin@google.com

Review URL: https://codereview.chromium.org//23549020

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@28050 260f80e4-7a28-3924-810f-c04153c831b5
2013-09-30 12:41:28 +00:00