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

Unified Diff: src/hydrogen-instructions.h

Issue 15861009: Tag smi-constants as smi. This also fixes code that copies holes into arrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed comments Created 7 years, 7 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
« no previous file with comments | « src/hydrogen.cc ('k') | src/hydrogen-instructions.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/hydrogen-instructions.h
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
index daeba2d2a36faa712650521b052595522047c8e0..f6b6ae0a886d762609aff4190ff064db691c5401 100644
--- a/src/hydrogen-instructions.h
+++ b/src/hydrogen-instructions.h
@@ -3227,7 +3227,7 @@ class HConstant: public HTemplateInstruction<0> {
return int32_value_;
}
bool HasSmiValue() const {
- return HasInteger32Value() && Smi::IsValid(Integer32Value());
+ return has_smi_value_;
}
bool HasDoubleValue() const { return has_double_value_; }
double DoubleValue() const {
@@ -3327,6 +3327,7 @@ class HConstant: public HTemplateInstruction<0> {
// int32_value_ and double_value_ hold valid, safe representations
// of the constant. has_int32_value_ implies has_double_value_ but
// not the converse.
+ bool has_smi_value_ : 1;
bool has_int32_value_ : 1;
bool has_double_value_ : 1;
bool is_internalized_string_ : 1; // TODO(yangguo): make this part of HType.
@@ -3395,6 +3396,16 @@ class HBinaryOperation: public HTemplateInstruction<3> {
virtual Representation RepresentationFromInputs();
virtual void AssumeRepresentation(Representation r);
+ virtual void UpdateRepresentation(Representation new_rep,
+ HInferRepresentation* h_infer,
+ const char* reason) {
+ // By default, binary operations don't handle Smis.
+ if (new_rep.IsSmi()) {
+ new_rep = Representation::Integer32();
+ }
+ HValue::UpdateRepresentation(new_rep, h_infer, reason);
+ }
+
virtual bool IsCommutative() const { return false; }
virtual void PrintDataTo(StringStream* stream);
@@ -3556,22 +3567,13 @@ class HBoundsCheck: public HTemplateInstruction<2> {
// it makes sense to invoke this constructor directly.
HBoundsCheck(HValue* index,
HValue* length,
- BoundsCheckKeyMode key_mode = DONT_ALLOW_SMI_KEY,
- Representation r = Representation::None())
+ BoundsCheckKeyMode key_mode = DONT_ALLOW_SMI_KEY)
: key_mode_(key_mode), skip_check_(false),
base_(NULL), offset_(0), scale_(0),
responsibility_direction_(DIRECTION_NONE) {
SetOperandAt(0, index);
SetOperandAt(1, length);
- if (r.IsNone()) {
- // In the normal compilation pipeline the representation is flexible
- // (see InferRepresentation).
- SetFlag(kFlexibleRepresentation);
- } else {
- // When compiling stubs we want to set the representation explicitly
- // so the compilation pipeline can skip the HInferRepresentation phase.
- set_representation(r);
- }
+ SetFlag(kFlexibleRepresentation);
SetFlag(kUseGVN);
}
@@ -3718,7 +3720,9 @@ class HBitwiseBinaryOperation: public HBinaryOperation {
HInferRepresentation* h_infer,
const char* reason) {
// We only generate either int32 or generic tagged bitwise operations.
- if (new_rep.IsDouble()) new_rep = Representation::Integer32();
+ if (new_rep.IsSmi() || new_rep.IsDouble()) {
+ new_rep = Representation::Integer32();
+ }
HValue::UpdateRepresentation(new_rep, h_infer, reason);
}
« no previous file with comments | « src/hydrogen.cc ('k') | src/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698