Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(248)

Unified Diff: runtime/vm/deopt_instructions.h

Issue 11040058: Compress deoptimization information by sharing common suffixes. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Ditto. Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/compiler.cc ('k') | runtime/vm/deopt_instructions.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/deopt_instructions.h
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 603fab27c48286d6467144060ade0bddab34af30..79c9f238418217b8e1d211aa2ba51f281925f41f 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -84,6 +84,22 @@ class DeoptimizationContext : public ValueObject {
// the deopt-info array.
class DeoptInstr : public ZoneAllocated {
public:
+ enum Kind {
+ kRetAfterAddress,
+ kRetBeforeAddress,
+ kConstant,
+ kRegister,
+ kXmmRegister,
+ kInt64XmmRegister,
+ kStackSlot,
+ kDoubleStackSlot,
+ kInt64StackSlot,
+ kPcMarker,
+ kCallerFp,
+ kCallerPc,
+ kSuffix,
+ };
+
static DeoptInstr* Create(intptr_t kind_as_int, intptr_t from_index);
DeoptInstr() {}
@@ -94,22 +110,15 @@ class DeoptInstr : public ZoneAllocated {
virtual void Execute(DeoptimizationContext* deopt_context,
intptr_t to_index) = 0;
- protected:
- enum Kind {
- kSetRetAfterAddress,
- kSetRetBeforeAddress,
- kCopyConstant,
- kCopyRegister,
- kCopyXmmRegister,
- kCopyInt64XmmRegister,
- kCopyStackSlot,
- kCopyDoubleStackSlot,
- kCopyInt64StackSlot,
- kSetPcMarker,
- kSetCallerFp,
- kSetCallerPc,
- };
+ bool Equals(const DeoptInstr& other) const {
+ return (kind() == other.kind()) && (from_index() == other.from_index());
+ }
+
+ // Decode the payload of a suffix command. Return the suffix length and
+ // set the output parameter info_number to the index of the shared suffix.
+ static intptr_t DecodeSuffix(intptr_t from_index, intptr_t* info_number);
+ protected:
virtual DeoptInstr::Kind kind() const = 0;
virtual intptr_t from_index() const = 0;
@@ -120,18 +129,18 @@ class DeoptInstr : public ZoneAllocated {
};
-// Builds one instance of DeoptInfo. Call AddXXX methods in the order of
-// their target, starting wih deoptimized code continuation pc and ending with
-// the first argument of the deoptimized code.
+// Builds a deoptimization info table, one DeoptInfo at a time. Call AddXXX
+// methods in the order of their target, starting wih deoptimized code
+// continuation pc and ending with the first argument of the deoptimized
+// code. Call CreateDeoptInfo to write the accumulated instructions into
+// the heap and reset the builder's internal state for the next DeoptInfo.
class DeoptInfoBuilder : public ValueObject {
public:
+ explicit DeoptInfoBuilder(const intptr_t num_args);
+
// 'object_table' holds all objects referred to by DeoptInstr in
// all DeoptInfo instances for a single Code object.
- DeoptInfoBuilder(const GrowableObjectArray& object_table,
- const intptr_t num_args)
- : instructions_(),
- object_table_(object_table),
- num_args_(num_args) {}
+ const GrowableObjectArray& object_table() { return object_table_; }
// Return address before instruction.
void AddReturnAddressBefore(const Function& function,
@@ -151,15 +160,21 @@ class DeoptInfoBuilder : public ValueObject {
void AddCallerFp(intptr_t to_index);
void AddCallerPc(intptr_t to_index);
- RawDeoptInfo* CreateDeoptInfo() const;
+ RawDeoptInfo* CreateDeoptInfo();
private:
+ class TrieNode;
+
intptr_t FindOrAddObjectInTable(const Object& obj) const;
GrowableArray<DeoptInstr*> instructions_;
const GrowableObjectArray& object_table_;
const intptr_t num_args_;
+ // Used to compress entries by sharing suffixes.
+ TrieNode* trie_root_;
+ intptr_t current_info_number_;
+
DISALLOW_COPY_AND_ASSIGN(DeoptInfoBuilder);
};
« no previous file with comments | « runtime/vm/compiler.cc ('k') | runtime/vm/deopt_instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698