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

Unified Diff: runtime/vm/intermediate_language.h

Issue 10914314: Simple redundant load elimination. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: addressed comments Created 8 years, 3 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/flow_graph_optimizer.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/intermediate_language.h
===================================================================
--- runtime/vm/intermediate_language.h (revision 12420)
+++ runtime/vm/intermediate_language.h (working copy)
@@ -278,7 +278,8 @@
lifetime_position_(-1),
previous_(NULL),
next_(NULL),
- env_(NULL) { }
+ env_(NULL),
+ expr_id_(-1) { }
virtual Tag tag() const = 0;
@@ -311,6 +312,9 @@
// Returns true, if this instruction can deoptimize.
virtual bool CanDeoptimize() const = 0;
+ // Returns true if the instruction may have side effects.
+ virtual bool HasSideEffect() const = 0;
+
// Visiting support.
virtual void Accept(FlowGraphVisitor* visitor) = 0;
@@ -434,6 +438,10 @@
return Isolate::kNoDeoptId;
}
+ // Id for instructions used in CSE.
+ intptr_t expr_id() const { return expr_id_; }
+ void set_expr_id(intptr_t expr_id) { expr_id_ = expr_id; }
+
protected:
// Fetch deopt id without checking if this computation can deoptimize.
intptr_t GetDeoptId() const {
@@ -458,6 +466,8 @@
Instruction* previous_;
Instruction* next_;
Environment* env_;
+ intptr_t expr_id_;
+
DISALLOW_COPY_AND_ASSIGN(Instruction);
};
@@ -557,6 +567,8 @@
virtual bool CanDeoptimize() const { return false; }
+ virtual bool HasSideEffect() const { return false; }
+
MoveOperands* AddMove(Location dest, Location src) {
MoveOperands* move = new MoveOperands(dest, src);
moves_.Add(move);
@@ -659,6 +671,8 @@
virtual bool CanDeoptimize() const { return false; }
+ virtual bool HasSideEffect() const { return false; }
+
intptr_t try_index() const { return try_index_; }
BitVector* loop_info() const { return loop_info_; }
@@ -1086,6 +1100,8 @@
virtual bool CanDeoptimize() const { return false; }
+ virtual bool HasSideEffect() const { return false; }
+
// TODO(regis): This helper will be removed once we support type sets.
RawAbstractType* LeastSpecificInputType() const;
@@ -1159,6 +1175,8 @@
virtual bool CanDeoptimize() const { return false; }
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t Hashcode() const {
UNREACHABLE();
return 0;
@@ -1224,6 +1242,8 @@
virtual bool CanDeoptimize() const { return false; }
+ virtual bool HasSideEffect() const { return false; }
+
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual void PrintToVisualizer(BufferFormatter* f) const;
@@ -1252,6 +1272,8 @@
virtual bool CanDeoptimize() const { return false; }
+ virtual bool HasSideEffect() const { return false; }
+
virtual void PrintTo(BufferFormatter* f) const;
virtual void PrintToVisualizer(BufferFormatter* f) const;
@@ -1274,6 +1296,8 @@
virtual bool CanDeoptimize() const { return false; }
+ virtual bool HasSideEffect() const { return true; }
+
virtual void PrintTo(BufferFormatter* f) const;
virtual void PrintToVisualizer(BufferFormatter* f) const;
@@ -1296,6 +1320,8 @@
virtual bool CanDeoptimize() const { return false; }
+ virtual bool HasSideEffect() const { return true; }
+
virtual void PrintTo(BufferFormatter* f) const;
virtual void PrintToVisualizer(BufferFormatter* f) const;
@@ -1323,6 +1349,8 @@
virtual bool CanDeoptimize() const { return false; }
+ virtual bool HasSideEffect() const { return false; }
+
ParallelMoveInstr* parallel_move() const {
return parallel_move_;
}
@@ -1401,6 +1429,8 @@
void SetInputAt(intptr_t i, Value* value);
virtual bool CanDeoptimize() const;
+ virtual bool HasSideEffect() const;
+
ComparisonInstr* comparison() const { return comparison_; }
void set_comparison(ComparisonInstr* value) { comparison_ = value; }
@@ -1468,6 +1498,8 @@
virtual bool CanDeoptimize() const { return false; }
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const;
virtual bool AttributesEqual(Definition* other) const;
@@ -1523,6 +1555,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -1561,6 +1596,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kBoolCid; }
private:
@@ -1595,6 +1633,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kBoolCid; }
private:
@@ -1614,6 +1655,9 @@
virtual RawAbstractType* CompileType() const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -1634,6 +1678,9 @@
Value* value() const { return inputs_[0]; }
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kIllegalCid; }
private:
@@ -1662,6 +1709,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return true; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -1719,6 +1769,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return true; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -1761,6 +1814,9 @@
const ICData& ic_data() const { return ic_data_; }
virtual bool CanDeoptimize() const { return true; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
virtual void PrintOperandsTo(BufferFormatter* f) const;
@@ -1824,6 +1880,11 @@
}
+inline bool BranchInstr::HasSideEffect() const {
+ return comparison()->HasSideEffect();
+}
+
+
inline LocationSummary* BranchInstr::locs() {
if (comparison()->locs_ == NULL) {
LocationSummary* summary = comparison()->MakeLocationSummary();
@@ -1860,6 +1921,11 @@
virtual bool CanDeoptimize() const { return false; }
+ virtual bool HasSideEffect() const { return false; }
+
+ virtual bool AttributesEqual(Definition* other) const;
+ virtual bool AffectedBySideEffect() const { return false; }
+
virtual Definition* Canonicalize();
virtual intptr_t ResultCid() const { return kBoolCid; }
@@ -1905,6 +1971,10 @@
return (receiver_class_id() != kDoubleCid)
&& (receiver_class_id() != kSmiCid);
}
+ virtual bool HasSideEffect() const {
+ return (receiver_class_id() != kDoubleCid)
+ && (receiver_class_id() != kSmiCid);
+ }
virtual intptr_t ResultCid() const;
@@ -1966,6 +2036,10 @@
return (operands_class_id() != kDoubleCid)
&& (operands_class_id() != kSmiCid);
}
+ virtual bool HasSideEffect() const {
+ return (operands_class_id() != kDoubleCid)
+ && (operands_class_id() != kSmiCid);
+ }
virtual intptr_t ResultCid() const;
@@ -2022,6 +2096,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return true; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return result_cid_; }
void set_result_cid(intptr_t value) { result_cid_ = value; }
@@ -2051,6 +2128,12 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const {
+ UNREACHABLE();
+ return false;
+ }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2085,6 +2168,12 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const {
+ UNREACHABLE();
+ return false;
+ }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2126,6 +2215,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2162,6 +2254,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2184,6 +2279,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
virtual bool AffectedBySideEffect() const { return !field().is_final(); }
@@ -2214,6 +2312,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2239,6 +2340,9 @@
Value* index() const { return inputs_[1]; }
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2273,6 +2377,9 @@
}
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2296,6 +2403,9 @@
Value* value() const { return inputs_[0]; }
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kBoolCid; }
private:
@@ -2337,6 +2447,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kBoolCid; }
private:
@@ -2374,6 +2487,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2405,6 +2521,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2448,6 +2567,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2480,6 +2602,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2516,6 +2641,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return result_cid_; }
virtual bool AttributesEqual(Definition* other) const;
@@ -2557,6 +2685,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2591,6 +2722,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2625,6 +2759,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2655,6 +2792,9 @@
intptr_t token_pos() const { return ast_node_.token_pos(); }
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2680,6 +2820,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kDynamicCid; }
private:
@@ -2703,6 +2846,9 @@
Value* context_value() const { return inputs_[0]; }
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kIllegalCid; }
private:
@@ -2725,6 +2871,9 @@
virtual RawAbstractType* CompileType() const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kIllegalCid; }
private:
@@ -2749,6 +2898,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return true; }
+
virtual intptr_t ResultCid() const { return kIllegalCid; }
private:
@@ -2775,6 +2927,9 @@
virtual RawAbstractType* CompileType() const;
virtual bool CanDeoptimize() const { return true; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kIllegalCid; }
virtual bool AttributesEqual(Definition* other) const { return true; }
@@ -2805,6 +2960,9 @@
intptr_t token_pos() const { return token_pos_; }
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual bool AffectedBySideEffect() const { return false; }
virtual bool AttributesEqual(Definition* other) const { return true; }
@@ -2839,6 +2997,8 @@
return value()->ResultCid() != kDoubleCid;
}
+ virtual bool HasSideEffect() const { return false; }
+
// The output is not an instance but when it is boxed it becomes double.
virtual intptr_t ResultCid() const { return kDoubleCid; }
@@ -2868,6 +3028,7 @@
Value* value() const { return inputs_[0]; }
virtual bool CanDeoptimize() const { return false; }
+
virtual bool HasSideEffect() const { return false; }
virtual bool AttributesEqual(Definition* other) const {
@@ -2922,6 +3083,9 @@
virtual void PrintOperandsTo(BufferFormatter* f) const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual bool AffectedBySideEffect() const { return false; }
virtual bool AttributesEqual(Definition* other) const {
@@ -2986,6 +3150,11 @@
virtual bool CanDeoptimize() const;
+ virtual bool HasSideEffect() const { return false; }
+
+ virtual bool AffectedByEffect() const { return false; }
+ virtual bool AttributesEqual(Definition* other) const;
+
virtual intptr_t ResultCid() const;
private:
@@ -3025,6 +3194,9 @@
virtual RawAbstractType* CompileType() const;
virtual bool CanDeoptimize() const { return true; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const;
private:
@@ -3058,6 +3230,9 @@
virtual RawAbstractType* CompileType() const;
virtual bool CanDeoptimize() const { return op_kind() == Token::kNEGATE; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kSmiCid; }
private:
@@ -3087,6 +3262,9 @@
virtual RawAbstractType* CompileType() const;
virtual bool CanDeoptimize() const { return true; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kDoubleCid; }
private:
@@ -3107,6 +3285,9 @@
virtual RawAbstractType* CompileType() const;
virtual bool CanDeoptimize() const { return false; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kIllegalCid; }
private:
@@ -3132,6 +3313,9 @@
virtual RawAbstractType* CompileType() const;
virtual bool CanDeoptimize() const { return true; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kDoubleCid; }
private:
@@ -3154,6 +3338,9 @@
virtual intptr_t ArgumentCount() const { return 1; }
virtual bool CanDeoptimize() const { return true; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kDoubleCid; }
private:
@@ -3178,6 +3365,9 @@
virtual RawAbstractType* CompileType() const;
virtual bool CanDeoptimize() const { return true; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kIllegalCid; }
virtual bool AttributesEqual(Definition* other) const;
@@ -3212,6 +3402,9 @@
virtual RawAbstractType* CompileType() const;
virtual bool CanDeoptimize() const { return true; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kIllegalCid; }
virtual bool AttributesEqual(Definition* other) const { return true; }
@@ -3245,6 +3438,9 @@
virtual RawAbstractType* CompileType() const;
virtual bool CanDeoptimize() const { return true; }
+
+ virtual bool HasSideEffect() const { return false; }
+
virtual intptr_t ResultCid() const { return kIllegalCid; }
virtual bool AttributesEqual(Definition* other) const;
« no previous file with comments | « runtime/vm/flow_graph_optimizer.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698