Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

package:crypto Hmac code is around 5-7x slower in AOT #34473

Closed
mraleph opened this issue Sep 15, 2018 · 11 comments
Closed

package:crypto Hmac code is around 5-7x slower in AOT #34473

mraleph opened this issue Sep 15, 2018 · 11 comments
Assignees
Labels
area-vm Use area-vm for VM related issues, including code coverage, FFI, and the AOT and JIT backends.

Comments

@mraleph
Copy link
Member

mraleph commented Sep 15, 2018

I looked at the code and I think there are two main reasons for this:

  • Small helpers are not inlined (e.g. _rotr32(int n, int x) => (x >> n) | ((x << (32 - n)) & mask32); is not inlined) - our AOT compiler is much less eager to inline static methods (basically almost never inlines them for the code size reasons).
  • The code produced for the integer operations is pretty bad even on x64, e.g _rotr32 produces this graph:
  2: B1[target]:0 ParallelMove rbx <- S+2, rdx <- C
  4:     CheckStackOverflow:8()
  6:     CheckNull:12(v4)
  8:     ParallelMove rsi <- S+3
  8:     v25 <- UnboxInt64(v3) [-9223372036854775808, 9223372036854775807] T{_int64}
 10:     ParallelMove rdi <- rbx
 10:     v27 <- UnboxInt64(v4 T{int}) [-9223372036854775808, 9223372036854775807] T{_int64}
 11:     ParallelMove rcx <- rsi
 12:     ParallelMove rdi <- rdi
 12:     v5 <- ShiftInt64Op(>> [tr], v27, v25) [-9223372036854775808, 9223372036854775807] T{_int64}
 14:     v43 <- UnboxedConstant(#32) [32, 32] T{_Smi}
 16:     ParallelMove r8 <- C
 16:     v8 <- BinaryInt64Op(- [tr], v43, v25) [-9223372036854775808, 9223372036854775807] T{_int64}
 18:     ParallelMove rbx <- rbx
 18:     v31 <- UnboxInt64(v4 T{int}) [-9223372036854775808, 9223372036854775807] T{_int64}
 19:     ParallelMove rcx <- r8
 20:     ParallelMove rbx <- rbx
 20:     v10 <- ShiftInt64Op(<< [tr], v31, v8) [-9223372036854775808, 9223372036854775807] T{_int64}
 22:     v37 <- BoxInt64(v10) [-9223372036854775808, 9223372036854775807] T{_int64}
 24:     ParallelMove rcx <- rcx
 24:     v13 <- CheckedSmiOp:22(&, v37 T{_int64}, v12) T{int?}
 26:     CheckNull:26(v13)
 28:     ParallelMove rcx <- rcx
 28:     v39 <- UnboxInt64(v13 T{int}) [-9223372036854775808, 9223372036854775807] T{_int64}
 30:     ParallelMove rdi <- rdi
 30:     v15 <- BinaryInt64Op(| [tr], v5, v39) [-9223372036854775808, 9223372036854775807] T{_int64}
 32:     v41 <- BoxInt64(v15) [-9223372036854775808, 9223372036854775807] T{_int64}
 33:     ParallelMove rax <- rax
 34:     Return:30(v41 T{_int64})

The code below provided by @MariaMelnik

import 'package:crypto/crypto.dart';

int convert(){
  List<int> U_i = [121, -8, 43, -70, 22, -31, -22, -60, -32, 44, 74, -81, 22, -19, 25, 47, -40, 88, 22, -64, -64, -41, 45, 73, -46, 19, 13, 87, -53, 57, -75, -116, 0, 0, 0, 1];
  int c = 10000;
  List<int> password = [66, 97, 115, 115, 103, 64, 49, 57, 49, 57];
  Hmac hmac = Hmac(sha256, password);

  int l = 32;
  for (int i = 1; i <= l; i++) {
    for (int i = 0; i < c; i++) {
      U_i = hmac.convert(U_i).bytes;
    }
  }

  return U_i[0];
}

void main() {
  final sw = new Stopwatch()..start();
  convert();
  print('--> ${sw.elapsedMilliseconds}');
}
╭─vegorov@volhv ~/src/dart/sdk ‹fix-34462›
╰─$ out/ReleaseX64/dart --packages=.packages /tmp/aot.dart                                                              254 ↵
--> 2739
╭─vegorov@volhv ~/src/dart/sdk ‹fix-34462›
╰─$ pkg/vm/tool/precompiler2 --packages=.packages /tmp/aot.dart /tmp/aot.snapshot
╭─vegorov@volhv ~/src/dart/sdk ‹fix-34462›
╰─$ pkg/vm/tool/dart_precompiled_runtime2 /tmp/aot.snapshot
--> 19654

Similar number when running on my Nexus 5X:

╭─vegorov@volhv ~/src/flutter/flutter/examples/hello_world ‹master*›                                                    [1/23]
╰─$ flutter run --release
...
I/flutter (28577): --> 39948
╭─vegorov@volhv ~/src/flutter/flutter/examples/hello_world ‹master*›
╰─$ flutter run --debug
Launching lib/main.dart on Nexus 5X in debug mode...
...
I/flutter (28869): --> 8202

/cc @aartbik might be a good example for the "better integer math" project.

@mraleph mraleph added the area-vm Use area-vm for VM related issues, including code coverage, FFI, and the AOT and JIT backends. label Sep 15, 2018
@aartbik aartbik self-assigned this Sep 17, 2018
@aartbik
Copy link
Contributor

aartbik commented Sep 26, 2018

Runtimes on my desktop

JIT: --> 2323
AOT: --> 13938

The profiles below strongly support mraleph's observations above.
This will be fun to work on!

JIT hot method profile:

  27.55%  dart     jitted-129012-9366.so  [.] *_Sha256Sink@24160809_updateHash                                                
   3.39%  dart     jitted-129012-35.so    [.] _stub_OneArgCheckInlineCache                                                    
   3.21%  dart     jitted-129012-9374.so  [.] *HashSink__iterate@28385876  

AOT hot method profile:

  23.29%  dart_precompile  libb.so                   [.] Precompiled__Sha256Sink_21160809__rotr32_21160809_3885               
  16.40%  dart_precompile  libb.so                   [.] Precompiled____add32_3889                                            
  15.50%  dart_precompile  libb.so                   [.] Precompiled__Sha256Sink_21160809_updateHash_3882                    
   4.25%  dart_precompile  libb.so                   [.] Precompiled__Sha256Sink_21160809__bsig0_21160809_3884               
   3.69%  dart_precompile  libb.so                   [.] Precompiled__Sha256Sink_21160809__bsig1_21160809_3887               
   2.57%  dart_precompile  dart_precompiled_runtime  [.] dart::BootstrapNatives::DN_TypedData_GetUint32                      
   2.57%  dart_precompile  libb.so                   [.] Precompiled__Sha256Sink_21160809__ch_21160809_3886                 
   2.45%  dart_precompile  libb.so                   [.] Precompiled__Sha256Sink_21160809__ssig1_21160809_3890               
   2.14%  dart_precompile  libb.so                   [.] Precompiled__Sha256Sink_21160809__maj_21160809_3883  

@aartbik
Copy link
Contributor

aartbik commented Sep 27, 2018

I wrote some internal microbenchmarks (we already have a few related, but none with Hmac).

JIT
HmacBenchMD5(RunTime): 454.3218873495344 us.
HmacBenchSHA1(RunTime): 508.16337372967484 us.
HmacBenchSHA256(RunTime): 790.9870865954922 us.
AOT
HmacBenchMD5(RunTime): 1759.7643403693933 us.
HmacBenchSHA1(RunTime): 2421.769700968523 us.
HmacBenchSHA256(RunTime): 4732.826756501182 us.

@aartbik
Copy link
Contributor

aartbik commented Sep 27, 2018

With some quick and dirty prototype around inlining and speculation, the performance of AOT improves as follows. Still not JIT, but in some cases already about 2x better than where it was....

JIT --> 2364
AOT --> 7988

JIT
HmacBenchMD5(RunTime): 449.65652045863317 us.
HmacBenchSHA1(RunTime): 490.29337279411754 us.
HmacBenchSHA256(RunTime): 772.3630050193051 us.

AOT
HmacBenchMD5(RunTime): 1117.0341328866555 us.
HmacBenchSHA1(RunTime): 1448.5659869659667 us.
HmacBenchSHA256(RunTime): 2050.995091188525 us.

@aartbik
Copy link
Contributor

aartbik commented Sep 27, 2018

Bit more prototyping brings this down more, over 3x. Of course we will need to balance the heuristics on what work wells overall.

AOT --> 3921

AOT
HmacBenchMD5(RunTime): 1176.1603691945913 us.
HmacBenchSHA1(RunTime): 921.3746089359743 us.
HmacBenchSHA256(RunTime): 1617.9368827809215 us.

dart-bot pushed a commit that referenced this issue Oct 9, 2018
Rationale:
(1) reset loop_info of block entries,
    since recomputing on a modified graph
    may encounter blocks that are no longer headers
(2) replaced O(n) linear scan over loop headers just
    to test membership of the current block with
    an O(1) test
(3) added some comments

#34473

Change-Id: I9e24a76bac9cf0225d8f1c996adfa6d82c175504
Reviewed-on: https://dart-review.googlesource.com/c/78703
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
dart-bot pushed a commit that referenced this issue Oct 12, 2018
Rationale:
Started a more structured implementation of detecting
loops and the loop hierarchy in the Dart flow graph.
This new framework can replace some of the more ad-hoc
approach taken now, as already started in this CL, and
also forms a foundation for more optimizations later.

#34473

Change-Id: I75130cb6863324910e3d068e4f2628c25fdf880c
Reviewed-on: https://dart-review.googlesource.com/c/79147
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
dart-bot pushed a commit that referenced this issue Oct 22, 2018
Rationale:
Rather than relying on a separate loop detector, rely
on the new loop framework, which avoids code duplication
and ensures any improvement in loop detection/handling
will benefit this phase too. Note, most of the time, the
same loops are discovered with a few exceptions (which
is okay, since this is "just" heuristic usage). This CL
also simplifies loop detection a bit.

#34473

Change-Id: I1a1b19b99a698c74822473d2a1fe370287c1ade4
Reviewed-on: https://dart-review.googlesource.com/c/80523
Commit-Queue: Aart Bik <ajcbik@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
@aartbik
Copy link
Contributor

aartbik commented Oct 22, 2018

A loop-based heuristic gives an immediate 2.5x speedup, without resorting to the code size hungry "inline always" heuristic (although we still need to double check that code size increase is acceptable).

JIT --> 2119
AOT --> 5447

Some preliminary experiments on our internal benchmark also look extremely promising!

dart-bot pushed a commit that referenced this issue Oct 24, 2018
Rationale:
Without proper execution counters, the inline AOT inliner
marks every call site "cold", effectively disabling inlining
altogether. This change introduces loop-based static heuristic
that assumes statements nested inside loops are executed more
frequently. This results in more inlining.

Note:
Conservative version is used for now which yields
more performance without increasing code size too much.
There is still a lot of performance left at the table
which we could exploit if we fine tune heuristics
regarding code size.

Bug:
#34473
#32167


Change-Id: I86ba60f93bdab363cd22ab6bdbcf6688f2042fea
Reviewed-on: https://dart-review.googlesource.com/c/81187
Commit-Queue: Aart Bik <ajcbik@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
dart-bot pushed a commit that referenced this issue Oct 24, 2018
This reverts commit daae20d.

Reason for revert: 

The kernel-precomp bots are seeing this error:

../../runtime/vm/object.h: 3134: error: Handle check failed: saw 2249186640 expected Function

Not sure what that is yet, but reverting to get bots green again while I investigate.


Original change's description:
> [vm/compiler] Use loop framework for AOT inline heuristics
> 
> Rationale:
> Without proper execution counters, the inline AOT inliner
> marks every call site "cold", effectively disabling inlining
> altogether. This change introduces loop-based static heuristic
> that assumes statements nested inside loops are executed more
> frequently. This results in more inlining.
> 
> Note:
> Conservative version is used for now which yields
> more performance without increasing code size too much.
> There is still a lot of performance left at the table
> which we could exploit if we fine tune heuristics
> regarding code size.
> 
> Bug:
> #34473
> #32167
> 
> 
> Change-Id: I86ba60f93bdab363cd22ab6bdbcf6688f2042fea
> Reviewed-on: https://dart-review.googlesource.com/c/81187
> Commit-Queue: Aart Bik <ajcbik@google.com>
> Reviewed-by: Alexander Markov <alexmarkov@google.com>

TBR=vegorov@google.com,alexmarkov@google.com,ajcbik@google.com

Change-Id: If5ca82966966ebef4ec0b4e921515d23f6bd492b
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/81335
Reviewed-by: Aart Bik <ajcbik@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
dart-bot pushed a commit that referenced this issue Oct 25, 2018
Rationale:
This makes File/Directory/Link's fromRawPath
equivalent again, and unblocks the pending
loop-based inlining heuristic.

Reverted CL because of this bug:
https://dart-review.googlesource.com/c/sdk/+/81335

#34473
#32167

Change-Id: I769a8365ea32d6f6830d0dd8ef97fc6c2467fb90
Reviewed-on: https://dart-review.googlesource.com/c/81460
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
dart-bot pushed a commit that referenced this issue Oct 25, 2018
This reverts commit 0170b8d.

Reason for revert: 
The underlying problem has been fixed.


Original change's description:
> Revert "[vm/compiler] Use loop framework for AOT inline heuristics"
> 
> This reverts commit daae20d.
> 
> Reason for revert: 
> 
> The kernel-precomp bots are seeing this error:
> 
> ../../runtime/vm/object.h: 3134: error: Handle check failed: saw 2249186640 expected Function
> 
> Not sure what that is yet, but reverting to get bots green again while I investigate.
> 
> 
> Original change's description:
> > [vm/compiler] Use loop framework for AOT inline heuristics
> > 
> > Rationale:
> > Without proper execution counters, the inline AOT inliner
> > marks every call site "cold", effectively disabling inlining
> > altogether. This change introduces loop-based static heuristic
> > that assumes statements nested inside loops are executed more
> > frequently. This results in more inlining.
> > 
> > Note:
> > Conservative version is used for now which yields
> > more performance without increasing code size too much.
> > There is still a lot of performance left at the table
> > which we could exploit if we fine tune heuristics
> > regarding code size.
> > 
> > Bug:
> > #34473
> > #32167
> > 
> > 
> > Change-Id: I86ba60f93bdab363cd22ab6bdbcf6688f2042fea
> > Reviewed-on: https://dart-review.googlesource.com/c/81187
> > Commit-Queue: Aart Bik <ajcbik@google.com>
> > Reviewed-by: Alexander Markov <alexmarkov@google.com>
> 
> TBR=vegorov@google.com,alexmarkov@google.com,ajcbik@google.com
> 
> Change-Id: If5ca82966966ebef4ec0b4e921515d23f6bd492b
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Reviewed-on: https://dart-review.googlesource.com/c/81335
> Reviewed-by: Aart Bik <ajcbik@google.com>
> Commit-Queue: Aart Bik <ajcbik@google.com>

TBR=vegorov@google.com,alexmarkov@google.com,ajcbik@google.com

Change-Id: I8c160f59f8e91782f235cbcea607aef4227963f4
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/81500
Reviewed-by: Aart Bik <ajcbik@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
@aartbik
Copy link
Contributor

aartbik commented Oct 30, 2018

#34969

dart-bot pushed a commit that referenced this issue Nov 8, 2018
Rationale:
Last experiment left some performance at the table
(but for an unacceptable 200% code size increase).
This CL regains that performance for a much better
trade-off of just 8%. Performance gains vary from
10% to 100%, with e.g. 27% for DeltaBlue, 30% for
MD5 and 100% for SHA256). This is obtained by
always inlining byteswaps (to avoid calling into
the runtime when getInts remain) and a bit more
specific tuning of loop based heuristics. This
also fixes a bug in a list lookup.

#34473
#34969
#32167

Change-Id: Id1a64c3930c503546ae2d7f31ca3e597741022bb
Reviewed-on: https://dart-review.googlesource.com/c/82942
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
dart-bot pushed a commit that referenced this issue Nov 8, 2018
This reverts commit 74d2c6a.

Reason for revert: 

../../runtime/vm/compiler/backend/il.cc: 778: error: unreachable code

Original change's description:
> [vm/compiler] Tune AOT inline heuristics
> 
> Rationale:
> Last experiment left some performance at the table
> (but for an unacceptable 200% code size increase).
> This CL regains that performance for a much better
> trade-off of just 8%. Performance gains vary from
> 10% to 100%, with e.g. 27% for DeltaBlue, 30% for
> MD5 and 100% for SHA256). This is obtained by
> always inlining byteswaps (to avoid calling into
> the runtime when getInts remain) and a bit more
> specific tuning of loop based heuristics. This
> also fixes a bug in a list lookup.
> 
> #34473
> #34969
> #32167
> 
> Change-Id: Id1a64c3930c503546ae2d7f31ca3e597741022bb
> Reviewed-on: https://dart-review.googlesource.com/c/82942
> Reviewed-by: Ryan Macnak <rmacnak@google.com>
> Commit-Queue: Aart Bik <ajcbik@google.com>

TBR=vegorov@google.com,kustermann@google.com,rmacnak@google.com,alexmarkov@google.com,ajcbik@google.com

Change-Id: Id0f30f4458a3548af2e573a737e441ca11ae3b11
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/83643
Reviewed-by: Aart Bik <ajcbik@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
dart-bot pushed a commit that referenced this issue Nov 8, 2018
Rationale:
Although not semantically disastrous, list inclusion
was not properly implemented, which yielded some very
hard to debug recompilations (or lack thereof) due
to speculation.

#34473
#34969
#32167

Change-Id: I54613127bd3ab93820d4a467c75e41f3df16ee7a
Reviewed-on: https://dart-review.googlesource.com/c/83883
Reviewed-by: Siva Annamalai <asiva@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
dart-bot pushed a commit that referenced this issue Nov 8, 2018
Rationale:
Always inlining byteswaps avoids calling into
the runtime when getInts remain.

#34473
#34969
#32167

Change-Id: I95c0348fa960e08f973a12a2c5304785e76289b3
Reviewed-on: https://dart-review.googlesource.com/c/83884
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
@a-siva
Copy link
Contributor

a-siva commented Nov 19, 2018

@aartbik you have made significant improvements to the Hmac code, are we still considerably slower? Can the issue be closed?

@aartbik
Copy link
Contributor

aartbik commented Nov 19, 2018

@a-siva let's keep this open; there is still much more we can do (better inlining without codesize increase for one, but even after that better instruction selection); this bug is a nice way to track progress in that area.

@aartbik
Copy link
Contributor

aartbik commented Dec 20, 2018

This is the current status, with some plans on how to go forward:

JIT
--> 2089
AOT
--> 6437

@aartbik
Copy link
Contributor

aartbik commented Jan 10, 2019

Pending CL yields the following results (more than an other 1.8x), which only 3.4% codesize increase on e.g. FlutterGallery. Many other benchmarks speedup substantially as well.

JIT
--> 2062
AOT
--> 3433

dart-bot pushed a commit that referenced this issue Jan 15, 2019
Rationale:
Yields substantial improvements on various benchmarks
(1.8x on HMAC stand-alone, around 5x on TypedData settters and getters),
with only moderate increase in code size (3.2% on Flutter gallery).

#34473
#32167

Change-Id: I0909efd7afc72229524ff8edb7322ce025a14af4
Reviewed-on: https://dart-review.googlesource.com/c/89162
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
@aartbik
Copy link
Contributor

aartbik commented Jan 15, 2019

Closing this issue since the huge gap has been bridged (fine tuning the arithmetic operations is expected to continue of course).

@aartbik aartbik closed this as completed Jan 15, 2019
@aartbik aartbik added this to Done in Modern Dart VM Pipeline via automation Jan 15, 2019
dart-bot pushed a commit that referenced this issue Jan 15, 2019
This reverts commit 2908e61.

Reason for revert: regress_32322_test crashes

Original change's description:
> [vm/compiler] AOT inline heuristics improvements
> 
> Rationale:
> Yields substantial improvements on various benchmarks
> (1.8x on HMAC stand-alone, around 5x on TypedData settters and getters),
> with only moderate increase in code size (3.2% on Flutter gallery).
> 
> #34473
> #32167
> 
> Change-Id: I0909efd7afc72229524ff8edb7322ce025a14af4
> Reviewed-on: https://dart-review.googlesource.com/c/89162
> Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
> Reviewed-by: Alexander Markov <alexmarkov@google.com>
> Commit-Queue: Aart Bik <ajcbik@google.com>

TBR=vegorov@google.com,alexmarkov@google.com,ajcbik@google.com

Change-Id: I9c7dadb18935ad32f4d4cd72872838e8ac9cc288
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/89740
Reviewed-by: Aart Bik <ajcbik@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
dart-bot pushed a commit that referenced this issue Jan 17, 2019
Rationale:
Previously, we avoided introducing redefinitions that
introduced the empty non-nullable null type. This situation
arises when we do a null check on an actual null value
(making all subsequent uses effectively dead code). This
is too simple, however, since it still allows hoisting the
uses before the check. This CL gives a better solution
by introducing redefinitions without a constraining type
(which are not removed and avoid the type). In the long
run perhaps the best solution would be to simply remove
all subsequent uses as dead.

#32167
#34473
#35335

Change-Id: Ib5dd072a9e546f6b91faa52ea08e8c0f6350d7e0
Reviewed-on: https://dart-review.googlesource.com/c/89922
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
dart-bot pushed a commit that referenced this issue Jan 18, 2019
This reverts commit 43a96d4.

Reason for revert: <INSERT REASONING HERE>

Original change's description:
> Revert "[vm/compiler] AOT inline heuristics improvements"
> 
> This reverts commit 2908e61.
> 
> Reason for revert: regress_32322_test crashes
> 
> Original change's description:
> > [vm/compiler] AOT inline heuristics improvements
> > 
> > Rationale:
> > Yields substantial improvements on various benchmarks
> > (1.8x on HMAC stand-alone, around 5x on TypedData settters and getters),
> > with only moderate increase in code size (3.2% on Flutter gallery).
> > 
> > #34473
> > #32167
> > 
> > Change-Id: I0909efd7afc72229524ff8edb7322ce025a14af4
> > Reviewed-on: https://dart-review.googlesource.com/c/89162
> > Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
> > Reviewed-by: Alexander Markov <alexmarkov@google.com>
> > Commit-Queue: Aart Bik <ajcbik@google.com>
> 
> TBR=vegorov@google.com,alexmarkov@google.com,ajcbik@google.com
> 
> Change-Id: I9c7dadb18935ad32f4d4cd72872838e8ac9cc288
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Reviewed-on: https://dart-review.googlesource.com/c/89740
> Reviewed-by: Aart Bik <ajcbik@google.com>
> Commit-Queue: Aart Bik <ajcbik@google.com>

TBR=vegorov@google.com,alexmarkov@google.com,ajcbik@google.com

# Not skipping CQ checks because original CL landed > 1 day ago.

Change-Id: Iace9857654b63af2fbcd2808d19802fb60305973
Reviewed-on: https://dart-review.googlesource.com/c/90141
Reviewed-by: Aart Bik <ajcbik@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-vm Use area-vm for VM related issues, including code coverage, FFI, and the AOT and JIT backends.
Projects
Development

No branches or pull requests

3 participants