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

Unified Diff: runtime/vm/flow_graph_optimizer.cc

Issue 328503003: Extend Range analysis to 64-bit range and mint operations (Closed) Base URL: https://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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/flow_graph_optimizer.cc
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 8ecbfe2b6673a00d9b17325846ee9d10bf73a3a3..541690bba01604bce325b240f381509dead7319a 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -4581,7 +4581,7 @@ class RangeAnalysis : public ValueObject {
private:
// Collect all values that were proven to be smi in smi_values_ array and all
// CheckSmi instructions in smi_check_ array.
- void CollectSmiValues();
+ void CollectValues();
// Iterate over smi values and constrain them at branch successors.
// Additionally constraint values after CheckSmi instructions.
@@ -4652,15 +4652,17 @@ class RangeAnalysis : public ValueObject {
FlowGraph* flow_graph_;
- GrowableArray<Definition*> smi_values_; // Value that are known to be smi.
- GrowableArray<CheckSmiInstr*> smi_checks_; // All CheckSmi instructions.
+ // Value that are known to be smi or mint.
+ GrowableArray<Definition*> values_;
+ // All CheckSmi instructions.
+ GrowableArray<CheckSmiInstr*> smi_checks_;
// All Constraints inserted during InsertConstraints phase. They are treated
// as smi values.
GrowableArray<ConstraintInstr*> constraints_;
- // Bitvector for a quick filtering of known smi values.
- BitVector* smi_definitions_;
+ // Bitvector for a quick filtering of known smi or mint values.
+ BitVector* definitions_;
// Worklist for induction variables analysis.
GrowableArray<Definition*> worklist_;
@@ -4671,20 +4673,22 @@ class RangeAnalysis : public ValueObject {
void RangeAnalysis::Analyze() {
- CollectSmiValues();
+ CollectValues();
InsertConstraints();
InferRanges();
RemoveConstraints();
}
-void RangeAnalysis::CollectSmiValues() {
+void RangeAnalysis::CollectValues() {
const GrowableArray<Definition*>& initial =
*flow_graph_->graph_entry()->initial_definitions();
for (intptr_t i = 0; i < initial.length(); ++i) {
Definition* current = initial[i];
if (current->Type()->ToCid() == kSmiCid) {
- smi_values_.Add(current);
+ values_.Add(current);
+ } else if (current->IsMintDefinition()) {
+ values_.Add(current);
}
}
@@ -4701,7 +4705,9 @@ void RangeAnalysis::CollectSmiValues() {
for (intptr_t i = 0; i < initial.length(); ++i) {
Definition* current = initial[i];
if (current->Type()->ToCid() == kSmiCid) {
- smi_values_.Add(current);
+ values_.Add(current);
+ } else if (current->IsMintDefinition()) {
+ values_.Add(current);
}
}
}
@@ -4711,7 +4717,9 @@ void RangeAnalysis::CollectSmiValues() {
for (PhiIterator phi_it(join); !phi_it.Done(); phi_it.Advance()) {
PhiInstr* current = phi_it.Current();
if (current->Type()->ToCid() == kSmiCid) {
- smi_values_.Add(current);
+ values_.Add(current);
+ } else if (current->IsMintDefinition()) {
+ values_.Add(current);
}
}
}
@@ -4724,7 +4732,10 @@ void RangeAnalysis::CollectSmiValues() {
if (defn != NULL) {
if ((defn->Type()->ToCid() == kSmiCid) &&
(defn->ssa_temp_index() != -1)) {
- smi_values_.Add(defn);
+ values_.Add(defn);
+ } else if ((defn->IsMintDefinition()) &&
+ (defn->ssa_temp_index() != -1)) {
+ values_.Add(defn);
}
} else if (current->IsCheckSmi()) {
smi_checks_.Add(current->AsCheckSmi());
@@ -4889,6 +4900,7 @@ void RangeAnalysis::ConstrainValueAfterBranch(Definition* defn, Value* use) {
}
}
+
void RangeAnalysis::InsertConstraintsFor(Definition* defn) {
for (Value* use = defn->input_use_list();
use != NULL;
@@ -4927,11 +4939,13 @@ void RangeAnalysis::ConstrainValueAfterCheckArrayBound(
void RangeAnalysis::InsertConstraints() {
for (intptr_t i = 0; i < smi_checks_.length(); i++) {
CheckSmiInstr* check = smi_checks_[i];
- InsertConstraintFor(check->value()->definition(), Range::Unknown(), check);
+ InsertConstraintFor(check->value()->definition(),
+ Range::UnknownSmi(),
+ check);
}
- for (intptr_t i = 0; i < smi_values_.length(); i++) {
- InsertConstraintsFor(smi_values_[i]);
+ for (intptr_t i = 0; i < values_.length(); i++) {
+ InsertConstraintsFor(values_[i]);
}
for (intptr_t i = 0; i < constraints_.length(); i++) {
@@ -4970,9 +4984,9 @@ RangeAnalysis::Direction RangeAnalysis::ToDirection(Value* val) {
: kNegative;
} else if (val->definition()->range() != NULL) {
Range* range = val->definition()->range();
- if (Range::ConstantMin(range).value() >= 0) {
+ if (Range::ConstantMin(range).ConstantValue() >= 0) {
return kPositive;
- } else if (Range::ConstantMax(range).value() <= 0) {
+ } else if (Range::ConstantMax(range).ConstantValue() <= 0) {
return kNegative;
}
}
@@ -5070,7 +5084,7 @@ Range* RangeAnalysis::InferInductionVariableRange(JoinEntryInstr* loop_header,
case kUnknown:
case kBoth:
- return Range::Unknown();
+ return Range::UnknownSmi();
}
UNREACHABLE();
@@ -5084,7 +5098,7 @@ void RangeAnalysis::InferRangesRecursive(BlockEntryInstr* block) {
const bool is_loop_header = (join->loop_info() != NULL);
for (PhiIterator it(join); !it.Done(); it.Advance()) {
PhiInstr* phi = it.Current();
- if (smi_definitions_->Contains(phi->ssa_temp_index())) {
+ if (definitions_->Contains(phi->ssa_temp_index())) {
if (is_loop_header) {
// Try recognizing simple induction variables.
Range* range = InferInductionVariableRange(join, phi);
@@ -5105,7 +5119,7 @@ void RangeAnalysis::InferRangesRecursive(BlockEntryInstr* block) {
Definition* defn = current->AsDefinition();
if ((defn != NULL) &&
(defn->ssa_temp_index() != -1) &&
- smi_definitions_->Contains(defn->ssa_temp_index())) {
+ definitions_->Contains(defn->ssa_temp_index())) {
defn->InferRange();
} else if (FLAG_array_bounds_check_elimination &&
current->IsCheckArrayBound()) {
@@ -5126,13 +5140,13 @@ void RangeAnalysis::InferRangesRecursive(BlockEntryInstr* block) {
void RangeAnalysis::InferRanges() {
// Initialize bitvector for quick filtering of smi values.
- smi_definitions_ =
+ definitions_ =
new(isolate()) BitVector(flow_graph_->current_ssa_temp_index());
- for (intptr_t i = 0; i < smi_values_.length(); i++) {
- smi_definitions_->Add(smi_values_[i]->ssa_temp_index());
+ for (intptr_t i = 0; i < values_.length(); i++) {
+ definitions_->Add(values_[i]->ssa_temp_index());
}
for (intptr_t i = 0; i < constraints_.length(); i++) {
- smi_definitions_->Add(constraints_[i]->ssa_temp_index());
+ definitions_->Add(constraints_[i]->ssa_temp_index());
}
// Infer initial values of ranges.
@@ -5140,7 +5154,7 @@ void RangeAnalysis::InferRanges() {
*flow_graph_->graph_entry()->initial_definitions();
for (intptr_t i = 0; i < initial.length(); ++i) {
Definition* definition = initial[i];
- if (smi_definitions_->Contains(definition->ssa_temp_index())) {
+ if (definitions_->Contains(definition->ssa_temp_index())) {
definition->InferRange();
}
}
@@ -5168,7 +5182,7 @@ void RangeAnalysis::RemoveConstraints() {
}
-void FlowGraphOptimizer::InferSmiRanges() {
+void FlowGraphOptimizer::InferIntRanges() {
RangeAnalysis range_analysis(flow_graph_);
range_analysis.Analyze();
}

Powered by Google App Engine
This is Rietveld 408576698