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

Unified Diff: src/hydrogen-instructions.h

Issue 20241005: Fix IsDeletable() for HStringAdd, HStringCharCodeAt, HStringCharFromCode. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 5 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: src/hydrogen-instructions.h
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
index b43efc80baa9cb111b764a375e656ab9f522538e..dc657645e3d8dfd1791ccce741403a8450845862 100644
--- a/src/hydrogen-instructions.h
+++ b/src/hydrogen-instructions.h
@@ -1142,6 +1142,18 @@ class HValue: public ZoneObject {
}
}
+ // Returns true conservatively if the program might be able to observe a
+ // ToString() operation on this value.
+ bool ToStringCanBeObserved() const {
+ return !type().IsString() && representation().IsTagged();
+ }
+
+ // Returns true conservatively if the program might be able to observe a
+ // ToNumber() operation on this value.
+ bool ToNumberCanBeObserved() const {
+ return !type().IsString() && representation().IsTagged();
Michael Starzinger 2013/07/25 14:43:18 This predicate looks broken. Shouldn't that be typ
+ }
+
protected:
void TryGuaranteeRangeRecursive(RangeEvaluationContext* context);
@@ -3671,9 +3683,9 @@ class HBinaryOperation: public HTemplateInstruction<3> {
observed_input_representation_[1] = Representation::None();
}
- HValue* context() { return OperandAt(0); }
- HValue* left() { return OperandAt(1); }
- HValue* right() { return OperandAt(2); }
+ HValue* context() const { return OperandAt(0); }
+ HValue* left() const { return OperandAt(1); }
+ HValue* right() const { return OperandAt(2); }
// True if switching left and right operands likely generates better code.
bool AreOperandsBetterSwitched() {
@@ -6396,8 +6408,11 @@ class HStringAdd: public HBinaryOperation {
SetGVNFlag(kChangesNewSpacePromotion);
}
- // TODO(svenpanne) Might be safe, but leave it out until we know for sure.
- // virtual bool IsDeletable() const { return true; }
+ virtual bool IsDeletable() const {
+ if (flags_ == STRING_ADD_CHECK_NONE) return true;
+ return !left()->ToStringCanBeObserved()
+ && !right()->ToStringCanBeObserved();
+ }
const StringAddFlags flags_;
};
@@ -6422,9 +6437,9 @@ class HStringCharCodeAt: public HTemplateInstruction<3> {
: Representation::Tagged();
}
- HValue* context() { return OperandAt(0); }
- HValue* string() { return OperandAt(1); }
- HValue* index() { return OperandAt(2); }
+ HValue* context() const { return OperandAt(0); }
+ HValue* string() const { return OperandAt(1); }
+ HValue* index() const { return OperandAt(2); }
DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt)
@@ -6435,9 +6450,11 @@ class HStringCharCodeAt: public HTemplateInstruction<3> {
return new(zone) Range(0, String::kMaxUtf16CodeUnit);
}
- // TODO(svenpanne) Might be safe, but leave it out until we know for sure.
- // private:
- // virtual bool IsDeletable() const { return true; }
+ private:
+ virtual bool IsDeletable() const {
+ // NOTE: we assume this instruction is dominated by a string typecheck.
+ return !index()->ToNumberCanBeObserved();
+ }
};
@@ -6452,15 +6469,19 @@ class HStringCharFromCode: public HTemplateInstruction<2> {
? Representation::Tagged()
: Representation::Integer32();
}
- virtual HType CalculateInferredType();
+ virtual HType CalculateInferredType() { return HType::String(); }
- HValue* context() { return OperandAt(0); }
- HValue* value() { return OperandAt(1); }
+ HValue* context() const { return OperandAt(0); }
+ HValue* value() const { return OperandAt(1); }
virtual bool DataEquals(HValue* other) { return true; }
DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode)
+ virtual bool IsDeletable() const {
Michael Starzinger 2013/07/25 14:43:18 nit: This should be private, please move it back d
titzer 2013/07/25 15:32:55 Done.
+ return !value()->ToNumberCanBeObserved();
+ }
+
private:
HStringCharFromCode(HValue* context, HValue* char_code) {
SetOperandAt(0, context);
@@ -6469,9 +6490,6 @@ class HStringCharFromCode: public HTemplateInstruction<2> {
SetFlag(kUseGVN);
SetGVNFlag(kChangesNewSpacePromotion);
}
-
- // TODO(svenpanne) Might be safe, but leave it out until we know for sure.
- // virtual bool IsDeletable() const { return true; }
};
« src/hydrogen.cc ('K') | « src/hydrogen.cc ('k') | src/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698