Files
sdk/pkg/vm/testcases/bytecode/optional_params.dart.expect
T
Alexander Markov 3e1154cb5b [vm/bytecode] Move CheckStack after function type arguments handling
When generating deopt info in SIMDBC mode (DeoptInfoBuilder::AddCopy,
DeoptInfoBuilder::ToCpuRegisterSource) kSpecialDbcRegister source
locations are not supported.

In order to avoid such deopt info, this change moves CheckStack bytecode
instruction after function type arguments handling is finished (function
type arguments handling uses arguments descriptor which resides in
kArgsDescriptorsReg special DBC register). This placement of CheckStack is
also more aligned with what AST-based flow graph builder generates.

Fixes lib_2/math/min_max_test with bytecode in dartk-reload-mac-release-simdbc64
configuration.

Change-Id: I7d9863b8290a78a6e24e5806cc5053d55c93ce5c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/117221
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-09-13 23:03:55 +00:00

299 lines
7.4 KiB
Plaintext

main = #lib::main;
[@vm.bytecode=
BytecodeMetadata {
Bytecode (version: stable)
Main library: #lib
Library '#lib'
name '#lib'
script '#lib'
Class '', script = '#lib'
Function 'foo1', static, has-optional-positional-params, reflectable, debuggable
parameters [dynamic 'x', dynamic 'a', dynamic 'b'] (required: 1)
return-type void
Bytecode {
EntryOptional 1, 2, 0
LoadConstant r1, CP#0
LoadConstant r2, CP#1
Frame 1
CheckStack 0
PushNull
PushInt 2
CreateArrayTOS
StoreLocal r3
Push r3
PushInt 0
PushConstant CP#2
StoreIndexedTOS
Push r3
PushInt 1
Push r0
StoreIndexedTOS
DirectCall CP#3, 1
DirectCall CP#5, 1
Drop1
PushNull
PushInt 2
CreateArrayTOS
StoreLocal r3
Push r3
PushInt 0
PushConstant CP#7
StoreIndexedTOS
Push r3
PushInt 1
Push r1
StoreIndexedTOS
DirectCall CP#3, 1
DirectCall CP#5, 1
Drop1
PushNull
PushInt 2
CreateArrayTOS
StoreLocal r3
Push r3
PushInt 0
PushConstant CP#8
StoreIndexedTOS
Push r3
PushInt 1
Push r2
StoreIndexedTOS
DirectCall CP#3, 1
DirectCall CP#5, 1
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ObjectRef 'default_a'
[1] = ObjectRef 'default_b'
[2] = ObjectRef 'x = '
[3] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
[4] = Reserved
[5] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[6] = Reserved
[7] = ObjectRef 'a = '
[8] = ObjectRef 'b = '
}
Function 'foo2', static, has-optional-named-params, reflectable, debuggable
parameters [dynamic 'y', dynamic 'z', dynamic 'c', dynamic 'a', dynamic 'b'] (required: 2)
return-type void
Bytecode {
EntryOptional 2, 0, 3
LoadConstant r2, CP#0
LoadConstant r2, CP#1
LoadConstant r3, CP#2
LoadConstant r3, CP#3
LoadConstant r4, CP#4
LoadConstant r4, CP#5
Frame 1
CheckStack 0
PushNull
PushInt 2
CreateArrayTOS
StoreLocal r5
Push r5
PushInt 0
PushConstant CP#6
StoreIndexedTOS
Push r5
PushInt 1
Push r0
StoreIndexedTOS
DirectCall CP#7, 1
DirectCall CP#9, 1
Drop1
PushNull
PushInt 2
CreateArrayTOS
StoreLocal r5
Push r5
PushInt 0
PushConstant CP#11
StoreIndexedTOS
Push r5
PushInt 1
Push r1
StoreIndexedTOS
DirectCall CP#7, 1
DirectCall CP#9, 1
Drop1
PushNull
PushInt 2
CreateArrayTOS
StoreLocal r5
Push r5
PushInt 0
PushConstant CP#12
StoreIndexedTOS
Push r5
PushInt 1
Push r2
StoreIndexedTOS
DirectCall CP#7, 1
DirectCall CP#9, 1
Drop1
PushNull
PushInt 2
CreateArrayTOS
StoreLocal r5
Push r5
PushInt 0
PushConstant CP#13
StoreIndexedTOS
Push r5
PushInt 1
Push r3
StoreIndexedTOS
DirectCall CP#7, 1
DirectCall CP#9, 1
Drop1
PushNull
PushInt 2
CreateArrayTOS
StoreLocal r5
Push r5
PushInt 0
PushConstant CP#14
StoreIndexedTOS
Push r5
PushInt 1
Push r4
StoreIndexedTOS
DirectCall CP#7, 1
DirectCall CP#9, 1
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ObjectRef 'a'
[1] = ObjectRef const 42
[2] = ObjectRef 'b'
[3] = ObjectRef const <dart:core::String> ['default_b']
[4] = ObjectRef 'c'
[5] = ObjectRef 'default_c'
[6] = ObjectRef 'y = '
[7] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
[8] = Reserved
[9] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[10] = Reserved
[11] = ObjectRef 'z = '
[12] = ObjectRef 'a = '
[13] = ObjectRef 'b = '
[14] = ObjectRef 'c = '
}
Function 'foo3', static, has-optional-named-params, reflectable, debuggable
type-params <dart:core::Object P, dart:core::Object Q>
parameters [dynamic 'z', dynamic 'y', dart:core::bool 'a', dart:core::Map < #lib::foo3::TypeParam/0, #lib::foo3::TypeParam/1 > 'b'] (required: 2)
return-type void
Bytecode {
EntryOptional 2, 0, 2
LoadConstant r2, CP#0
LoadConstant r2, CP#1
LoadConstant r3, CP#2
LoadConstant r3, CP#3
Frame 1
CheckFunctionTypeArgs 2, r4
CheckStack 0
PushNull
Push r4
InstantiateType CP#4
DirectCall CP#5, 1
Drop1
Push r1
DirectCall CP#5, 1
Drop1
Push r3
DirectCall CP#5, 1
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ObjectRef 'a'
[1] = ObjectRef const false
[2] = ObjectRef 'b'
[3] = ObjectRef null
[4] = Type #lib::foo3::TypeParam/0
[5] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[6] = Reserved
}
Function 'main', static, reflectable, debuggable
parameters [] (required: 0)
return-type dynamic
Bytecode {
Entry 0
CheckStack 0
PushConstant CP#0
PushConstant CP#1
DirectCall CP#2, 2
Drop1
PushConstant CP#4
PushConstant CP#5
PushConstant CP#1
DirectCall CP#6, 3
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ObjectRef 'fixed_x'
[1] = ObjectRef 'concrete_a'
[2] = DirectCall '#lib::foo1', ArgDesc num-args 2, num-type-args 0, names []
[3] = Reserved
[4] = ObjectRef 'fixed_y'
[5] = ObjectRef 'fixed_z'
[6] = DirectCall '#lib::foo2', ArgDesc num-args 3, num-type-args 0, names ['a']
[7] = Reserved
}
}
]library #lib from "#lib" as #lib {
static method foo1(dynamic x, [dynamic a = #C1, dynamic b = #C2]) → void {
dart.core::print("x = ${x}");
dart.core::print("a = ${a}");
dart.core::print("b = ${b}");
}
static method foo2(dynamic y, dynamic z, {dynamic c = #C3, dynamic a = #C4, dynamic b = #C5}) → void {
dart.core::print("y = ${y}");
dart.core::print("z = ${z}");
dart.core::print("a = ${a}");
dart.core::print("b = ${b}");
dart.core::print("c = ${c}");
}
static method foo3<P extends dart.core::Object* = dynamic, Q extends dart.core::Object* = dynamic>(dynamic z, dynamic y, {dart.core::bool* a = #C6, dart.core::Map<#lib::foo3::P*, #lib::foo3::Q*>* b = #C7}) → void {
dart.core::print(#lib::foo3::P*);
dart.core::print(y);
dart.core::print(b);
}
static method main() → dynamic {
#lib::foo1("fixed_x", "concrete_a");
#lib::foo2("fixed_y", "fixed_z", a: "concrete_a");
}
}
constants {
#C1 = "default_a"
#C2 = "default_b"
#C3 = "default_c"
#C4 = 42
#C5 = <dart.core::String*>[#C2]
#C6 = false
#C7 = null
}