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

Failing iOS release builds - Target aot_assembly_release failed: Exception: AOT snapshotter exited with code -11 #82890

Closed
oshtman opened this issue May 19, 2021 · 17 comments
Assignees
Labels
dependency: dart Dart team may need to help us

Comments

@oshtman
Copy link

oshtman commented May 19, 2021

Steps to Reproduce

Hi. Since updating to Flutter > 2.x.x & dart > 2.10.x we have been experiencing issues building our application in release mode for iOS. The build process constantly fails on gen_snapshot_armrv7 when the Dart snapshot generator is running.
Note that the problem only occurs when building for release, debug mode works fine.

Command we use to build in release mode:

flutter build ios --release -t lib/main/main.dart --flavor production --verbose

I'm not sure if this issue belongs in the Flutter project or is related to Dart itself, but let me know if I should file the issue elsewhere.

Logs

Logs

Command on which the build crashes:

~/flutter-sdk/flutter/bin/cache/artifacts/engine/ios-release/gen_snapshot_armv7 --deterministic --snapshot_kind=app-aot-assembly --assembly=~/.dart_tool/flutter_build/38fb175c28ae1bcd6616e87f2782ecae/armv7/snapshot_assembly.S --strip --no-sim-use-hardfp --no-use-integer-division ~/.dart_tool/flutter_build/38fb175c28ae1bcd6616e87f2782ecae/app.dill
 [+10856 ms] Dart snapshot generator failed with exit code -11

Checking what the underlying issue seem to be with lldb yields (running the above gen_snapshot_armv7):

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x7ffeef3ffff8)
    frame #0: 0x00007fff20449d90 libsystem_malloc.dylib`_malloc_zone_malloc + 8
libsystem_malloc.dylib`_malloc_zone_malloc:
->  0x7fff20449d90 <+8>:  pushq  %r13
    0x7fff20449d92 <+10>: pushq  %r12
    0x7fff20449d94 <+12>: pushq  %rbx
    0x7fff20449d95 <+13>: pushq  %rax
Target 0: (gen_snapshot_armv7) stopped.

Running disassemble --frame in lldb yields:

libsystem_malloc.dylib`_malloc_zone_malloc:
    0x7fff20449d88 <+0>:   pushq  %rbp
    0x7fff20449d89 <+1>:   movq   %rsp, %rbp
    0x7fff20449d8c <+4>:   pushq  %r15
    0x7fff20449d8e <+6>:   pushq  %r14
->  0x7fff20449d90 <+8>:   pushq  %r13
    0x7fff20449d92 <+10>:  pushq  %r12
    0x7fff20449d94 <+12>:  pushq  %rbx
    0x7fff20449d95 <+13>:  pushq  %rax
    0x7fff20449d96 <+14>:  movl   %edx, %r14d
    0x7fff20449d99 <+17>:  movq   %rsi, %r12
    0x7fff20449d9c <+20>:  movq   %rdi, %r15
    0x7fff20449d9f <+23>:  movb   0x688162c6(%rip), %r13b   ; malloc_tracing_enabled
    0x7fff20449da6 <+30>:  testb  %r13b, %r13b
    0x7fff20449da9 <+33>:  jne    0x7fff20449e29            ; <+161>
    0x7fff20449dab <+35>:  cmpl   $0x0, 0x688162be(%rip)    ; malloc_medium_space_efficient_enabled + 1
    0x7fff20449db2 <+42>:  jne    0x7fff20449e43            ; <+187>
    0x7fff20449db8 <+48>:  movq   0x5feb6f09(%rip), %rax    ; (void *)0x00007fff88c45db8: vm_kernel_page_size
    0x7fff20449dbf <+55>:  movq   (%rax), %rax
    0x7fff20449dc2 <+58>:  movq   0x5feb6f17(%rip), %rcx    ; (void *)0x00007fff88c45dd0: vm_page_size
    0x7fff20449dc9 <+65>:  movq   (%rcx), %rcx
    0x7fff20449dcc <+68>:  cmpq   %rcx, %rax
    0x7fff20449dcf <+71>:  cmovaq %rax, %rcx
    0x7fff20449dd3 <+75>:  addq   %rcx, %rcx
    0x7fff20449dd6 <+78>:  addq   %r12, %rcx
    0x7fff20449dd9 <+81>:  jae    0x7fff20449df4            ; <+108>
    0x7fff20449ddb <+83>:  testb  $0x1, %r14b
    0x7fff20449ddf <+87>:  je     0x7fff20449df0            ; <+104>
    0x7fff20449de1 <+89>:  movq   %gs:0x8, %rax
    0x7fff20449dea <+98>:  movl   $0xc, (%rax)
    0x7fff20449df0 <+104>: xorl   %ebx, %ebx
    0x7fff20449df2 <+106>: jmp    0x7fff20449e17            ; <+143>
    0x7fff20449df4 <+108>: movq   %r15, %rdi
    0x7fff20449df7 <+111>: movq   %r12, %rsi
    0x7fff20449dfa <+114>: callq  *0x18(%r15)
    0x7fff20449dfe <+118>: movq   %rax, %rbx
    0x7fff20449e01 <+121>: movq   0x68816258(%rip), %rax    ; malloc_logger
    0x7fff20449e08 <+128>: testq  %rax, %rax
    0x7fff20449e0b <+131>: jne    0x7fff20449e65            ; <+221>
    0x7fff20449e0d <+133>: testb  %r13b, %r13b
    0x7fff20449e10 <+136>: jne    0x7fff20449e4d            ; <+197>
    0x7fff20449e12 <+138>: testq  %rbx, %rbx
    0x7fff20449e15 <+141>: je     0x7fff20449ddb            ; <+83>
    0x7fff20449e17 <+143>: movq   %rbx, %rax
    0x7fff20449e1a <+146>: addq   $0x8, %rsp
    0x7fff20449e1e <+150>: popq   %rbx
    0x7fff20449e1f <+151>: popq   %r12
    0x7fff20449e21 <+153>: popq   %r13
    0x7fff20449e23 <+155>: popq   %r14
    0x7fff20449e25 <+157>: popq   %r15
    0x7fff20449e27 <+159>: popq   %rbp
    0x7fff20449e28 <+160>: retq
    0x7fff20449e29 <+161>: movl   $0x33010005, %edi         ; imm = 0x33010005
    0x7fff20449e2e <+166>: movq   %r15, %rsi
    0x7fff20449e31 <+169>: movq   %r12, %rdx
    0x7fff20449e34 <+172>: xorl   %ecx, %ecx
    0x7fff20449e36 <+174>: xorl   %r8d, %r8d
    0x7fff20449e39 <+177>: callq  0x7fff20451e86            ; symbol stub for: kdebug_trace
    0x7fff20449e3e <+182>: jmp    0x7fff20449dab            ; <+35>
    0x7fff20449e43 <+187>: callq  0x7fff20451b10            ; internal_check
    0x7fff20449e48 <+192>: jmp    0x7fff20449db8            ; <+48>
    0x7fff20449e4d <+197>: movl   $0x33010006, %edi         ; imm = 0x33010006
    0x7fff20449e52 <+202>: movq   %r15, %rsi
    0x7fff20449e55 <+205>: movq   %r12, %rdx
    0x7fff20449e58 <+208>: movq   %rbx, %rcx
    0x7fff20449e5b <+211>: xorl   %r8d, %r8d
    0x7fff20449e5e <+214>: callq  0x7fff20451e86            ; symbol stub for: kdebug_trace
    0x7fff20449e63 <+219>: jmp    0x7fff20449e12            ; <+138>
    0x7fff20449e65 <+221>: movl   $0xa, %edi
    0x7fff20449e6a <+226>: movq   %r15, %rsi
    0x7fff20449e6d <+229>: movq   %r12, %rdx
    0x7fff20449e70 <+232>: xorl   %ecx, %ecx
    0x7fff20449e72 <+234>: movq   %rbx, %r8
    0x7fff20449e75 <+237>: xorl   %r9d, %r9d
    0x7fff20449e78 <+240>: callq  *%rax
    0x7fff20449e7a <+242>: jmp    0x7fff20449e0d            ; <+133>

Output running flutter doctor -v

[✓] Flutter (Channel stable, 2.2.0, on macOS 11.2.3 20D91 darwin-x64, locale sv-SE)
    • Flutter version 2.2.0 at /Users/andreasostman/Desktop/swace/flutter-sdk/flutter
    • Framework revision b22742018b (4 days ago), 2021-05-14 19:12:57 -0700
    • Engine revision a9d88a4d18
    • Dart version 2.13.0

[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
    • Android SDK at /Users/andreasostman/Library/Android/sdk
    • Platform android-30, build-tools 29.0.2
    • ANDROID_HOME = /Users/andreasostman/Library/Android/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 12.4, Build version 12D4e
    • CocoaPods version 1.10.1

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 3.5)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 42.1.1
    • Dart plugin version 191.8593
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[✓] VS Code (version 1.56.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.22.0
@oshtman oshtman changed the title Failing release builds - Target aot_assembly_release failed: Exception: AOT snapshotter exited with code -11 Failing iOS release builds - Target aot_assembly_release failed: Exception: AOT snapshotter exited with code -11 May 19, 2021
@mraleph
Copy link
Member

mraleph commented May 19, 2021

Can you print the backtrace (bt command)? This sort of crash looks like a stack overflow.

@oshtman
Copy link
Author

oshtman commented May 19, 2021

thanks for the super quick response. The last couple of lines from the output of bt is (I omitted most of the part that just seem to be repeating):

    frame #71232: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71233: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71234: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71235: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71236: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71237: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71238: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71239: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71240: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71241: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71242: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71243: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71244: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71245: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71246: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71247: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71248: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71249: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71250: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71251: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71252: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71253: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71254: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71255: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71256: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71257: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71258: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71259: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71260: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71261: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71262: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71263: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71264: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71265: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71266: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71267: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71268: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71269: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71270: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71271: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71272: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71273: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71274: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71275: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71276: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71277: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71278: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71279: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71280: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71281: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71282: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71283: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71284: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71285: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71286: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71287: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71288: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71289: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71290: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71291: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71292: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71293: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71294: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71295: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71296: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71297: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71298: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71299: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71300: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71301: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71302: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71303: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71304: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71305: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71306: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71307: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71308: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71309: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71310: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71311: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71312: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71313: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71314: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71315: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71316: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71317: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71318: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71319: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71320: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71321: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71322: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71323: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71324: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71325: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71326: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71327: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71328: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71329: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71330: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71331: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71332: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71333: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71334: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71335: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71336: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71337: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71338: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71339: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71340: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71341: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71342: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71343: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71344: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71345: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71346: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71347: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71348: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71349: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71350: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71351: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71352: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71353: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71354: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71355: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71356: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71357: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71358: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71359: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71360: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71361: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71362: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71363: 0x0000000100140b46 gen_snapshot_armv7`dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) + 2166
    frame #71364: 0x000000010013d8bf gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 303
    frame #71365: 0x000000010013f9d6 gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 518
    frame #71366: 0x000000010044c2df gen_snapshot_armv7`dart::RedefinitionInstr::ComputeType() const + 1263
    frame #71367: 0x000000010044c67f gen_snapshot_armv7`dart::RedefinitionInstr::RecomputeType() + 47
    frame #71368: 0x00000001004493c0 gen_snapshot_armv7`dart::FlowGraphTypePropagator::Propagate(dart::FlowGraph*) + 4688
    frame #71369: 0x000000010046c382 gen_snapshot_armv7`dart::CompilerPass_TypePropagation::DoBody(dart::CompilerPassState*) const + 34
    frame #71370: 0x000000010046ccc2 gen_snapshot_armv7`dart::CompilerPass::Run(dart::CompilerPassState*) const + 162
    frame #71371: 0x00000001003d73a5 gen_snapshot_armv7`dart::CallSiteInliner::TryInlining(dart::Function const&, dart::Array const&, dart::InlinedCallData*, bool) + 10981
    frame #71372: 0x00000001003f13bb gen_snapshot_armv7`dart::FlowGraphInliner::Inline() + 5035
    frame #71373: 0x000000010046c48f gen_snapshot_armv7`dart::CompilerPass_Inlining::DoBody(dart::CompilerPassState*) const + 111
    frame #71374: 0x000000010046ccc2 gen_snapshot_armv7`dart::CompilerPass::Run(dart::CompilerPassState*) const + 162
    frame #71375: 0x000000010046d0c9 gen_snapshot_armv7`dart::CompilerPass::RunPipeline(dart::CompilerPass::PipelineMode, dart::CompilerPassState*) + 169
    frame #71376: 0x00000001003245e4 gen_snapshot_armv7`dart::PrecompileParsedFunctionHelper::Compile(dart::CompilationPipeline*) + 1892
    frame #71377: 0x0000000100323c30 gen_snapshot_armv7`dart::PrecompileFunctionHelper(dart::Precompiler*, dart::CompilationPipeline*, dart::Function const&, bool) + 1792
    frame #71378: 0x0000000100320b0d gen_snapshot_armv7`dart::Precompiler::CompileFunction(dart::Precompiler*, dart::Thread*, dart::Zone*, dart::Function const&) + 333
    frame #71379: 0x0000000100304fe2 gen_snapshot_armv7`dart::Precompiler::DoCompileAll() + 29026
    frame #71380: 0x00000001002fdc98 gen_snapshot_armv7`dart::Precompiler::CompileAll() + 9848
    frame #71381: 0x000000010000d9fe gen_snapshot_armv7`dart::bin::main(int, char**) + 29246
    frame #71382: 0x00007fff20624621 libdyld.dylib`start + 1
    frame #71383: 0x00007fff20624621 libdyld.dylib`start + 1

@mraleph
Copy link
Member

mraleph commented May 19, 2021

Seems like an infinite recursion in the subtyping check somewhere in the code (maybe involves some sort of recursive type parameter bound?).

@crelier Regis, do you have an idea what could have caused this or what additional information we could ask for?

@mraleph mraleph added the dependency: dart Dart team may need to help us label May 19, 2021
@crelier
Copy link
Contributor

crelier commented May 19, 2021

I suspect changes I made in dart-lang/sdk@1f55b7c
Some explicit management of the trail to avoid infinite recursion with recursive type parameter bounds was removed, to rely instead on newly inserted TypeRef nodes (that manage the trail themselves). It is possible that some TypeRefs node are not inserted in all cases where they should be.
It would be useful to see the declaration of type parameters with upper bounds referring back to the type parameters in this application. For example, printing the receiver ('p this->ToCString()') of the methods AbstractType::IsSubtypeOf and TypeParameter::IsEquivalent showing in the stack trace would help.

What I really do not understand is why this crash only happens in release mode and not in debug mode.

@crelier
Copy link
Contributor

crelier commented May 19, 2021

Something that could also be useful to us is passing the flag --trace-type-finalization to the VM and capturing the output.

@oshtman
Copy link
Author

oshtman commented May 19, 2021

Something that could also be useful to us is passing the flag --trace-type-finalization to the VM and capturing the output.

I tested running the command passing in mentioned flag for type finalization, this is the final lines before it exits. Do you need more of the output to make something out of it? Let me know if I can supply any additional info to help

Finalizing type '_ImmutableList@0150898'
Marking type '_ImmutableList@0150898' as finalized
Done finalizing type '_ImmutableList@0150898<dynamic>' with 0 type args: Type: _ImmutableList@0150898
Canonicalizing type '_ImmutableList@0150898<dynamic>'
Done canonicalizing type '_ImmutableList@0150898<dynamic>'
Finalizing type '_ImmutableList@0150898'
Marking type '_ImmutableList@0150898' as finalized
Done finalizing type '_ImmutableList@0150898<dynamic>' with 0 type args: Type: _ImmutableList@0150898
Canonicalizing type '_ImmutableList@0150898<dynamic>'
Done canonicalizing type '_ImmutableList@0150898<dynamic>'
Process 4768 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x7ffeef3ffff8)
    frame #0: 0x000000010013f7ef gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf(dart::AbstractType const&, dart::Heap::Space, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 31
gen_snapshot_armv7`dart::AbstractType::IsSubtypeOf:
->  0x10013f7ef <+31>: movq   %rcx, -0x48(%rbp)
    0x10013f7f3 <+35>: movq   0x8(%rdi), %rax
    0x10013f7f7 <+39>: movb   $0x1, %r14b
    0x10013f7fa <+42>: cmpq   0x8(%rsi), %rax
Target 0: (gen_snapshot_armv7) stopped.

@crelier
Copy link
Contributor

crelier commented May 19, 2021

Thanks for trying this! Unfortunately, we would need the whole trace to try to pinpoint the problematic type parameters. This would be too large to paste in this report. That's probably not a good idea.

I do not know how large is your source, but you may be able to guess what type parameter declaration is causing the issue. It is most likely a type parameter with an extends clause which directly or indirectly refers to the same type parameter. Of course, we support such recursive declarations; the dart sdk and flutter sources contain many of those. Something must be different in your own source.

When you used bt to get a stack trace, where you in gdb? If so, if you could walk up a few frames (e.g. up 10) to be in the frame of TypeParameter::IsEquivalent and print the receiver p this->ToCString(), that would be most helpful.

@oshtman
Copy link
Author

oshtman commented May 20, 2021

Thanks for trying this! Unfortunately, we would need the whole trace to try to pinpoint the problematic type parameters. This would be too large to paste in this report. That's probably not a good idea.

I do not know how large is your source, but you may be able to guess what type parameter declaration is causing the issue. It is most likely a type parameter with an extends clause which directly or indirectly refers to the same type parameter. Of course, we support such recursive declarations; the dart sdk and flutter sources contain many of those. Something must be different in your own source.

When you used bt to get a stack trace, where you in gdb? If so, if you could walk up a few frames (e.g. up 10) to be in the frame of TypeParameter::IsEquivalent and print the receiver p this->ToCString(), that would be most helpful.
Alright, got it. Our source is not enormous and we have ~20 type parameter definitions using extends with references to the same type parameters, I'll get to investigating which one of these definitions might be causing the problem.

I was using lldb. Forgive my somewhat limited knowledge of debuggers but is there an equivalent command to be run using lldb?
I attempted to run gdb but am unsure from where to load symbols for gdb to use:

#12 0x000000010013d8bf in dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const ()
(gdb) p this->ToCString()
No symbol table is loaded.  Use the "file" command.

@mraleph
Copy link
Member

mraleph commented May 20, 2021

What I really do not understand is why this crash only happens in release mode and not in debug mode.

I can be that offending function is never optimised or it can be that some AOT transformation does something wrong to the input Kernel file which causes this to happen.

@oshtman I think gen_snapshot_armv7 is stripped so you would not be able to evaluate expressions directly. We could provide you with some instructions on how to dig through raw memory, but I think there is another way to try. Try running gen_snapshot_armv7 with --print-flow-graph --trace-inling (you can remove --trace-type-finalization). This should produce gigantic output, but if you look at the last bits of output there will be a line Callee graph for inlining ... (unoptimized) - that the function on which compiler breaks. We would need to look at that graph.

@oshtman
Copy link
Author

oshtman commented May 20, 2021

Alright. I've added the output of running with said flags which yields:

Output
  Callee graph for inlining dart:async__Future@4048458__Future@4048458. (unoptimized)
  ==== dart:async__Future@4048458__Future@4048458. (Constructor)
  B0[graph]:0 {
        v50 <- Constant(#null)
        v51 <- Constant(#<optimized out>)
        v55 <- Constant(#0)
  }
  B9[function entry]:2 {
        v52 <- Parameter(0)
        v53 <- Parameter(0) T{_Future}
  }
      StoreInstanceField(v53 . _state@4048458 = v55, NoStoreBarrier)
      v56 <- StaticCall:10( get:_current@4048458<0> )
      StoreInstanceField(v53 . _zone@4048458 = v56)
      StaticCall:12( Object.<0> v53, recognized_kind = ObjectConstructor)
      Return:14(v50)
  Callee graph for inlining dart:async__Future@4048458__Future@4048458. (optimized)
  ==== dart:async__Future@4048458__Future@4048458. (Constructor)
  B0[graph]:0 {
        v50 <- Constant(#null) T{Null?}
        v51 <- Constant(#<optimized out>)
        v55 <- Constant(#0) T{_Smi}
  }
  B9[function entry]:2 {
        v52 <- Parameter(0)
        v53 <- Parameter(0) T{_Future}
  }
      StoreInstanceField(v53 . _state@4048458 = v55, NoStoreBarrier)
      v56 <- StaticCall:10( get:_current@4048458<0> ) T{_Zone?}
      StoreInstanceField(v53 . _zone@4048458 = v56)
      Return:14(v50)
       Success
         with reason AlwaysInline, code size 6, call sites: 0
    => _asyncThenWrapperHelper (deopt count 0)
  Callee graph for inlining dart:async_::__asyncThenWrapperHelper@4048458 (unoptimized)
  ==== dart:async_::__asyncThenWrapperHelper@4048458 (RegularFunction)
  B0[graph]:0 {
        v58 <- Constant(#null)
        v59 <- Constant(#<optimized out>)
        v65 <- Constant(#Instance of '_RootZone')
        v68 <- Constant(#Instance of '_RegisterUnaryZoneFunction')
  }
  B12[function entry]:2 {
        v60 <- Parameter(0)
        v61 <- Parameter(0) T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*?}
  }
      v63 <- StaticCall:10( get:_current@4048458<0> )
      Branch if StrictCompare:12(===, v63, v65, with number check) goto (16, 14)
  B16[target]:28
      goto:30 B15
  B14[target]:24
      v66 <- InstanceCall:16( get:_registerUnaryCallback@4048458<0>, v63 IC[0: ], result_type = T{_RegisterUnaryZoneFunction})
      StaticCall:18( get:_registerUnaryCallback@4048458<0> v65, result_type = T{_RegisterUnaryZoneFunction})
      Branch if StrictCompare:20(===, v66, v68, with number check) goto (17, 18)
  B17[target]:32
      goto:34 B15
  B15[join]:26 pred(B16, B17)
      Return:36(v61)
  B18[target]:38
      v69 <- InstanceCall:40( registerUnaryCallback<2>, v58, v63, v61 IC[0: ])
      Return:42(v69)
  Callee graph for inlining dart:async_::__asyncThenWrapperHelper@4048458 (optimized)
  ==== dart:async_::__asyncThenWrapperHelper@4048458 (RegularFunction)
  B0[graph]:0 {
        v58 <- Constant(#null) T{Null?}
        v59 <- Constant(#<optimized out>)
        v65 <- Constant(#Instance of '_RootZone') T{_RootZone}
        v68 <- Constant(#Instance of '_RegisterUnaryZoneFunction') T{_RegisterUnaryZoneFunction}
  }
  B12[function entry]:2 {
        v60 <- Parameter(0)
        v61 <- Parameter(0) T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*?}
  }
      v63 <- StaticCall:10( get:_current@4048458<0> ) T{_Zone?}
      Branch if StrictCompare:12(===, v63, v65) goto (16, 14)
  B16[target]:28
      goto:30 B15
  B14[target]:24
      v66 <- InstanceCall:16( get:_registerUnaryCallback@4048458<0>, v63 IC[0: ], result_type = T{_RegisterUnaryZoneFunction}) T{_RegisterUnaryZoneFunction}
      v71 <- Redefinition(v63 ^ T{_Zone}) T{_Zone}
      StaticCall:18( get:_registerUnaryCallback@4048458<0> v65, result_type = T{_RegisterUnaryZoneFunction})
      Branch if StrictCompare:20(===, v66, v68) goto (17, 18)
  B17[target]:32
      goto:34 B15
  B15[join]:26 pred(B16, B17)
      Return:36(v61)
  B18[target]:38
      v69 <- PolymorphicInstanceCall:40( registerUnaryCallback<2>, v58, v71 T{_Zone}, v61 Targets[2: _RootZone@4048458 cid 4797 cnt:1 trgt:'_RootZone@4048458.registerUnaryCallback' | _CustomZone@4048458 cid 4798 cnt:1 trgt:'_CustomZone@4048458.registerUnaryCallback'] COMPLETE) T{*?}
      Return:42(v69 T{*?})
       Bailout: heuristics (no small leaf)
    => _asyncErrorWrapperHelper (deopt count 0)
  Callee graph for inlining dart:async_::__asyncErrorWrapperHelper@4048458 (unoptimized)
  ==== dart:async_::__asyncErrorWrapperHelper@4048458 (RegularFunction)
  B0[graph]:0 {
        v58 <- Constant(#null)
        v59 <- Constant(#<optimized out>)
        v67 <- Constant(#Function 'errorCallback': static.)
        v70 <- Constant(#Instance of '_RootZone')
        v73 <- Constant(#Instance of '_RegisterBinaryZoneFunction')
        v74 <- Constant(#TypeArguments: (H1ff4262f) [Type: dynamic] [Type: Object] [Type: StackTrace])
  }
  B12[function entry]:2 {
        v60 <- Parameter(0)
        v61 <- Parameter(0) T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*?}
  }
      v63 <- AllocateContext:10(1)
      StoreInstanceField(v63 . Context.parent = v58)
      StoreInstanceField(v63 . continuation = v61)
      v65 <- AllocateObject:12(_Closure)
      StoreInstanceField(v65 . Closure.function_type_arguments = v58, NoStoreBarrier)
      StoreInstanceField(v65 . Closure.function = v67, NoStoreBarrier)
      StoreInstanceField(v65 . Closure.context = v63)
      v68 <- StaticCall:14( get:_current@4048458<0> )
      Branch if StrictCompare:16(===, v68, v70, with number check) goto (16, 14)
  B16[target]:32
      goto:34 B15
  B14[target]:28
      v71 <- InstanceCall:20( get:_registerBinaryCallback@4048458<0>, v68 IC[0: ], result_type = T{_RegisterBinaryZoneFunction})
      StaticCall:22( get:_registerBinaryCallback@4048458<0> v70, result_type = T{_RegisterBinaryZoneFunction})
      Branch if StrictCompare:24(===, v71, v73, with number check) goto (17, 18)
  B17[target]:36
      goto:38 B15
  B15[join]:30 pred(B16, B17)
      Return:40(v65)
  B18[target]:42
      v75 <- InstanceCall:44( registerBinaryCallback<3>, v74, v68, v65 IC[0: ])
      Return:46(v75)
  Callee graph for inlining dart:async_::__asyncErrorWrapperHelper@4048458 (optimized)
  ==== dart:async_::__asyncErrorWrapperHelper@4048458 (RegularFunction)
  B0[graph]:0 {
        v58 <- Constant(#null) T{Null?}
        v59 <- Constant(#<optimized out>)
        v67 <- Constant(#Function 'errorCallback': static.) T{Function}
        v70 <- Constant(#Instance of '_RootZone') T{_RootZone}
        v73 <- Constant(#Instance of '_RegisterBinaryZoneFunction') T{_RegisterBinaryZoneFunction}
        v74 <- Constant(#TypeArguments: (H1ff4262f) [Type: dynamic] [Type: Object] [Type: StackTrace]) T{TypeArguments}
  }
  B12[function entry]:2 {
        v60 <- Parameter(0)
        v61 <- Parameter(0) T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*?}
  }
      v63 <- AllocateContext:10(1) T{Context}
      StoreInstanceField(v63 . continuation = v61)
      v65 <- AllocateObject:12(_Closure) T{_Closure}
      StoreInstanceField(v65 . Closure.function = v67, NoStoreBarrier)
      StoreInstanceField(v65 . Closure.context = v63)
      v68 <- StaticCall:14( get:_current@4048458<0> ) T{_Zone?}
      Branch if StrictCompare:16(===, v68, v70) goto (16, 14)
  B16[target]:32
      goto:34 B15
  B14[target]:28
      v71 <- InstanceCall:20( get:_registerBinaryCallback@4048458<0>, v68 IC[0: ], result_type = T{_RegisterBinaryZoneFunction}) T{_RegisterBinaryZoneFunction}
      v77 <- Redefinition(v68 ^ T{_Zone}) T{_Zone}
      StaticCall:22( get:_registerBinaryCallback@4048458<0> v70, result_type = T{_RegisterBinaryZoneFunction})
      Branch if StrictCompare:24(===, v71, v73) goto (17, 18)
  B17[target]:36
      goto:38 B15
  B15[join]:30 pred(B16, B17)
      Return:40(v65)
  B18[target]:42
      v75 <- PolymorphicInstanceCall:44( registerBinaryCallback<3>, v74, v77 T{_Zone}, v65 Targets[2: _RootZone@4048458 cid 4797 cnt:1 trgt:'_RootZone@4048458.registerBinaryCallback' | _CustomZone@4048458 cid 4798 cnt:1 trgt:'_CustomZone@4048458.registerBinaryCallback'] COMPLETE) T{*?}
      Return:46(v75 T{*?})
       Bailout: heuristics (no small leaf)
    Closure Calls (1)
       Bailout: non-closure operator
    Depth 2 ----------
    Polymorphic Instance Calls (0)
    Static Calls (1)
    => Zone._current (deopt count 0)
  Callee graph for inlining dart:async_Zone_get__current@4048458 (unoptimized)
  ==== dart:async_Zone_get__current@4048458 (ImplicitStaticGetter)
  B0[graph]:0 {
        v58 <- Constant(#null)
        v59 <- Constant(#<optimized out>)
  }
  B12[function entry]:2
      v60 <- LoadStaticField:4(_current@4048458, CallsInitializer)
      Return:6(v60)
  Callee graph for inlining dart:async_Zone_get__current@4048458 (optimized)
  ==== dart:async_Zone_get__current@4048458 (ImplicitStaticGetter)
  B0[graph]:0 {
        v58 <- Constant(#null)
        v59 <- Constant(#<optimized out>)
  }
  B12[function entry]:2
      v60 <- LoadStaticField:4(_current@4048458, CallsInitializer) T{_Zone?}
      Return:6(v60)
       Success
         with reason AlwaysInline, code size 2, call sites: 0
    Closure Calls (0)
  Inlining growth factor: 0.250000
  After Inlining of package:my_app/collections/collection.dart__Collection&CollectionBase&RepositoryBloc@1429312951_disposeRepositoryElement
  ==== package:my_app/collections/collection.dart__Collection&CollectionBase&RepositoryBloc@1429312951_disposeRepositoryElement (RegularFunction)
  B0[graph]:0 {
        v0 <- Constant(#null) T{Null?}
        v4 <- Constant(#<optimized out>)
        v10 <- Constant(#0) T{_Smi}
        v23 <- Constant(#TypeArguments: (H69d429) [Type: void]) T{TypeArguments}
        v26 <- Constant(#false) T{bool}
        v29 <- Constant(#Function ':async_op':.) T{Function}
        v44 <- Constant(#true) T{bool}
        v47 <- Constant(#TypeArguments: (H347146b) [Type: RepositoryElement*]) T{TypeArguments}
  }
  B1[function entry]:2 {
        v2 <- Parameter(0) T{_Collection&CollectionBase&RepositoryBloc<T*>}
        v3 <- Parameter(1) T{M*?}
        v4 <- Constant(#<optimized out>)
        v6 <- SpecialParameter(ArgDescriptor) T{_ImmutableList}
  }
      v8 <- LoadField(v6 . ArgumentsDescriptor.type_args_len {final}) T{_Smi}
      Branch if StrictCompare:4(===, v8, v10) goto (2, 3)
  B2[target]:8
      goto:14 B4
  B3[target]:10
      v11 <- LoadField(v6 . ArgumentsDescriptor.size {final}) T{_Smi}
      v13 <- LoadIndexedUnsafe(fp[v11 + 8]) T{TypeArguments?}
      goto:16 B4
  B4[join]:12 pred(B2, B3) {
        v15 <- phi(v0, v13) alive T{TypeArguments?}
  }
      goto:20 B5
  B5[join]:18 pred(B4)
      CheckStackOverflow:22(stack=0, loop=0)
      v17 <- AllocateContext:24(8) T{Context}
      StoreInstanceField(v17 . Context.parent = v0)
      StoreInstanceField(v17 . this = v2)
      StoreInstanceField(v17 . data = v3)
      v19 <- LoadField(v6 . ArgumentsDescriptor.type_args_len {final}) T{_Smi}
      Branch if StrictCompare:26(===, v19, v10) goto (6, 7)
  B6[target]:30
      goto:36 B8
  B7[target]:32
      goto:38 B8
  B8[join]:34 pred(B6, B7) {
        v21 <- phi(v47, v15) alive T{TypeArguments?}
  }
      v24 <- AllocateObject:40(_Future, v23) T{_Future}
      StoreInstanceField(v24 . _state@4048458 = v10, NoStoreBarrier)
      v60 <- LoadStaticField:4(_current@4048458, CallsInitializer) T{_Zone?}
      StoreInstanceField(v24 . _zone@4048458 = v60 T{_Zone?})
      StoreInstanceField(v17 . :async_future = v24)
      StoreInstanceField(v17 . :is_sync = v26)
      StoreInstanceField(v17 . :return_value = v0)
      StoreInstanceField(v17 . :await_jump_var = v10)
      StoreInstanceField(v17 . :await_ctx_var = v0)
      v27 <- AllocateObject:44(_Closure) T{_Closure}
      StoreInstanceField(v27 . Closure.function_type_arguments = v21)
      StoreInstanceField(v27 . Closure.function = v29, NoStoreBarrier)
      StoreInstanceField(v27 . Closure.context = v17)
      StoreInstanceField(v17 . :async_op = v27)
      v30 <- LoadField(v17 . :async_op) T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*?}
      v32 <- StaticCall:46( _asyncThenWrapperHelper@4048458<0> v30)
      v34 <- LoadField(v17 . :async_op) T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*?}
      v36 <- StaticCall:48( _asyncErrorWrapperHelper@4048458<0> v34)
      v38 <- LoadField(v17 . :async_op) T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*?}
      v48 <- CheckNull:50(v38, NoSuchMethodError) T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*}
      v40 <- LoadField(v48 T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*} . Closure.function {final}) T{Function}
      v42 <- ClosureCall:52( function=v40<0>, v48 T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*} using unchecked entrypoint)
      StoreInstanceField(v17 . :is_sync = v44)
      v45 <- LoadField(v17 . :async_future {final}) T{_Future<void>*?}
      Return:54(v45)
  *** BEGIN CFG
  After AllocateRegisters
  ==== package:my_app/collections/collection.dart__Collection&CollectionBase&RepositoryBloc@1429312951_disposeRepositoryElement (RegularFunction)
    0: B0[graph]:0 {
        v0 <- Constant(#null) T{Null?}
        v4 <- Constant(#<optimized out>) T{_OneByteString}
        v10 <- Constant(#0) [0, 0] T{_Smi}
        v23 <- Constant(#TypeArguments: (H69d429) [Type: void]) T{TypeArguments}
        v26 <- Constant(#false) T{bool}
        v29 <- Constant(#Function ':async_op':.) T{Function}
        v44 <- Constant(#true) T{bool}
        v47 <- Constant(#TypeArguments: (H347146b) [Type: RepositoryElement*]) T{TypeArguments}
  }
    2: B1[function entry]:2
  ParallelMove r0 <- C {
        v2 <- Parameter(0) T{_Collection&CollectionBase&RepositoryBloc<T*>}
        v3 <- Parameter(1) T{M*?}
        v4 <- Constant(#<optimized out>) T{_OneByteString}
        v6 <- SpecialParameter(ArgDescriptor) T{_ImmutableList}
  }
    4:     ParallelMove r1 <- r4
    4:     v8 <- LoadField(v6 . ArgumentsDescriptor.type_args_len {final}) [0, 1073741823] T{_Smi}
    5:     ParallelMove S-2 <- r2
    6:     Branch if StrictCompare:4(===, v8, v10) goto (2, 3)
    8: B2[target]:8
   10:     ParallelMove r4 <- C goto:14 B5
   12: B3[target]:10
   14:     v11 <- LoadField(v6 . ArgumentsDescriptor.size {final}) [0, 1073741823] T{_Smi}
   16:     v13 <- LoadIndexedUnsafe(fp[v11 + 8]) T{TypeArguments?}
   18:     ParallelMove r4 <- r1 goto:16 B5
   20: B5[join]:12 pred(B2, B3) {
        v15 <- phi(v0, v13) alive T{TypeArguments?}
  } ParallelMove r3 <- S+3, r1 <- S+2
   21:     ParallelMove S-1 <- r4
   22:     CheckStackOverflow:22(stack=0, loop=0)
   24:     v17 <- AllocateContext:24(8) T{Context}
   25:     ParallelMove r1 <- r0, r0 <- S+3
   26:     ParallelMove S-5 <- r1
   26:     StoreInstanceField(v17 . this = v2, NoStoreBarrier)
   27:     ParallelMove r0 <- S+2
   28:     StoreInstanceField(v17 . data = v3, NoStoreBarrier)
   29:     ParallelMove r2 <- S-2, r0 <- C
   30:     Branch if StrictCompare:26(===, v8, v10) goto (6, 7)
   32: B6[target]:30
   34:     ParallelMove r2 <- C goto:36 B8
   36: B7[target]:32
   38:     ParallelMove r2 <- S-1 goto:38 B8
   40: B8[join]:34 pred(B6, B7) {
        v21 <- phi(v47, v15) alive T{TypeArguments?}
  }
   41:     ParallelMove S-1 <- r2
   42:     (v62, v63) <- UnboxInt64(v10) [0, 0] T{int}
   43:     ParallelMove r3 <- C, S-3 <- r6, S-4 <- r4
   44:     v24 <- AllocateObject:40(_Future, v23) T{_Future}
   45:     ParallelMove r2 <- r0, r1 <- S-3, r0 <- S-4
   46:     ParallelMove S-2 <- r2
   46:     StoreInstanceField(v24 . _state@4048458 = (v62, v63) T{_Smi}, NoStoreBarrier)
   48:     v60 <- LoadStaticField:4(_current@4048458, CallsInitializer) T{_Zone?}
   49:     ParallelMove r1 <- r0, r0 <- S-2
   50:     StoreInstanceField(v24 . _zone@4048458 = v60 T{_Zone?}, NoStoreBarrier)
   51:     ParallelMove r1 <- S-5
   52:     StoreInstanceField(v17 . :async_future = v24, NoStoreBarrier)
   54:     StoreInstanceField(v17 . :is_sync = v26, NoStoreBarrier)
   56:     StoreInstanceField(v17 . :return_value = v0, NoStoreBarrier)
   58:     StoreInstanceField(v17 . :await_jump_var = v10, NoStoreBarrier)
   60:     StoreInstanceField(v17 . :await_ctx_var = v0, NoStoreBarrier)
   62:     v27 <- AllocateObject:44(_Closure) T{_Closure}
   63:     ParallelMove r1 <- r0, r0 <- S-1
   64:     StoreInstanceField(v27 . Closure.function_type_arguments = v21, NoStoreBarrier)
   66:     StoreInstanceField(v27 . Closure.function = v29, NoStoreBarrier)
   67:     ParallelMove r0 <- S-5
   68:     StoreInstanceField(v27 . Closure.context = v17, NoStoreBarrier)
   70:     StoreInstanceField(v17 . :async_op = v27, NoStoreBarrier)
   72:     PushArgument(v27)
   74:     v32 <- StaticCall:46( _asyncThenWrapperHelper@4048458<0> v27) T{(dynamic, dynamic) => dynamic?}
   75:     ParallelMove r0 <- S-5
   76:     v34 <- LoadField(v17 . :async_op) T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*?}
   78:     PushArgument(v34)
   80:     v36 <- StaticCall:48( _asyncErrorWrapperHelper@4048458<0> v34) T{(dynamic, Object, StackTrace) => dynamic?}
   81:     ParallelMove r1 <- S-5
   82:     v38 <- LoadField(v17 . :async_op) T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*?}
   84:     CheckNull:50(v38, NoSuchMethodError) T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*}
   86:     v40 <- LoadField(v38 T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*} . Closure.function {final}) T{Function}
   88:     PushArgument(v38 T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*})
   89:     ParallelMove r0 <- r2
   90:     v42 <- ClosureCall:52( function=v40<0>, v38 T{((dynamic, [dynamic, dynamic, StackTrace*]) => dynamic)*} using unchecked entrypoint) T{*?}
   91:     ParallelMove r1 <- S-5
   92:     StoreInstanceField(v17 . :is_sync = v44)
   93:     ParallelMove r0 <- S-2
   94:     Return:54(v24)
  *** END CFG
  Inlining calls in RepositoryBloc.disposeRepositoryElement
  Before Inlining of package:my_app/collections/collection.dart__Collection&CollectionBase&RepositoryBloc@1429312951_disposeRepositoryElement__async_op
  ==== package:my_app/collections/collection.dart__Collection&CollectionBase&RepositoryBloc@1429312951_disposeRepositoryElement__async_op (ClosureFunction)
  B0[graph]:0 {
        v0 <- Constant(#null) T{Null?}
        v1 <- Constant(#<optimized out>)
        v27 <- Constant(#1) T{_Smi}
        v34 <- Constant(#true) T{bool}
        v59 <- Constant(#TypeArguments: (H14c196da) [TypeParameter: M*; bound: RepositoryElement<M*>*]) T{TypeArguments}
        v72 <- Constant(#2) T{_Smi}
        v77 <- Constant(#3) T{_Smi}
  }
  B1[function entry]:2 {
        v21 <- SpecialParameter(ArgDescriptor) T{_ImmutableList}
  }
      v23 <- LoadField(v21 . ArgumentsDescriptor.positional_count {final})
      v25 <- LoadField(v21 . ArgumentsDescriptor.count {final}) T{_Smi}
      v28 <- BinarySmiOp:4(- [tr], v25, v27) T{_Smi}
      v30 <- LoadIndexedUnsafe(fp[v28 + 8]) T{*?}
      v32 <- RelationalOp:6(<=, v27, v28) T{bool}
      Branch if StrictCompare:8(===, v32, v34) goto (2, 3)
  B2[target]:12
      v70 <- LoadIndexedUnsafe(fp[v28 + 4]) T{*?}
      v73 <- RelationalOp:20(<=, v72, v28) T{bool}
      Branch if StrictCompare:22(===, v73, v34) goto (5, 6)
  B5[target]:26
      v75 <- LoadIndexedUnsafe(fp[v28 + 0]) T{*?}
      v78 <- RelationalOp:36(<=, v77, v28) T{bool}
      Branch if StrictCompare:38(===, v78, v34) goto (8, 9)
  B8[target]:42
      v80 <- LoadIndexedUnsafe(fp[v28 + -4]) T{*?}
      goto:52 B10
  B9[target]:44
      goto:46 B7
  B6[target]:28
      goto:30 B4
  B3[target]:14
      goto:18 B4
  B4[join]:16 pred(B3, B6) {
        v35 <- phi(v0, v70) alive T{*?}
  }
      goto:34 B7
  B7[join]:32 pred(B4, B9) {
        v37 <- phi(v35, v70) alive T{*?}
        v39 <- phi(v0, v75) alive T{*?}
  }
      goto:50 B10
  B10[join]:48 pred(B7, B8) {
        v41 <- phi(v37, v70) alive T{*?}
        v43 <- phi(v39, v75) alive T{*?}
        v45 <- phi(v0, v80) alive T{*?}
  }
      v47 <- LoadField(v30 . Closure.context {final}) T{Context}
      goto:56 B11
  B11[join]:54 pred(B10)
      CheckStackOverflow:58(stack=0, loop=0)
      v49 <- LoadField(v30 . Closure.function_type_arguments {final}) T{TypeArguments?}
      goto:62 B12
  B12[join try_idx 0]:60 pred(B11)
      v51 <- StaticCall:66( Repository.<0> v0, result_type = T{Repository?}) T{Repository?}
      v53 <- LoadField(v47 . data) T{M*?}
      v55 <- LoadField(v47 . this) T{_Collection&CollectionBase&RepositoryBloc<T*>?}
      v57 <- StaticCall:68( get:listenerKey<0> v55) T{String*?}
      v60 <- InstantiateTypeArguments:70(v59, instantiator_type_args(v0), function_type_args(v49), instantiator_class(Library:'package:my_app/collections/collection.dart' Class: _Collection&CollectionBase&RepositoryBloc@1429312951)) T{*?}
      v82 <- CheckNull:72(v51, NoSuchMethodError) T{Repository}
      v62 <- StaticCall:74( close<1> v60, v82 T{Repository}, v53, v57, using unchecked entrypoint, result_type = T{??})
      v64 <- LoadField(v47 . :async_future {final}) T{_Future<void>*?}
      v66 <- LoadField(v47 . :return_value) T{void?}
      v68 <- LoadField(v47 . :is_sync) T{bool*?}
      StaticCall:76( _completeOnAsyncReturn@4048458<0> v64, v66, v68)
      Return:78(v0)
  B14[target catch try_idx -1 catch_try_idx 0] {
        v2 <- Parameter(0)
        v3 <- Parameter(1)
        v4 <- Parameter(2)
        v5 <- Parameter(3)
        v6 <- Parameter(4)
        v7 <- Parameter(5)
        v8 <- Parameter(6)
        v9 <- Parameter(7) T{*?}
        v10 <- SpecialParameter(Exception) T{*}
        v11 <- SpecialParameter(StackTrace) T{*?}
        v12 <- Parameter(10)
        v13 <- Parameter(11)
        v14 <- Parameter(12)
        v15 <- Parameter(13)
        v16 <- Parameter(14)
  }
      v17 <- LoadField(v9 . :async_future {final}) T{_Future<void>*?}
      v19 <- LoadField(v9 . :is_sync) T{bool*?}
      StaticCall:84( _completeOnAsyncError@4048458<0> v17, v10, v11, v19)
      goto:86 B13
  B13[join]:64 pred(B14)
      Return:88(v0)
    Depth 1 ----------
    Polymorphic Instance Calls (0)
    Static Calls (5)
    => _completeOnAsyncError (deopt count 0)
  Callee graph for inlining dart:async_::__completeOnAsyncError@4048458 (unoptimized)
  ==== dart:async_::__completeOnAsyncError@4048458 (RegularFunction)
  B0[graph]:0 {
        v84 <- Constant(#null)
        v85 <- Constant(#<optimized out>)
        v98 <- Constant(#true)
  }
  B15[function entry]:2 {
        v86 <- Parameter(0)
        v87 <- Parameter(1)
        v88 <- Parameter(2)
        v89 <- Parameter(3)
        v90 <- Parameter(0) T{_Future<void>*?}
        v92 <- Parameter(1) T{*}
        v94 <- Parameter(2) T{*?}
        v96 <- Parameter(3) T{bool*?}
  }
      AssertBoolean:10(v96)
      Branch if StrictCompare:12(!==, v96, v98) goto (17, 18)
  B17[target]:16
      CheckNull:18(v90, NoSuchMethodError)
      v101 <- StaticCall:20( _asyncCompleteError@4048458<0> v90, v92, v94, using unchecked entrypoint, result_type = T{??})
      goto:30 B19
  B18[target]:22
      CheckNull:24(v90, NoSuchMethodError)
      v99 <- StaticCall:26( _completeError@4048458<0> v90, v92, v94, using unchecked entrypoint, result_type = T{??})
      goto:32 B19
  B19[join]:28 pred(B17, B18)
      Return:34(v84)
  Callee graph for inlining dart:async_::__completeOnAsyncError@4048458 (optimized)
  ==== dart:async_::__completeOnAsyncError@4048458 (RegularFunction)
  B0[graph]:0 {
        v84 <- Constant(#null) T{Null?}
        v85 <- Constant(#<optimized out>)
        v98 <- Constant(#true) T{bool}
  }
  B15[function entry]:2 {
        v86 <- Parameter(0)
        v87 <- Parameter(1)
        v88 <- Parameter(2)
        v89 <- Parameter(3)
        v90 <- Parameter(0) T{_Future<void>*?}
        v92 <- Parameter(1) T{*}
        v94 <- Parameter(2) T{*?}
        v96 <- Parameter(3) T{bool*?}
  }
      AssertBoolean:10(v96)
      Branch if StrictCompare:12(!==, v96 T{bool}, v98) goto (17, 18)
  B17[target]:16
      v105 <- CheckNull:18(v90, NoSuchMethodError) T{_Future<void>*}
      v101 <- StaticCall:20( _asyncCompleteError@4048458<0> v105 T{_Future<void>*}, v92, v94, using unchecked entrypoint, result_type = T{??})
      goto:30 B19
  B18[target]:22
      v103 <- CheckNull:24(v90, NoSuchMethodError) T{_Future<void>*}
      v99 <- StaticCall:26( _completeError@4048458<0> v103 T{_Future<void>*}, v92, v94, using unchecked entrypoint, result_type = T{??})
      goto:32 B19
  B19[join]:28 pred(B17, B18)
      Return:34(v84)
       Bailout: heuristics (no small leaf)
    => new Repository (deopt count 0)
  Callee graph for inlining package:my_app/repositories/repository.dart_Repository_Repository. (unoptimized)
  ==== package:my_app/repositories/repository.dart_Repository_Repository. (Constructor)
  B0[graph]:0 {
        v84 <- Constant(#null)
        v85 <- Constant(#<optimized out>)
  }
  B15[function entry]:2 {
        v86 <- Parameter(0)
        v87 <- Constant(#null)
  }
      v89 <- StaticCall:10( get:_repository@1366392860<0> , result_type = T{Repository?})
      Return:12(v89)
  Callee graph for inlining package:my_app/repositories/repository.dart_Repository_Repository. (optimized)
  ==== package:my_app/repositories/repository.dart_Repository_Repository. (Constructor)
  B0[graph]:0 {
        v84 <- Constant(#null)
        v85 <- Constant(#<optimized out>)
  }
  B15[function entry]:2 {
        v86 <- Parameter(0)
        v87 <- Constant(#null)
  }
      v89 <- StaticCall:10( get:_repository@1366392860<0> , result_type = T{Repository?}) T{Repository?}
      Return:12(v89)
       Success
         with reason AlwaysInline, code size 2, call sites: 1
    => Collection.listenerKey (deopt count 0)
  Callee graph for inlining package:my_app/collections/collection.dart_Collection_get_listenerKey (unoptimized)
  ==== package:my_app/collections/collection.dart_Collection_get_listenerKey (GetterFunction)
  B0[graph]:0 {
        v91 <- Constant(#null)
        v92 <- Constant(#<optimized out>)
  }
  B17[function entry]:2 {
        v93 <- Parameter(0)
        v94 <- Parameter(0) T{_Collection&CollectionBase&RepositoryBloc<T*>?}
  }
      v96 <- StaticCall:10( get:_listenerKey@1429312951<0> v94)
      Return:12(v96)
  Callee graph for inlining package:my_app/collections/collection.dart_Collection_get_listenerKey (optimized)
  ==== package:my_app/collections/collection.dart_Collection_get_listenerKey (GetterFunction)
  B0[graph]:0 {
        v91 <- Constant(#null)
        v92 <- Constant(#<optimized out>)
  }
  B17[function entry]:2 {
        v93 <- Parameter(0)
        v94 <- Parameter(0) T{_Collection&CollectionBase&RepositoryBloc<T*>?}
  }
      v96 <- LoadField(v94 . _listenerKey@1429312951 {final}) T{String*?}
      Return:12(v96)
       Success
         with reason AlwaysInline, code size 2, call sites: 0
    => Repository.close (deopt count 0)
  Callee graph for inlining package:my_app/repositories/repository.dart_Repository_close (unoptimized)
  ==== package:my_app/repositories/repository.dart_Repository_close (RegularFunction)
  B0[graph]:0 {
        v98 <- Constant(#null)
        v99 <- Constant(#<optimized out>)
        v115 <- Constant(#0)
        v138 <- Constant(#TypeArguments: (H347146b) [Type: RepositoryElement*])
  }
  B19[function entry]:2 {
        v100 <- Parameter(0)
        v101 <- Parameter(1)
        v102 <- Parameter(2)
        v103 <- Parameter(0) T{Repository}
        v105 <- Parameter(1) T{M*?}
        v107 <- Parameter(2) T{String*?}
        v109 <- Parameter(-1) T{*?}
        v111 <- SpecialParameter(ArgDescriptor)
  }
      v113 <- LoadField(v111 . ArgumentsDescriptor.type_args_len {final})
      Branch if StrictCompare:24(===, v113, v115) goto (24, 25)
  B24[target try_idx 0]:28
      goto:34 B26
  B25[target try_idx 0]:30
      goto:36 B26
  B26[join try_idx 0]:32 pred(B24, B25) {
        v116 <- phi(v103, v103) alive
        v118 <- phi(v105, v105) alive T{T*?}
        v120 <- phi(v107, v107) alive T{String*?}
        v122 <- phi(v138, v109) alive
        v124 <- phi(v111, v111) alive
        v126 <- phi(v98, v98) alive
        v128 <- phi(v98, v98) alive
        v130 <- phi(v98, v98) alive
  }
      Branch if StrictCompare:38(===, v118, v98, with number check) goto (27, 28)
  B27[target try_idx 0]:42
      Return:44(v98)
  B28[target try_idx 0]:46
      v132 <- StaticCall:48( get:_cache@1366392860<0> , result_type = T{_InternalLinkedHashMap?})
      v134 <- InstanceCall:50( get:repositoryKey<0>, v118 IC[0: ])
      CheckNull:52(v132, NoSuchMethodError)
      v136 <- StaticCall:54( []<0> v132, v134, using unchecked entrypoint, result_type = T{RepositoryMapElement?})
      Branch if StrictCompare:56(===, v136, v98, with number check) goto (29, 30)
  B29[target try_idx 0]:60
      Return:62(v98)
  B30[target try_idx 0]:64
      StaticCall:66( removeListenerAndDisposeIfEmpty<0> v136, v120, using unchecked entrypoint, result_type = T{??})
      Return:68(v98)
  Process 84721 stopped
  * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x7ffeef3ffff8)
      frame #0: 0x000000010013d7d6 gen_snapshot_armv7`dart::TypeParameter::IsEquivalent(dart::Instance const&, dart::TypeEquality, dart::ZoneGrowableHandlePtrArray<dart::AbstractType const>*) const + 70
  gen_snapshot_armv7`dart::TypeParameter::IsEquivalent:
  ->  0x10013d7d6 <+70>: callq  *0x158(%rax)
      0x10013d7dc <+76>: testb  %al, %al
      0x10013d7de <+78>: je     0x10013d828               ; <+152>
      0x10013d7e0 <+80>: movq   0x8(%r13), %rax
  Target 0: (gen_snapshot_armv7) stopped.
  (lldb)

@mraleph
Copy link
Member

mraleph commented May 21, 2021

Thanks @oshtman. Now we know that it breaks when trying to inline package:my_app/repositories/repository.dart_Repository_close. Is it possible for you to provide signature for this function? as well as how declarations of all involved classes in the signature look like. We are mostly interested in their type parameters and superclasses, not methods inside. so you can just provide something like:

class B<T extends Y> ... { }
class A<T extends Y> extends B<T> { }
// etc

@oshtman
Copy link
Author

oshtman commented May 21, 2021

Sure. The signature of the close function is with its involved classes as follows:

void close<T extends RepositoryElement<T>>(T object, ...otherNonGenerictTypeParameters) { }
abstract class RepositoryElement<T> extends JsonModel<T> { }
abstract class JsonModel<T> extends ToJsonable { }
abstract class ToJsonable { }

let me know if that suffices or if you need any additional info

@mraleph
Copy link
Member

mraleph commented May 21, 2021

Reduction based on information provided by @oshtman.

// @dart=2.9

@pragma('vm:prefer-inline')
void foo<T extends C<T>>(T x) {
  if (x == null) return;  // Create redefinition of x
  print(x);               // (need to have a use for redefined value)
}

@pragma('vm:never-inline')
void bar<M extends U<M>>(M data) {
  try {  // Need try to create a (redundant) Phi of type T inside inlined foo
    foo(data);
  } catch (e) {}
}

abstract class C<T> {}

// U<T> needed to repro on master branch but not on stable, because
// on master we canonicalize type parameters better.
abstract class U<T> extends C<T> {}

class A extends U<A> {}

class B extends U<B> {}

void main() {
  bar(null);  // Prevent any sort of TFA based monomorphisation / null check elimination.  
  bar(A());
  bar(B());
}

It's a bit convoluted with a lot of moving pieces, the actual problem happens when we ask if M is a subtype of T, where M and T are unrelated function type arguments.

@crelier
Copy link
Contributor

crelier commented May 24, 2021

Fantastic! Thank you both @mraleph and @oshtman for providing a repro.
I am able to reproduce the crash in precompiled mode on x64.
Stay tuned for a fix.

@crelier
Copy link
Contributor

crelier commented May 25, 2021

https://dart-review.googlesource.com/c/sdk/+/201232 is being tested on the CQ bots.

dart-bot pushed a commit to dart-lang/sdk that referenced this issue May 25, 2021
…with bounds referring to themselves.

Fixes issue flutter/flutter#82890

TEST=added regression test

Change-Id: I69ed52e877b058ae57881c1b0af7e928f6d4f838
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/201232
Commit-Queue: Régis Crelier <regis@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
@crelier
Copy link
Contributor

crelier commented May 25, 2021

This issue will get fixed as commit dart-lang/sdk@481a28d rolls into flutter.

@crelier crelier closed this as completed May 25, 2021
@github-actions
Copy link

github-actions bot commented Aug 1, 2021

This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new bug, including the output of flutter doctor -v and a minimal reproduction of the issue.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Aug 1, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
dependency: dart Dart team may need to help us
Projects
None yet
Development

No branches or pull requests

3 participants