Reviewers: kisg, danno, Yang, Paul Lind, palfia, Jakob,
https://codereview.chromium.org/19248002/diff/1/src/deoptimizer.cc
File src/deoptimizer.cc (right):
https://codereview.chromium.org/19248002/diff/1/src/deoptimizer.cc#newcode2434
src/deoptimizer.cc:2434: int32_t loop_depth =
Memory::int32_at(back_edge_cursor + 2 * kIntSize);
On 2013/07/18 15:46:52, kisg wrote:
Instead of int32_t, use uint32_t and static_cast<int> in the CHECK to
fix debug
builds
Done.
Description:
Fix unaligned accesses in back_edge tables.
This patch fixes the step size of masm->pc_ in back_edge tables to words (4
bytes) to ensure 4 bytes alignment for read/write operations. Read and
write of
words (4 bytes) data from aligned space (address % 4 == 0) is more
efficient on
all platforms and especially on MIPS where without this alignment fix a
kernel
exception handler is used for every unaligned access.
This patch increases the size of back_edge tables by 3 bytes in every row.
By
the test it seem the back_edge table quite small in every/most cases
(maximal
length is 18 so in that case there are only 54 additional bytes with this
patch).
BUG=
Patch from Douglas Leung <[email protected]>
Please review this at https://codereview.chromium.org/19248002/
SVN Base: https://github.com/v8/v8.git@gbl
Affected files:
M src/deoptimizer.cc
M src/full-codegen.h
M src/full-codegen.cc
M src/objects.cc
M src/runtime.cc
Index: src/deoptimizer.cc
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
index
674b9aed586c8955ebbd7f4409652705f8b6326d..f59ab5ec6af3aed443c8218ff5544f1e10c09e1f
100644
--- a/src/deoptimizer.cc
+++ b/src/deoptimizer.cc
@@ -2371,8 +2371,8 @@ void Deoptimizer::PatchInterruptCode(Code*
unoptimized_code,
uint32_t table_length = Memory::uint32_at(back_edge_cursor);
back_edge_cursor += kIntSize;
for (uint32_t i = 0; i < table_length; ++i) {
- uint8_t loop_depth = Memory::uint8_at(back_edge_cursor + 2 * kIntSize);
- if (loop_depth == loop_nesting_level) {
+ uint32_t loop_depth = Memory::uint32_at(back_edge_cursor + 2 *
kIntSize);
+ if (static_cast<int>(loop_depth) == loop_nesting_level) {
// Loop back edge has the loop depth that we want to patch.
uint32_t pc_offset = Memory::uint32_at(back_edge_cursor + kIntSize);
Address pc_after = unoptimized_code->instruction_start() + pc_offset;
@@ -2403,8 +2403,8 @@ void Deoptimizer::RevertInterruptCode(Code*
unoptimized_code,
uint32_t table_length = Memory::uint32_at(back_edge_cursor);
back_edge_cursor += kIntSize;
for (uint32_t i = 0; i < table_length; ++i) {
- uint8_t loop_depth = Memory::uint8_at(back_edge_cursor + 2 * kIntSize);
- if (loop_depth <= loop_nesting_level) {
+ uint32_t loop_depth = Memory::uint32_at(back_edge_cursor + 2 *
kIntSize);
+ if (static_cast<int>(loop_depth) <= loop_nesting_level) {
uint32_t pc_offset = Memory::uint32_at(back_edge_cursor + kIntSize);
Address pc_after = unoptimized_code->instruction_start() + pc_offset;
RevertInterruptCodeAt(unoptimized_code,
@@ -2435,13 +2435,13 @@ void Deoptimizer::VerifyInterruptCode(Code*
unoptimized_code,
uint32_t table_length = Memory::uint32_at(back_edge_cursor);
back_edge_cursor += kIntSize;
for (uint32_t i = 0; i < table_length; ++i) {
- uint8_t loop_depth = Memory::uint8_at(back_edge_cursor + 2 * kIntSize);
- CHECK_LE(loop_depth, Code::kMaxLoopNestingMarker);
+ uint32_t loop_depth = Memory::uint32_at(back_edge_cursor + 2 *
kIntSize);
+ CHECK_LE(static_cast<int>(loop_depth), Code::kMaxLoopNestingMarker);
// Assert that all back edges for shallower loops (and only those)
// have already been patched.
uint32_t pc_offset = Memory::uint32_at(back_edge_cursor + kIntSize);
Address pc_after = unoptimized_code->instruction_start() + pc_offset;
- CHECK_EQ((loop_depth <= loop_nesting_level),
+ CHECK_EQ((static_cast<int>(loop_depth) <= loop_nesting_level),
InterruptCodeIsPatched(unoptimized_code,
pc_after,
interrupt_code,
Index: src/full-codegen.cc
diff --git a/src/full-codegen.cc b/src/full-codegen.cc
index
76d3fff11c049f2939d981c5cfe466f4f3245d68..6d802e965d20e6e23f73241cb4256363bd7591d2
100644
--- a/src/full-codegen.cc
+++ b/src/full-codegen.cc
@@ -379,7 +379,7 @@ unsigned FullCodeGenerator::EmitBackEdgeTable() {
for (unsigned i = 0; i < length; ++i) {
__ dd(back_edges_[i].id.ToInt());
__ dd(back_edges_[i].pc);
- __ db(back_edges_[i].loop_depth);
+ __ dd(back_edges_[i].loop_depth);
}
return offset;
}
Index: src/full-codegen.h
diff --git a/src/full-codegen.h b/src/full-codegen.h
index
7e6450655f5258eac705877575c7a399954ab580..a9db54e32c18284b17f510d3384c55abebeab0f3
100644
--- a/src/full-codegen.h
+++ b/src/full-codegen.h
@@ -136,7 +136,7 @@ class FullCodeGenerator: public AstVisitor {
#error Unsupported target architecture.
#endif
- static const int kBackEdgeEntrySize = 2 * kIntSize + kOneByteSize;
+ static const int kBackEdgeEntrySize = 3 * kIntSize;
private:
class Breakable;
@@ -648,7 +648,7 @@ class FullCodeGenerator: public AstVisitor {
struct BackEdgeEntry {
BailoutId id;
unsigned pc;
- uint8_t loop_depth;
+ uint32_t loop_depth;
};
struct TypeFeedbackCellEntry {
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
5f2a7b5b2e262fb504426b4e00f6d789725e7196..fa2f1b648c107219bf0caa3787a96a63cd72a12c
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -10792,7 +10792,8 @@ void Code::Disassemble(const char* name, FILE* out)
{
for (uint32_t i = 0; i < table_length; ++i) {
uint32_t ast_id = Memory::uint32_at(back_edge_cursor);
uint32_t pc_offset = Memory::uint32_at(back_edge_cursor +
kIntSize);
- uint8_t loop_depth = Memory::uint8_at(back_edge_cursor + 2 *
kIntSize);
+ uint32_t loop_depth = Memory::uint32_at(back_edge_cursor +
+ 2 * kIntSize);
PrintF(out, "%6u %9u %10u\n", ast_id, pc_offset, loop_depth);
back_edge_cursor += FullCodeGenerator::kBackEdgeEntrySize;
}
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index
8391bef9490d150e6318de906020622029737a53..e3eae317c213eaad53fcd3c428725c23d5f74a64
100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -8544,13 +8544,13 @@ RUNTIME_FUNCTION(MaybeObject*,
Runtime_CompileForOnStackReplacement) {
Address table_cursor = start + unoptimized->back_edge_table_offset();
uint32_t table_length = Memory::uint32_at(table_cursor);
table_cursor += kIntSize;
- uint8_t loop_depth = 0;
+ uint32_t loop_depth = 0;
for (unsigned i = 0; i < table_length; ++i) {
// Table entries are (AST id, pc offset) pairs.
uint32_t pc_offset = Memory::uint32_at(table_cursor + kIntSize);
if (pc_offset == target_pc_offset) {
ast_id =
BailoutId(static_cast<int>(Memory::uint32_at(table_cursor)));
- loop_depth = Memory::uint8_at(table_cursor + 2 * kIntSize);
+ loop_depth = Memory::uint32_at(table_cursor + 2 * kIntSize);
break;
}
table_cursor += FullCodeGenerator::kBackEdgeEntrySize;
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.