Mark HChange that convert to int32 with truncation with the appropiate flag.
Before we would compute the flag by iterating over all uses. The truncating flag is always determined at construction time since we already computed the flag for all other instructions before inserting HChange instructions. Review URL: http://codereview.chromium.org/6615012 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7047 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
df5c259bb2
commit
db9e6dcd86
@ -940,13 +940,14 @@ class HChange: public HUnaryOperation {
|
||||
public:
|
||||
HChange(HValue* value,
|
||||
Representation from,
|
||||
Representation to)
|
||||
Representation to,
|
||||
bool is_truncating)
|
||||
: HUnaryOperation(value), from_(from), to_(to) {
|
||||
ASSERT(!from.IsNone() && !to.IsNone());
|
||||
ASSERT(!from.Equals(to));
|
||||
set_representation(to);
|
||||
SetFlag(kUseGVN);
|
||||
|
||||
if (is_truncating) SetFlag(kTruncatingToInt32);
|
||||
if (from.IsInteger32() && to.IsTagged() && value->range() != NULL &&
|
||||
value->range()->IsInSmiRange()) {
|
||||
set_type(HType::Smi());
|
||||
@ -961,12 +962,7 @@ class HChange: public HUnaryOperation {
|
||||
return from_;
|
||||
}
|
||||
|
||||
bool CanTruncateToInt32() const {
|
||||
for (int i = 0; i < uses()->length(); ++i) {
|
||||
if (!uses()->at(i)->CheckFlag(HValue::kTruncatingToInt32)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); }
|
||||
|
||||
virtual void PrintDataTo(StringStream* stream);
|
||||
|
||||
@ -978,8 +974,7 @@ class HChange: public HUnaryOperation {
|
||||
if (!other->IsChange()) return false;
|
||||
HChange* change = HChange::cast(other);
|
||||
return value() == change->value()
|
||||
&& to().Equals(change->to())
|
||||
&& CanTruncateToInt32() == change->CanTruncateToInt32();
|
||||
&& to().Equals(change->to());
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -1663,8 +1663,7 @@ void HGraph::PropagateMinusZeroChecks(HValue* value, BitVector* visited) {
|
||||
|
||||
void HGraph::InsertRepresentationChangeForUse(HValue* value,
|
||||
HValue* use,
|
||||
Representation to,
|
||||
bool is_truncating) {
|
||||
Representation to) {
|
||||
// Insert the representation change right before its use. For phi-uses we
|
||||
// insert at the end of the corresponding predecessor.
|
||||
HInstruction* next = NULL;
|
||||
@ -1681,6 +1680,7 @@ void HGraph::InsertRepresentationChangeForUse(HValue* value,
|
||||
// information we treat constants like normal instructions and insert the
|
||||
// change instructions for them.
|
||||
HInstruction* new_value = NULL;
|
||||
bool is_truncating = use->CheckFlag(HValue::kTruncatingToInt32);
|
||||
if (value->IsConstant()) {
|
||||
HConstant* constant = HConstant::cast(value);
|
||||
// Try to create a new copy of the constant with the new representation.
|
||||
@ -1690,7 +1690,7 @@ void HGraph::InsertRepresentationChangeForUse(HValue* value,
|
||||
}
|
||||
|
||||
if (new_value == NULL) {
|
||||
new_value = new HChange(value, value->representation(), to);
|
||||
new_value = new HChange(value, value->representation(), to, is_truncating);
|
||||
}
|
||||
|
||||
new_value->InsertBefore(next);
|
||||
@ -1765,8 +1765,7 @@ void HGraph::InsertRepresentationChanges(HValue* current) {
|
||||
for (int i = 0; i < to_convert.length(); ++i) {
|
||||
HValue* use = to_convert[i];
|
||||
Representation r_to = to_convert_reps[i];
|
||||
bool is_truncating = use->CheckFlag(HValue::kTruncatingToInt32);
|
||||
InsertRepresentationChangeForUse(current, use, r_to, is_truncating);
|
||||
InsertRepresentationChangeForUse(current, use, r_to);
|
||||
}
|
||||
|
||||
if (current->uses()->is_empty()) {
|
||||
|
@ -302,8 +302,7 @@ class HGraph: public HSubgraph {
|
||||
void PropagateMinusZeroChecks(HValue* value, BitVector* visited);
|
||||
void InsertRepresentationChangeForUse(HValue* value,
|
||||
HValue* use,
|
||||
Representation to,
|
||||
bool truncating);
|
||||
Representation to);
|
||||
void InsertRepresentationChanges(HValue* current);
|
||||
void InferTypes(ZoneList<HValue*>* worklist);
|
||||
void InitializeInferredTypes(int from_inclusive, int to_inclusive);
|
||||
|
Loading…
Reference in New Issue
Block a user