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

Side by Side Diff: runtime/vm/intermediate_language.h

Issue 353513002: Use range information for optimizing integer boxing and fix bug in range analysis. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_
6 #define VM_INTERMEDIATE_LANGUAGE_H_ 6 #define VM_INTERMEDIATE_LANGUAGE_H_
7 7
8 #include "vm/allocation.h" 8 #include "vm/allocation.h"
9 #include "vm/ast.h" 9 #include "vm/ast.h"
10 #include "vm/growable_array.h" 10 #include "vm/growable_array.h"
(...skipping 1792 matching lines...) Expand 10 before | Expand all | Expand 10 after
1803 virtual CompileType* ComputeInitialType() const { 1803 virtual CompileType* ComputeInitialType() const {
1804 return ZoneCompileType::Wrap(ComputeType()); 1804 return ZoneCompileType::Wrap(ComputeType());
1805 } 1805 }
1806 1806
1807 // Does this define a mint? 1807 // Does this define a mint?
1808 bool IsMintDefinition() { 1808 bool IsMintDefinition() {
1809 return (Type()->ToCid() == kMintCid) || 1809 return (Type()->ToCid() == kMintCid) ||
1810 IsBinaryMintOp() || 1810 IsBinaryMintOp() ||
1811 IsUnaryMintOp() || 1811 IsUnaryMintOp() ||
1812 IsShiftMintOp() || 1812 IsShiftMintOp() ||
1813 IsBoxInteger() ||
1813 IsUnboxInteger(); 1814 IsUnboxInteger();
1814 } 1815 }
1815 1816
1816 // Compute compile type for this definition. It is safe to use this 1817 // Compute compile type for this definition. It is safe to use this
1817 // approximation even before type propagator was run (e.g. during graph 1818 // approximation even before type propagator was run (e.g. during graph
1818 // building). 1819 // building).
1819 virtual CompileType ComputeType() const { 1820 virtual CompileType ComputeType() const {
1820 return CompileType::Dynamic(); 1821 return CompileType::Dynamic();
1821 } 1822 }
1822 1823
(...skipping 3265 matching lines...) Expand 10 before | Expand all | Expand 10 after
5088 5089
5089 Definition* Canonicalize(FlowGraph* flow_graph); 5090 Definition* Canonicalize(FlowGraph* flow_graph);
5090 5091
5091 private: 5092 private:
5092 DISALLOW_COPY_AND_ASSIGN(BoxInt32x4Instr); 5093 DISALLOW_COPY_AND_ASSIGN(BoxInt32x4Instr);
5093 }; 5094 };
5094 5095
5095 5096
5096 class BoxIntegerInstr : public TemplateDefinition<1> { 5097 class BoxIntegerInstr : public TemplateDefinition<1> {
5097 public: 5098 public:
5098 explicit BoxIntegerInstr(Value* value) { 5099 explicit BoxIntegerInstr(Value* value) : is_smi_(false) {
5099 SetInputAt(0, value); 5100 SetInputAt(0, value);
5100 } 5101 }
5101 5102
5102 Value* value() const { return inputs_[0]; } 5103 Value* value() const { return inputs_[0]; }
5103 5104
5105 bool is_smi() const { return is_smi_; }
5106 void set_is_smi(bool is_smi) { is_smi_ = is_smi; }
5107
5104 virtual bool CanDeoptimize() const { return false; } 5108 virtual bool CanDeoptimize() const { return false; }
5105 5109
5106 virtual intptr_t DeoptimizationTarget() const { 5110 virtual intptr_t DeoptimizationTarget() const {
5107 return Isolate::kNoDeoptId; 5111 return Isolate::kNoDeoptId;
5108 } 5112 }
5109 5113
5110 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5114 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5111 ASSERT(idx == 0); 5115 ASSERT(idx == 0);
5112 return kUnboxedMint; 5116 return kUnboxedMint;
5113 } 5117 }
5114 5118
5115 DECLARE_INSTRUCTION(BoxInteger) 5119 DECLARE_INSTRUCTION(BoxInteger)
5116 virtual CompileType ComputeType() const; 5120 virtual CompileType ComputeType() const;
5121 virtual bool RecomputeType();
5122
5123 virtual void InferRange();
5117 5124
5118 virtual bool AllowsCSE() const { return true; } 5125 virtual bool AllowsCSE() const { return true; }
5119 virtual EffectSet Effects() const { return EffectSet::None(); } 5126 virtual EffectSet Effects() const { return EffectSet::None(); }
5120 virtual EffectSet Dependencies() const { return EffectSet::None(); } 5127 virtual EffectSet Dependencies() const { return EffectSet::None(); }
5121 virtual bool AttributesEqual(Instruction* other) const { return true; } 5128 virtual bool AttributesEqual(Instruction* other) const { return true; }
5122 5129
5123 virtual bool MayThrow() const { return false; } 5130 virtual bool MayThrow() const { return false; }
5124 5131
5125 private: 5132 private:
5133 bool is_smi_;
5134
5126 DISALLOW_COPY_AND_ASSIGN(BoxIntegerInstr); 5135 DISALLOW_COPY_AND_ASSIGN(BoxIntegerInstr);
5127 }; 5136 };
5128 5137
5129 5138
5130 class UnboxDoubleInstr : public TemplateDefinition<1> { 5139 class UnboxDoubleInstr : public TemplateDefinition<1> {
5131 public: 5140 public:
5132 UnboxDoubleInstr(Value* value, intptr_t deopt_id) { 5141 UnboxDoubleInstr(Value* value, intptr_t deopt_id) {
5133 SetInputAt(0, value); 5142 SetInputAt(0, value);
5134 deopt_id_ = deopt_id; 5143 deopt_id_ = deopt_id;
5135 } 5144 }
(...skipping 1995 matching lines...) Expand 10 before | Expand all | Expand 10 after
7131 ASSERT((idx == 0) || (idx == 1)); 7140 ASSERT((idx == 0) || (idx == 1));
7132 return (idx == 0) ? kUnboxedMint : kTagged; 7141 return (idx == 0) ? kUnboxedMint : kTagged;
7133 } 7142 }
7134 7143
7135 virtual intptr_t DeoptimizationTarget() const { 7144 virtual intptr_t DeoptimizationTarget() const {
7136 // Direct access since this instruction cannot deoptimize, and the deopt-id 7145 // Direct access since this instruction cannot deoptimize, and the deopt-id
7137 // was inherited from another instruction that could deoptimize. 7146 // was inherited from another instruction that could deoptimize.
7138 return deopt_id_; 7147 return deopt_id_;
7139 } 7148 }
7140 7149
7150 virtual void InferRange();
7151
7141 DECLARE_INSTRUCTION(ShiftMintOp) 7152 DECLARE_INSTRUCTION(ShiftMintOp)
7142 7153
7143 virtual bool AllowsCSE() const { return true; } 7154 virtual bool AllowsCSE() const { return true; }
7144 virtual EffectSet Effects() const { return EffectSet::None(); } 7155 virtual EffectSet Effects() const { return EffectSet::None(); }
7145 virtual EffectSet Dependencies() const { return EffectSet::None(); } 7156 virtual EffectSet Dependencies() const { return EffectSet::None(); }
7146 virtual bool AttributesEqual(Instruction* other) const { 7157 virtual bool AttributesEqual(Instruction* other) const {
7147 return op_kind() == other->AsShiftMintOp()->op_kind(); 7158 return op_kind() == other->AsShiftMintOp()->op_kind();
7148 } 7159 }
7149 7160
7150 virtual bool MayThrow() const { return false; } 7161 virtual bool MayThrow() const { return false; }
(...skipping 1041 matching lines...) Expand 10 before | Expand all | Expand 10 after
8192 ForwardInstructionIterator* current_iterator_; 8203 ForwardInstructionIterator* current_iterator_;
8193 8204
8194 private: 8205 private:
8195 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); 8206 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor);
8196 }; 8207 };
8197 8208
8198 8209
8199 } // namespace dart 8210 } // namespace dart
8200 8211
8201 #endif // VM_INTERMEDIATE_LANGUAGE_H_ 8212 #endif // VM_INTERMEDIATE_LANGUAGE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698