diff options
| author | 2012-03-06 18:15:00 -0800 | |
|---|---|---|
| committer | 2012-03-07 12:10:21 -0800 | |
| commit | 86a4bce32e2aaf3d377c0acf865f0630a7c30495 (patch) | |
| tree | 98517211fdb1309f461e3fe3c41a34739ad121c1 /src/compiler/codegen/CompilerCodegen.h | |
| parent | 6150d9889b56e95f1267d9200c5702b16e0d32d5 (diff) | |
Fix branch bug (showed up in codegen for debug)
There are a few "safe" optimizations in the compiler - removing
register copies where source and target are the same, deleting
branches to the next instruction, etc. One of the redundant
branch optimizations, however, was incorrect and resulted in
a good branch being deleted. This one showed up in the debug
build, and resulted in a failure to do a suspend check (because
the branch to the suspend check was deleted).
I had hoped that this but might also be the case of some
other unexpected failures, but unfortunately I was only able
to trigger it when doing a "codegen for debug" build.
The source of the bug was a confusion around 16 v/ 32-bit
unconditional branch encodings. For a 32-bit unconditional
branch, going to the next instruction means an displacement
of zero. However, for 16-bit branches, the next instruction
is represented by a displacement of -1.
To help track down this sort of thing in the future, this CL
also adds a new optimization disable flag: kSafeOptimizations.
This will allow us to really turn off all optimizations for A/B
testing.
Also in this CL we are re-enabling the ability to promote argument
registers and improving somewhat the code sequence for suspend
check when debug is enabled.
Change-Id: Ib6b202746eac751cab3b4609805a389c18cb67b2
Diffstat (limited to 'src/compiler/codegen/CompilerCodegen.h')
0 files changed, 0 insertions, 0 deletions