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

Side by Side Diff: src/hydrogen-instructions.h

Issue 10119016: Fix missing GVN flag for new-space promotion. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: HChange can only affect new-space when boxing numbers. Created 8 years, 8 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
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-123919.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1205 matching lines...) Expand 10 before | Expand all | Expand 10 after
1216 bool is_truncating, 1216 bool is_truncating,
1217 bool deoptimize_on_undefined) 1217 bool deoptimize_on_undefined)
1218 : HUnaryOperation(value) { 1218 : HUnaryOperation(value) {
1219 ASSERT(!value->representation().IsNone() && !to.IsNone()); 1219 ASSERT(!value->representation().IsNone() && !to.IsNone());
1220 ASSERT(!value->representation().Equals(to)); 1220 ASSERT(!value->representation().Equals(to));
1221 set_representation(to); 1221 set_representation(to);
1222 set_type(HType::TaggedNumber()); 1222 set_type(HType::TaggedNumber());
1223 SetFlag(kUseGVN); 1223 SetFlag(kUseGVN);
1224 if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined); 1224 if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined);
1225 if (is_truncating) SetFlag(kTruncatingToInt32); 1225 if (is_truncating) SetFlag(kTruncatingToInt32);
1226 if (to.IsTagged()) SetGVNFlag(kChangesNewSpacePromotion);
1226 } 1227 }
1227 1228
1228 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 1229 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1229 virtual HType CalculateInferredType(); 1230 virtual HType CalculateInferredType();
1230 virtual HValue* Canonicalize(); 1231 virtual HValue* Canonicalize();
1231 1232
1232 Representation from() { return value()->representation(); } 1233 Representation from() { return value()->representation(); }
1233 Representation to() { return representation(); } 1234 Representation to() { return representation(); }
1234 bool deoptimize_on_undefined() const { 1235 bool deoptimize_on_undefined() const {
1235 return CheckFlag(kDeoptimizeOnUndefined); 1236 return CheckFlag(kDeoptimizeOnUndefined);
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1341 1342
1342 class HStackCheck: public HTemplateInstruction<1> { 1343 class HStackCheck: public HTemplateInstruction<1> {
1343 public: 1344 public:
1344 enum Type { 1345 enum Type {
1345 kFunctionEntry, 1346 kFunctionEntry,
1346 kBackwardsBranch 1347 kBackwardsBranch
1347 }; 1348 };
1348 1349
1349 HStackCheck(HValue* context, Type type) : type_(type) { 1350 HStackCheck(HValue* context, Type type) : type_(type) {
1350 SetOperandAt(0, context); 1351 SetOperandAt(0, context);
1352 SetGVNFlag(kChangesNewSpacePromotion);
1351 } 1353 }
1352 1354
1353 HValue* context() { return OperandAt(0); } 1355 HValue* context() { return OperandAt(0); }
1354 1356
1355 virtual Representation RequiredInputRepresentation(int index) { 1357 virtual Representation RequiredInputRepresentation(int index) {
1356 return Representation::Tagged(); 1358 return Representation::Tagged();
1357 } 1359 }
1358 1360
1359 void Eliminate() { 1361 void Eliminate() {
1360 // The stack check eliminator might try to eliminate the same stack 1362 // The stack check eliminator might try to eliminate the same stack
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after
1919 SetOperandAt(1, value); 1921 SetOperandAt(1, value);
1920 switch (op) { 1922 switch (op) {
1921 case kMathFloor: 1923 case kMathFloor:
1922 case kMathRound: 1924 case kMathRound:
1923 case kMathCeil: 1925 case kMathCeil:
1924 set_representation(Representation::Integer32()); 1926 set_representation(Representation::Integer32());
1925 break; 1927 break;
1926 case kMathAbs: 1928 case kMathAbs:
1927 set_representation(Representation::Tagged()); 1929 set_representation(Representation::Tagged());
1928 SetFlag(kFlexibleRepresentation); 1930 SetFlag(kFlexibleRepresentation);
1931 SetGVNFlag(kChangesNewSpacePromotion);
1929 break; 1932 break;
1930 case kMathSqrt: 1933 case kMathSqrt:
1931 case kMathPowHalf: 1934 case kMathPowHalf:
1932 case kMathLog: 1935 case kMathLog:
1933 case kMathSin: 1936 case kMathSin:
1934 case kMathCos: 1937 case kMathCos:
1935 case kMathTan: 1938 case kMathTan:
1936 set_representation(Representation::Double()); 1939 set_representation(Representation::Double());
1940 SetGVNFlag(kChangesNewSpacePromotion);
1937 break; 1941 break;
1938 default: 1942 default:
1939 UNREACHABLE(); 1943 UNREACHABLE();
1940 } 1944 }
1941 SetFlag(kUseGVN); 1945 SetFlag(kUseGVN);
1942 } 1946 }
1943 1947
1944 HValue* context() { return OperandAt(0); } 1948 HValue* context() { return OperandAt(0); }
1945 HValue* value() { return OperandAt(1); } 1949 HValue* value() { return OperandAt(1); }
1946 1950
(...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after
3147 }; 3151 };
3148 3152
3149 3153
3150 class HPower: public HTemplateInstruction<2> { 3154 class HPower: public HTemplateInstruction<2> {
3151 public: 3155 public:
3152 HPower(HValue* left, HValue* right) { 3156 HPower(HValue* left, HValue* right) {
3153 SetOperandAt(0, left); 3157 SetOperandAt(0, left);
3154 SetOperandAt(1, right); 3158 SetOperandAt(1, right);
3155 set_representation(Representation::Double()); 3159 set_representation(Representation::Double());
3156 SetFlag(kUseGVN); 3160 SetFlag(kUseGVN);
3161 SetGVNFlag(kChangesNewSpacePromotion);
3157 } 3162 }
3158 3163
3159 HValue* left() { return OperandAt(0); } 3164 HValue* left() { return OperandAt(0); }
3160 HValue* right() { return OperandAt(1); } 3165 HValue* right() { return OperandAt(1); }
3161 3166
3162 virtual Representation RequiredInputRepresentation(int index) { 3167 virtual Representation RequiredInputRepresentation(int index) {
3163 return index == 0 3168 return index == 0
3164 ? Representation::Double() 3169 ? Representation::Double()
3165 : Representation::None(); 3170 : Representation::None();
3166 } 3171 }
(...skipping 1149 matching lines...) Expand 10 before | Expand all | Expand 10 after
4316 public: 4321 public:
4317 HTransitionElementsKind(HValue* object, 4322 HTransitionElementsKind(HValue* object,
4318 Handle<Map> original_map, 4323 Handle<Map> original_map,
4319 Handle<Map> transitioned_map) 4324 Handle<Map> transitioned_map)
4320 : original_map_(original_map), 4325 : original_map_(original_map),
4321 transitioned_map_(transitioned_map) { 4326 transitioned_map_(transitioned_map) {
4322 SetOperandAt(0, object); 4327 SetOperandAt(0, object);
4323 SetFlag(kUseGVN); 4328 SetFlag(kUseGVN);
4324 SetGVNFlag(kChangesElementsKind); 4329 SetGVNFlag(kChangesElementsKind);
4325 SetGVNFlag(kChangesElementsPointer); 4330 SetGVNFlag(kChangesElementsPointer);
4331 SetGVNFlag(kChangesNewSpacePromotion);
4326 set_representation(Representation::Tagged()); 4332 set_representation(Representation::Tagged());
4327 } 4333 }
4328 4334
4329 virtual Representation RequiredInputRepresentation(int index) { 4335 virtual Representation RequiredInputRepresentation(int index) {
4330 return Representation::Tagged(); 4336 return Representation::Tagged();
4331 } 4337 }
4332 4338
4333 HValue* object() { return OperandAt(0); } 4339 HValue* object() { return OperandAt(0); }
4334 Handle<Map> original_map() { return original_map_; } 4340 Handle<Map> original_map() { return original_map_; }
4335 Handle<Map> transitioned_map() { return transitioned_map_; } 4341 Handle<Map> transitioned_map() { return transitioned_map_; }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
4377 4383
4378 class HStringCharCodeAt: public HTemplateInstruction<3> { 4384 class HStringCharCodeAt: public HTemplateInstruction<3> {
4379 public: 4385 public:
4380 HStringCharCodeAt(HValue* context, HValue* string, HValue* index) { 4386 HStringCharCodeAt(HValue* context, HValue* string, HValue* index) {
4381 SetOperandAt(0, context); 4387 SetOperandAt(0, context);
4382 SetOperandAt(1, string); 4388 SetOperandAt(1, string);
4383 SetOperandAt(2, index); 4389 SetOperandAt(2, index);
4384 set_representation(Representation::Integer32()); 4390 set_representation(Representation::Integer32());
4385 SetFlag(kUseGVN); 4391 SetFlag(kUseGVN);
4386 SetGVNFlag(kDependsOnMaps); 4392 SetGVNFlag(kDependsOnMaps);
4393 SetGVNFlag(kChangesNewSpacePromotion);
4387 } 4394 }
4388 4395
4389 virtual Representation RequiredInputRepresentation(int index) { 4396 virtual Representation RequiredInputRepresentation(int index) {
4390 // The index is supposed to be Integer32. 4397 // The index is supposed to be Integer32.
4391 return index == 2 4398 return index == 2
4392 ? Representation::Integer32() 4399 ? Representation::Integer32()
4393 : Representation::Tagged(); 4400 : Representation::Tagged();
4394 } 4401 }
4395 4402
4396 HValue* context() { return OperandAt(0); } 4403 HValue* context() { return OperandAt(0); }
(...skipping 11 matching lines...) Expand all
4408 }; 4415 };
4409 4416
4410 4417
4411 class HStringCharFromCode: public HTemplateInstruction<2> { 4418 class HStringCharFromCode: public HTemplateInstruction<2> {
4412 public: 4419 public:
4413 HStringCharFromCode(HValue* context, HValue* char_code) { 4420 HStringCharFromCode(HValue* context, HValue* char_code) {
4414 SetOperandAt(0, context); 4421 SetOperandAt(0, context);
4415 SetOperandAt(1, char_code); 4422 SetOperandAt(1, char_code);
4416 set_representation(Representation::Tagged()); 4423 set_representation(Representation::Tagged());
4417 SetFlag(kUseGVN); 4424 SetFlag(kUseGVN);
4425 SetGVNFlag(kChangesNewSpacePromotion);
4418 } 4426 }
4419 4427
4420 virtual Representation RequiredInputRepresentation(int index) { 4428 virtual Representation RequiredInputRepresentation(int index) {
4421 return index == 0 4429 return index == 0
4422 ? Representation::Tagged() 4430 ? Representation::Tagged()
4423 : Representation::Integer32(); 4431 : Representation::Integer32();
4424 } 4432 }
4425 virtual HType CalculateInferredType(); 4433 virtual HType CalculateInferredType();
4426 4434
4427 HValue* context() { return OperandAt(0); } 4435 HValue* context() { return OperandAt(0); }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
4509 public: 4517 public:
4510 HFastLiteral(HValue* context, 4518 HFastLiteral(HValue* context,
4511 Handle<JSObject> boilerplate, 4519 Handle<JSObject> boilerplate,
4512 int total_size, 4520 int total_size,
4513 int literal_index, 4521 int literal_index,
4514 int depth) 4522 int depth)
4515 : HMaterializedLiteral<1>(literal_index, depth), 4523 : HMaterializedLiteral<1>(literal_index, depth),
4516 boilerplate_(boilerplate), 4524 boilerplate_(boilerplate),
4517 total_size_(total_size) { 4525 total_size_(total_size) {
4518 SetOperandAt(0, context); 4526 SetOperandAt(0, context);
4527 SetGVNFlag(kChangesNewSpacePromotion);
4519 } 4528 }
4520 4529
4521 // Maximum depth and total number of elements and properties for literal 4530 // Maximum depth and total number of elements and properties for literal
4522 // graphs to be considered for fast deep-copying. 4531 // graphs to be considered for fast deep-copying.
4523 static const int kMaxLiteralDepth = 3; 4532 static const int kMaxLiteralDepth = 3;
4524 static const int kMaxLiteralProperties = 8; 4533 static const int kMaxLiteralProperties = 8;
4525 4534
4526 HValue* context() { return OperandAt(0); } 4535 HValue* context() { return OperandAt(0); }
4527 Handle<JSObject> boilerplate() const { return boilerplate_; } 4536 Handle<JSObject> boilerplate() const { return boilerplate_; }
4528 int total_size() const { return total_size_; } 4537 int total_size() const { return total_size_; }
(...skipping 15 matching lines...) Expand all
4544 public: 4553 public:
4545 HArrayLiteral(HValue* context, 4554 HArrayLiteral(HValue* context,
4546 Handle<HeapObject> boilerplate_object, 4555 Handle<HeapObject> boilerplate_object,
4547 int length, 4556 int length,
4548 int literal_index, 4557 int literal_index,
4549 int depth) 4558 int depth)
4550 : HMaterializedLiteral<1>(literal_index, depth), 4559 : HMaterializedLiteral<1>(literal_index, depth),
4551 length_(length), 4560 length_(length),
4552 boilerplate_object_(boilerplate_object) { 4561 boilerplate_object_(boilerplate_object) {
4553 SetOperandAt(0, context); 4562 SetOperandAt(0, context);
4563 SetGVNFlag(kChangesNewSpacePromotion);
4554 } 4564 }
4555 4565
4556 HValue* context() { return OperandAt(0); } 4566 HValue* context() { return OperandAt(0); }
4557 ElementsKind boilerplate_elements_kind() const { 4567 ElementsKind boilerplate_elements_kind() const {
4558 if (!boilerplate_object_->IsJSObject()) { 4568 if (!boilerplate_object_->IsJSObject()) {
4559 return FAST_ELEMENTS; 4569 return FAST_ELEMENTS;
4560 } 4570 }
4561 return Handle<JSObject>::cast(boilerplate_object_)->GetElementsKind(); 4571 return Handle<JSObject>::cast(boilerplate_object_)->GetElementsKind();
4562 } 4572 }
4563 Handle<HeapObject> boilerplate_object() const { return boilerplate_object_; } 4573 Handle<HeapObject> boilerplate_object() const { return boilerplate_object_; }
(...skipping 20 matching lines...) Expand all
4584 Handle<FixedArray> constant_properties, 4594 Handle<FixedArray> constant_properties,
4585 bool fast_elements, 4595 bool fast_elements,
4586 int literal_index, 4596 int literal_index,
4587 int depth, 4597 int depth,
4588 bool has_function) 4598 bool has_function)
4589 : HMaterializedLiteral<1>(literal_index, depth), 4599 : HMaterializedLiteral<1>(literal_index, depth),
4590 constant_properties_(constant_properties), 4600 constant_properties_(constant_properties),
4591 fast_elements_(fast_elements), 4601 fast_elements_(fast_elements),
4592 has_function_(has_function) { 4602 has_function_(has_function) {
4593 SetOperandAt(0, context); 4603 SetOperandAt(0, context);
4604 SetGVNFlag(kChangesNewSpacePromotion);
4594 } 4605 }
4595 4606
4596 HValue* context() { return OperandAt(0); } 4607 HValue* context() { return OperandAt(0); }
4597 Handle<FixedArray> constant_properties() const { 4608 Handle<FixedArray> constant_properties() const {
4598 return constant_properties_; 4609 return constant_properties_;
4599 } 4610 }
4600 bool fast_elements() const { return fast_elements_; } 4611 bool fast_elements() const { return fast_elements_; }
4601 bool has_function() const { return has_function_; } 4612 bool has_function() const { return has_function_; }
4602 4613
4603 virtual Representation RequiredInputRepresentation(int index) { 4614 virtual Representation RequiredInputRepresentation(int index) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
4645 4656
4646 4657
4647 class HFunctionLiteral: public HTemplateInstruction<1> { 4658 class HFunctionLiteral: public HTemplateInstruction<1> {
4648 public: 4659 public:
4649 HFunctionLiteral(HValue* context, 4660 HFunctionLiteral(HValue* context,
4650 Handle<SharedFunctionInfo> shared, 4661 Handle<SharedFunctionInfo> shared,
4651 bool pretenure) 4662 bool pretenure)
4652 : shared_info_(shared), pretenure_(pretenure) { 4663 : shared_info_(shared), pretenure_(pretenure) {
4653 SetOperandAt(0, context); 4664 SetOperandAt(0, context);
4654 set_representation(Representation::Tagged()); 4665 set_representation(Representation::Tagged());
4666 SetGVNFlag(kChangesNewSpacePromotion);
4655 } 4667 }
4656 4668
4657 HValue* context() { return OperandAt(0); } 4669 HValue* context() { return OperandAt(0); }
4658 4670
4659 virtual Representation RequiredInputRepresentation(int index) { 4671 virtual Representation RequiredInputRepresentation(int index) {
4660 return Representation::Tagged(); 4672 return Representation::Tagged();
4661 } 4673 }
4662 virtual HType CalculateInferredType(); 4674 virtual HType CalculateInferredType();
4663 4675
4664 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) 4676 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral)
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
4921 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); 4933 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex);
4922 }; 4934 };
4923 4935
4924 4936
4925 #undef DECLARE_INSTRUCTION 4937 #undef DECLARE_INSTRUCTION
4926 #undef DECLARE_CONCRETE_INSTRUCTION 4938 #undef DECLARE_CONCRETE_INSTRUCTION
4927 4939
4928 } } // namespace v8::internal 4940 } } // namespace v8::internal
4929 4941
4930 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 4942 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-123919.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698