The best generated code for bimorphic call site is the next
if class == Receiver1
inlined Receiver1::method1()
else if class == Receiver2
inlined Receiver2::method2()
else
uncommon trap
The uncommon trap does not clog the class information we
are getting from class checks. It could be also moved from hot loop.
But in most bimorphic cases now we generate a virtual call instead of
an uncommon trap. This is due to the check we have to verify if
there were already class_check traps in this bytecode:
if ((profile.morphism() == 1 || next_hit_cg != NULL) &&
!too_many_traps(jvms->method(), jvms->bci(), Deoptimization::Reason_class_check)) {
miss_cg = CallGenerator::for_uncommon_trap(call_method,
Deoptimization::Reason_class_check,
Deoptimization::Action_maybe_recompile);
} else {
miss_cg = CallGenerator::for_virtual_call(call_method, vtable_index);
}
And in bimorphic case we most likely will have class_check trap since
there was the transition to it from monomorphic case for which we
did first compilation of the method.
Also we should allow to run that bytecode in interpreter for some time
before recompilation after class_check traps. So we collect more
profiling information for the call site.
I did the next changes:
if (profile.morphism() == 1 &&
!too_many_traps(jvms->method(), jvms->bci(), Deoptimization::Reason_class_check) ||
next_hit_cg != NULL && // Bimorphic case
// Check only total number of traps per method to allow
// the transition from monomorphic to bimorphic case between
// compilations without falling into virtual call.
!too_many_traps(Deoptimization::Reason_class_check)) {
// Generate uncommon trap for class check failure path
// in case of monomorphic or bimorphic virtual call site.
miss_cg = CallGenerator::for_uncommon_trap(call_method,
Deoptimization::Reason_class_check,
Deoptimization::Action_reinterpret);
} else {
// Generate virtual call for class check failure path
// in case of polymorphic virtual call site.
miss_cg = CallGenerator::for_virtual_call(call_method, vtable_index);
}
And I got the next results on SP2500 (-server -XX:+AggressiveOpts):
jaberwocky% ~kbr/bin/common/rwcompare ref.bimorph ref.bimorph2
============================================================================
ref.bimorph: reference_server
Benchmark Samples Mean Stdev
jetstream 10 34.72 0.32
scimark 10 65.44 1.20
specjbb2000 10 21979.97 89.39
specjbb2005 10 7576.85 63.53
specjvm98 10 118.94 0.71
volano25 10 11916.20 134.85
--------------------------------------------------------------------------
Weighted Geomean 1493.24
============================================================================
ref.bimorph2: reference_server
Benchmark Samples Mean Stdev %Diff P Significant
jetstream 10 34.89 0.36 0.49 0.282 *
scimark 10 67.54 1.77 3.22 0.007 Yes
specjbb2000 10 22025.16 69.69 0.21 0.224 *
specjbb2005 10 7585.57 44.26 0.11 0.727 *
specjvm98 10 119.92 0.59 0.82 0.004 Yes
volano25 10 11816.50 112.83 -0.84 0.090 *
--------------------------------------------------------------------------
Weighted Geomean 1501.30 0.54
============================================================================
jaberwocky% ~kbr/bin/common/rwcompare -r ref.bimorph ref.bimorph2
============================================================================
ref.bimorph: reference_server
Benchmark Samples Mean Stdev
jetstream 10 34.72 0.32
Copy 10 447.80 2.62
Parse 10 343.60 1.71
Read 10 116.60 3.47
Write 10 384.00 3.56
scimark 10 65.44 1.20
Sparse 10 42.53 1.33
LU 10 76.90 1.31
SOR 10 166.42 5.22
FFT 10 14.71 0.25
Monte 10 26.63 0.03
specjbb2000 10 21979.97 89.39
First_Warehouse 10 12375.97 91.24
Last_Warehouse 10 21979.98 89.39
specjbb2005 10 7576.85 63.53
peak 10 8006.33 61.25
peak_warehouse 10 3.40 0.97
last 10 7576.86 63.53
interval_average 10 841.80 7.02
first 10 3141.21 47.72
overall_average 10 7107.71 44.59
last_warehouse 10 8.00 0.00
specjvm98 10 118.94 0.71
javac 10 70.03 1.02
db 10 33.18 0.57
jess 10 137.84 1.47
jack 10 95.00 2.18
compress 10 155.14 0.90
mtrt 10 355.87 5.68
mpegaudio 10 200.54 0.47
volano25 10 11916.20 134.85
connections 10 400.00 0.00
time 10 67.14 0.76
--------------------------------------------------------------------------
Weighted Geomean 1493.24
============================================================================
ref.bimorph2: reference_server
Benchmark Samples Mean Stdev %Diff P Significant
jetstream 10 34.89 0.36 0.49 0.282 *
Copy 10 445.70 2.06 0.47 0.062 *
Parse 10 344.20 2.35 -0.17 0.523 *
Read 10 113.80 2.78 2.40 0.063 *
Write 10 387.00 9.46 -0.78 0.367 *
scimark 10 67.54 1.77 3.22 0.007 Yes
Sparse 10 43.97 1.24 3.39 0.022 *
LU 10 80.37 2.41 4.52 0.001 Yes
SOR 10 171.70 6.73 3.17 0.067 *
FFT 10 15.07 0.38 2.44 0.025 *
Monte 10 26.62 0.04 -0.02 0.796 *
specjbb2000 10 22025.16 69.69 0.21 0.224 *
First_Warehouse 10 12408.77 122.43 0.27 0.506 *
Last_Warehouse 10 22025.16 69.69 0.21 0.224 *
specjbb2005 10 7585.57 44.26 0.11 0.727 *
peak 10 8064.37 38.89 0.72 0.023 *
peak_warehouse 10 3.30 0.67 2.94 0.792 *
last 10 7585.57 44.26 0.11 0.727 *
interval_average 10 842.90 4.95 0.13 0.691 *
first 10 3164.04 50.24 0.73 0.311 *
overall_average 10 7131.31 37.48 0.33 0.217 *
last_warehouse 10 8.00 0.00 -0.00 0.000 Yes
specjvm98 10 119.92 0.59 0.82 0.004 Yes
javac 10 70.53 0.86 0.72 0.249 *
db 10 34.40 0.44 3.67 0.000 Yes
jess 10 138.65 1.71 0.59 0.271 *
jack 10 95.18 1.43 0.19 0.831 *
compress 10 156.74 1.16 1.03 0.003 Yes
mtrt 10 354.03 7.06 -0.52 0.529 *
mpegaudio 10 200.79 0.45 0.12 0.246 *
volano25 10 11816.50 112.83 -0.84 0.090 *
connections 10 400.00 0.00 0.00 0.000 Yes
time 10 67.71 0.65 -0.84 0.091 *
--------------------------------------------------------------------------
Weighted Geomean 1501.30 0.54
============================================================================
jaberwocky%
|