Skip to content

Make store-to-load forwarding work with FFI Pointers #53124

Closed
@mkustermann

Description

@mkustermann

Once we allow inlining force optimized functions (such as Pointer.fromAddress()) we seem to generate for this dart code

import 'dart:ffi';

main() {
  for (int i = 0; i < 10000; ++i) {
    foo();
  }
}

@pragma('vm:never-inline')
int foo() {
  return Pointer<Void>.fromAddress(0).address;
}

this flow graph

out/ReleaseX64/dart --print-flow-graph-optimized --print-flow-graph-filter=foo ffi.dart
*** BEGIN CFG
After AllocateRegisters
==== file:///.../sdk/ffi.dart_::_foo (RegularFunction)
  0: B0[graph]:0 {
      v0 <- Constant(#null) T{Null?}
      v1 <- Constant(#<optimized out>) T{Sentinel~}
      v2 <- Constant(#TypeArguments: (H116f861f) [Type: Void]) T{TypeArguments}
      v3 <- Constant(#0) [0, 0] T{_Smi}
      v32 <- Constant(#TypeArguments: (H39d2e3b4) [Type: Never]) T{TypeArguments}
      v35 <- UnboxedConstant(#0 int64) [0, 0] T{_Smi}
}
  2: B1[function entry]:2
  3:     ParallelMove rdx <- C
  4:     v28 <- AllocateObject:12(cls=Pointer, v32 T{TypeArguments}) T{Pointer}
  5:     ParallelMove rax <- rax, rcx <- C
  6:     StoreField(v28 . PointerBase.data = v35 T{_Smi} <int64>, NoStoreBarrier)
  8:     v18 <- LoadUntagged(v28 T{Pointer}, 8) T{*?}
 10:     v19 <- IntConverter(untagged->int64[tr], v18) T{int}
 12:     v20 <- BoxInt64(v19) T{int}
 14:     Return:18(v20 T{int})
*** END CFG

Instead it should just return a constant.

/cc @alexmarkov

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-vmUse area-vm for VM related issues, including code coverage, and the AOT and JIT backends.type-performanceIssue relates to performance or code size

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions