OSDN Git Service

ART: Profile all branches for on-stack replacement
authorbuzbee <buzbee@google.com>
Wed, 24 Feb 2016 22:24:24 +0000 (14:24 -0800)
committerbuzbee <buzbee@google.com>
Thu, 25 Feb 2016 13:47:09 +0000 (05:47 -0800)
commitf1dcaccfac4a9e022ea49752a774552b2f791489
tree2e11cbb0bead0b24dd527f307a58a0588e707901
parentdb11e7ecc9c902ffde6336c261fe236299a81944
ART: Profile all branches for on-stack replacement

Change the switch, goto and mterp interpreters to profile
not-taken as well as taken branches.  This allows for on-stack
replacement when the cfg has been rearranged such that the loop
header was originally the fallthrough of a Dalvik byte-code branch.

Note that this increases the already-heavy cost of branch profiling.
Measuring on a Nexus 6 using a very branchy benchmark (logic subtest
from Caffeinemark), we see:

            No profiling     Taken only     Taken & not-taken
mterp          9728            3434              2384
C++ goto       3914            2422              2037
C++ switch     2986            2411              2112

As measured, the cost of branch profiling is dominating execution
time.  This will be addressed in follow-up CLs.

Change-Id: Ibc858f317398dd991ed8e4f3c3d72bd4c9a60594
runtime/interpreter/interpreter_goto_table_impl.cc
runtime/interpreter/interpreter_switch_impl.cc
runtime/interpreter/mterp/arm/bincmp.S
runtime/interpreter/mterp/arm/zcmp.S
runtime/interpreter/mterp/arm64/bincmp.S
runtime/interpreter/mterp/arm64/zcmp.S
runtime/interpreter/mterp/out/mterp_arm.S
runtime/interpreter/mterp/out/mterp_arm64.S