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

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

Issue 21055011: First implementation of allocation elimination in Hydrogen. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Minor cleanup. Created 7 years, 4 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
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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 V(CallConstantFunction) \ 80 V(CallConstantFunction) \
81 V(CallFunction) \ 81 V(CallFunction) \
82 V(CallGlobal) \ 82 V(CallGlobal) \
83 V(CallKeyed) \ 83 V(CallKeyed) \
84 V(CallKnownGlobal) \ 84 V(CallKnownGlobal) \
85 V(CallNamed) \ 85 V(CallNamed) \
86 V(CallNew) \ 86 V(CallNew) \
87 V(CallNewArray) \ 87 V(CallNewArray) \
88 V(CallRuntime) \ 88 V(CallRuntime) \
89 V(CallStub) \ 89 V(CallStub) \
90 V(CapturedObject) \
90 V(Change) \ 91 V(Change) \
91 V(CheckFunction) \ 92 V(CheckFunction) \
92 V(CheckHeapObject) \ 93 V(CheckHeapObject) \
93 V(CheckInstanceType) \ 94 V(CheckInstanceType) \
94 V(CheckMaps) \ 95 V(CheckMaps) \
95 V(CheckMapValue) \ 96 V(CheckMapValue) \
96 V(CheckPrototypeMaps) \ 97 V(CheckPrototypeMaps) \
97 V(CheckSmi) \ 98 V(CheckSmi) \
98 V(ClampToUint8) \ 99 V(ClampToUint8) \
99 V(ClassOfTestAndBranch) \ 100 V(ClassOfTestAndBranch) \
(...skipping 3322 matching lines...) Expand 10 before | Expand all | Expand 10 after
3422 3423
3423 // We need to store the phi both here and in the instruction operand because 3424 // We need to store the phi both here and in the instruction operand because
3424 // the operand can change if a new idef of the phi is added between the phi 3425 // the operand can change if a new idef of the phi is added between the phi
3425 // and this instruction (inserting an idef updates every use). 3426 // and this instruction (inserting an idef updates every use).
3426 HPhi* phi_; 3427 HPhi* phi_;
3427 NumericRelation relation_; 3428 NumericRelation relation_;
3428 int operand_index_; 3429 int operand_index_;
3429 }; 3430 };
3430 3431
3431 3432
3432 class HArgumentsObject: public HTemplateInstruction<0> { 3433 // Common base class for HArgumentsObject and HCapturedObject.
3434 class HDematerializedObject: public HTemplateInstruction<0> {
3433 public: 3435 public:
3434 HArgumentsObject(int count, Zone* zone) : values_(count, zone) { 3436 HDematerializedObject(int count, Zone* zone) : values_(count, zone) {}
3435 set_representation(Representation::Tagged());
3436 SetFlag(kIsArguments);
3437 }
3438
3439 const ZoneList<HValue*>* arguments_values() const { return &values_; }
3440 int arguments_count() const { return values_.length(); }
3441
3442 void AddArgument(HValue* argument, Zone* zone) {
3443 values_.Add(NULL, zone); // Resize list.
3444 SetOperandAt(values_.length() - 1, argument);
3445 }
3446 3437
3447 virtual int OperandCount() { return values_.length(); } 3438 virtual int OperandCount() { return values_.length(); }
3448 virtual HValue* OperandAt(int index) const { return values_[index]; } 3439 virtual HValue* OperandAt(int index) const { return values_[index]; }
3449 3440
3450 virtual bool HasEscapingOperandAt(int index) { return false; } 3441 virtual bool HasEscapingOperandAt(int index) { return false; }
3451 virtual Representation RequiredInputRepresentation(int index) { 3442 virtual Representation RequiredInputRepresentation(int index) {
3452 return Representation::None(); 3443 return Representation::None();
3453 } 3444 }
3454 3445
3455 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject)
3456
3457 protected: 3446 protected:
3458 virtual void InternalSetOperandAt(int index, HValue* value) { 3447 virtual void InternalSetOperandAt(int index, HValue* value) {
3459 values_[index] = value; 3448 values_[index] = value;
3460 } 3449 }
3461 3450
3451 ZoneList<HValue*> values_;
titzer 2013/08/01 17:11:50 How is this values_ array indexed? Does it store o
Michael Starzinger 2013/08/05 15:13:00 Correct. I added a comment to both HArgumentsObjec
3452
3462 private: 3453 private:
3463 virtual bool IsDeletable() const { return true; } 3454 virtual bool IsDeletable() const { return true; }
3464
3465 ZoneList<HValue*> values_;
3466 }; 3455 };
3467 3456
3468 3457
3458 class HArgumentsObject: public HDematerializedObject {
3459 public:
3460 HArgumentsObject(int count, Zone* zone)
3461 : HDematerializedObject(count, zone) {
3462 set_representation(Representation::Tagged());
3463 SetFlag(kIsArguments);
3464 }
3465
3466 const ZoneList<HValue*>* arguments_values() const { return &values_; }
3467 int arguments_count() const { return values_.length(); }
3468
3469 void AddArgument(HValue* argument, Zone* zone) {
3470 values_.Add(NULL, zone); // Resize list.
3471 SetOperandAt(values_.length() - 1, argument);
3472 }
3473
3474 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject)
3475 };
3476
3477
3478 class HCapturedObject: public HDematerializedObject {
3479 public:
3480 HCapturedObject(int length, Zone* zone)
3481 : HDematerializedObject(length, zone) {
3482 set_representation(Representation::Tagged());
3483 values_.AddBlock(NULL, length, zone); // Resize list.
3484 }
3485
3486 const ZoneList<HValue*>* values() const { return &values_; }
3487 int length() const { return values_.length(); }
3488
3489 DECLARE_CONCRETE_INSTRUCTION(CapturedObject)
3490 };
3491
3492
3469 class HConstant: public HTemplateInstruction<0> { 3493 class HConstant: public HTemplateInstruction<0> {
3470 public: 3494 public:
3471 HConstant(Handle<Object> handle, Representation r = Representation::None()); 3495 HConstant(Handle<Object> handle, Representation r = Representation::None());
3472 HConstant(int32_t value, 3496 HConstant(int32_t value,
3473 Representation r = Representation::None(), 3497 Representation r = Representation::None(),
3474 bool is_not_in_new_space = true, 3498 bool is_not_in_new_space = true,
3475 Handle<Object> optional_handle = Handle<Object>::null()); 3499 Handle<Object> optional_handle = Handle<Object>::null());
3476 HConstant(double value, 3500 HConstant(double value,
3477 Representation r = Representation::None(), 3501 Representation r = Representation::None(),
3478 bool is_not_in_new_space = true, 3502 bool is_not_in_new_space = true,
(...skipping 2800 matching lines...) Expand 10 before | Expand all | Expand 10 after
6279 SetGVNFlag(kChangesArrayElements); 6303 SetGVNFlag(kChangesArrayElements);
6280 } 6304 }
6281 6305
6282 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. 6306 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating.
6283 if (elements_kind >= EXTERNAL_BYTE_ELEMENTS && 6307 if (elements_kind >= EXTERNAL_BYTE_ELEMENTS &&
6284 elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) { 6308 elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) {
6285 SetFlag(kTruncatingToInt32); 6309 SetFlag(kTruncatingToInt32);
6286 } 6310 }
6287 } 6311 }
6288 6312
6289 virtual bool HasEscapingOperandAt(int index) { return index != 0; }
6290 virtual Representation RequiredInputRepresentation(int index) { 6313 virtual Representation RequiredInputRepresentation(int index) {
6291 // kind_fast: tagged[int32] = tagged 6314 // kind_fast: tagged[int32] = tagged
6292 // kind_double: tagged[int32] = double 6315 // kind_double: tagged[int32] = double
6293 // kind_smi : tagged[int32] = smi 6316 // kind_smi : tagged[int32] = smi
6294 // kind_external: external[int32] = (double | int32) 6317 // kind_external: external[int32] = (double | int32)
6295 if (index == 0) { 6318 if (index == 0) {
6296 return is_external() ? Representation::External() 6319 return is_external() ? Representation::External()
6297 : Representation::Tagged(); 6320 : Representation::Tagged();
6298 } else if (index == 1) { 6321 } else if (index == 1) {
6299 return ArrayInstructionInterface::KeyedAccessIndexRequirement( 6322 return ArrayInstructionInterface::KeyedAccessIndexRequirement(
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after
6993 virtual bool IsDeletable() const { return true; } 7016 virtual bool IsDeletable() const { return true; }
6994 }; 7017 };
6995 7018
6996 7019
6997 #undef DECLARE_INSTRUCTION 7020 #undef DECLARE_INSTRUCTION
6998 #undef DECLARE_CONCRETE_INSTRUCTION 7021 #undef DECLARE_CONCRETE_INSTRUCTION
6999 7022
7000 } } // namespace v8::internal 7023 } } // namespace v8::internal
7001 7024
7002 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 7025 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698