Closed
Description
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