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

Unified Diff: runtime/vm/intermediate_language.h

Issue 14057004: Convert diamond shaped control flow into a single conditional instruction. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address Florian's comments Created 7 years, 8 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
Index: runtime/vm/intermediate_language.h
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index ac497ff5ea74f2a71dbaff1d97f2598fa80b0f54..8184f649fc719fa7dd609a3872782ff4abe51e05 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -499,7 +499,7 @@ class EmbeddedArray<T, 0> {
M(StringFromCharCode) \
M(InvokeMathCFunction) \
M(GuardField) \
-
+ M(IfThenElse) \
#define FORWARD_DECLARATION(type) class type##Instr;
FOR_EACH_INSTRUCTION(FORWARD_DECLARATION)
@@ -1001,6 +1001,8 @@ class BlockEntryInstr : public Instruction {
// successors.
void ReplaceAsPredecessorWith(BlockEntryInstr* new_block);
+ void set_block_id(intptr_t block_id) { block_id_ = block_id; }
+
protected:
BlockEntryInstr(intptr_t block_id, intptr_t try_index)
: block_id_(block_id),
@@ -1019,7 +1021,7 @@ class BlockEntryInstr : public Instruction {
virtual void ClearPredecessors() = 0;
virtual void AddPredecessor(BlockEntryInstr* predecessor) = 0;
- const intptr_t block_id_;
+ intptr_t block_id_;
const intptr_t try_index_;
intptr_t preorder_number_;
intptr_t postorder_number_;
@@ -2677,6 +2679,65 @@ class RelationalOpInstr : public ComparisonInstr {
};
+// TODO(vegorov): ComparisonInstr should be switched to use IfTheElseInstr for
+// materialization of true and false constants.
+class IfThenElseInstr : public TemplateDefinition<2> {
+ public:
+ IfThenElseInstr(Token::Kind kind,
+ Value* left,
+ Value* right,
+ Value* if_true,
+ Value* if_false)
+ : kind_(kind),
+ if_true_(Smi::Cast(if_true->BoundConstant()).Value()),
+ if_false_(Smi::Cast(if_false->BoundConstant()).Value()) {
+ ASSERT(Token::IsEqualityOperator(kind));
+ SetInputAt(0, left);
+ SetInputAt(1, right);
+ }
+
+ // Returns true if this instruction is supported on the current platform.
+ static bool IsSupported();
+
+ // Returns true if this combination of comparison and values flowing on
+ // the true and false paths is supported on the current platform.
+ static bool Supports(ComparisonInstr* comparison, Value* v1, Value* v2);
+
+ DECLARE_INSTRUCTION(IfThenElse)
+
+ virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+ virtual CompileType ComputeType() const;
+
+ virtual void InferRange();
+
+ virtual bool CanDeoptimize() const { return false; }
+ virtual bool HasSideEffect() const { return false; }
+
+ virtual bool AttributesEqual(Instruction* other) const {
+ return kind_ == other->AsIfThenElse()->kind_;
+ }
+
+ virtual bool AffectedBySideEffect() const {
+ return false;
+ }
+
+ Value* left() const { return inputs_[0]; }
+ Value* right() const { return inputs_[1]; }
+ intptr_t if_true() const { return if_true_; }
+ intptr_t if_false() const { return if_false_; }
+
+ Token::Kind kind() const { return kind_; }
+
+ private:
+ const Token::Kind kind_;
+ const intptr_t if_true_;
+ const intptr_t if_false_;
+
+ DISALLOW_COPY_AND_ASSIGN(IfThenElseInstr);
+};
+
+
class StaticCallInstr : public TemplateDefinition<0> {
public:
StaticCallInstr(intptr_t token_pos,

Powered by Google App Engine
This is Rietveld 408576698