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

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

Issue 195063002: Fix bug in constant folding object comparisons. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 9 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 | src/hydrogen-instructions.cc » ('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 3566 matching lines...) Expand 10 before | Expand all | Expand 10 after
3577 } 3577 }
3578 3578
3579 Unique<Object> GetUnique() const { 3579 Unique<Object> GetUnique() const {
3580 return object_; 3580 return object_;
3581 } 3581 }
3582 3582
3583 bool EqualsUnique(Unique<Object> other) const { 3583 bool EqualsUnique(Unique<Object> other) const {
3584 return object_.IsInitialized() && object_ == other; 3584 return object_.IsInitialized() && object_ == other;
3585 } 3585 }
3586 3586
3587 #ifdef DEBUG
3588 virtual void Verify() V8_OVERRIDE { }
3589 #endif
3590
3591 DECLARE_CONCRETE_INSTRUCTION(Constant)
3592
3593 protected:
3594 virtual Range* InferRange(Zone* zone) V8_OVERRIDE;
3595
3596 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 3587 virtual bool DataEquals(HValue* other) V8_OVERRIDE {
3597 HConstant* other_constant = HConstant::cast(other); 3588 HConstant* other_constant = HConstant::cast(other);
3598 if (has_int32_value_) { 3589 if (has_int32_value_) {
3599 return other_constant->has_int32_value_ && 3590 return other_constant->has_int32_value_ &&
3600 int32_value_ == other_constant->int32_value_; 3591 int32_value_ == other_constant->int32_value_;
3601 } else if (has_double_value_) { 3592 } else if (has_double_value_) {
3602 return other_constant->has_double_value_ && 3593 return other_constant->has_double_value_ &&
3603 BitCast<int64_t>(double_value_) == 3594 BitCast<int64_t>(double_value_) ==
3604 BitCast<int64_t>(other_constant->double_value_); 3595 BitCast<int64_t>(other_constant->double_value_);
3605 } else if (has_external_reference_value_) { 3596 } else if (has_external_reference_value_) {
3606 return other_constant->has_external_reference_value_ && 3597 return other_constant->has_external_reference_value_ &&
3607 external_reference_value_ == 3598 external_reference_value_ ==
3608 other_constant->external_reference_value_; 3599 other_constant->external_reference_value_;
3609 } else { 3600 } else {
3610 if (other_constant->has_int32_value_ || 3601 if (other_constant->has_int32_value_ ||
3611 other_constant->has_double_value_ || 3602 other_constant->has_double_value_ ||
3612 other_constant->has_external_reference_value_) { 3603 other_constant->has_external_reference_value_) {
3613 return false; 3604 return false;
3614 } 3605 }
3615 ASSERT(!object_.handle().is_null()); 3606 ASSERT(!object_.handle().is_null());
3616 return other_constant->object_ == object_; 3607 return other_constant->object_ == object_;
3617 } 3608 }
3618 } 3609 }
3619 3610
3611 #ifdef DEBUG
3612 virtual void Verify() V8_OVERRIDE { }
3613 #endif
3614
3615 DECLARE_CONCRETE_INSTRUCTION(Constant)
3616
3617 protected:
3618 virtual Range* InferRange(Zone* zone) V8_OVERRIDE;
3619
3620 private: 3620 private:
3621 friend class HGraph; 3621 friend class HGraph;
3622 HConstant(Handle<Object> handle, Representation r = Representation::None()); 3622 HConstant(Handle<Object> handle, Representation r = Representation::None());
3623 HConstant(int32_t value, 3623 HConstant(int32_t value,
3624 Representation r = Representation::None(), 3624 Representation r = Representation::None(),
3625 bool is_not_in_new_space = true, 3625 bool is_not_in_new_space = true,
3626 Unique<Object> optional = Unique<Object>(Handle<Object>::null())); 3626 Unique<Object> optional = Unique<Object>(Handle<Object>::null()));
3627 HConstant(double value, 3627 HConstant(double value,
3628 Representation r = Representation::None(), 3628 Representation r = Representation::None(),
3629 bool is_not_in_new_space = true, 3629 bool is_not_in_new_space = true,
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
4273 4273
4274 private: 4274 private:
4275 explicit HCompareMinusZeroAndBranch(HValue* value) 4275 explicit HCompareMinusZeroAndBranch(HValue* value)
4276 : HUnaryControlInstruction(value, NULL, NULL) { 4276 : HUnaryControlInstruction(value, NULL, NULL) {
4277 } 4277 }
4278 }; 4278 };
4279 4279
4280 4280
4281 class HCompareObjectEqAndBranch : public HTemplateControlInstruction<2, 2> { 4281 class HCompareObjectEqAndBranch : public HTemplateControlInstruction<2, 2> {
4282 public: 4282 public:
4283 HCompareObjectEqAndBranch(HValue* left,
4284 HValue* right,
4285 HBasicBlock* true_target = NULL,
4286 HBasicBlock* false_target = NULL) {
4287 // TODO(danno): make this private when the IfBuilder properly constructs
4288 // control flow instructions.
4289 ASSERT(!left->IsConstant() ||
4290 (!HConstant::cast(left)->HasInteger32Value() ||
4291 HConstant::cast(left)->HasSmiValue()));
4292 ASSERT(!right->IsConstant() ||
4293 (!HConstant::cast(right)->HasInteger32Value() ||
4294 HConstant::cast(right)->HasSmiValue()));
4295 SetOperandAt(0, left);
4296 SetOperandAt(1, right);
4297 SetSuccessorAt(0, true_target);
4298 SetSuccessorAt(1, false_target);
4299 }
4300
4301 DECLARE_INSTRUCTION_FACTORY_P2(HCompareObjectEqAndBranch, HValue*, HValue*); 4283 DECLARE_INSTRUCTION_FACTORY_P2(HCompareObjectEqAndBranch, HValue*, HValue*);
4302 DECLARE_INSTRUCTION_FACTORY_P4(HCompareObjectEqAndBranch, HValue*, HValue*, 4284 DECLARE_INSTRUCTION_FACTORY_P4(HCompareObjectEqAndBranch, HValue*, HValue*,
4303 HBasicBlock*, HBasicBlock*); 4285 HBasicBlock*, HBasicBlock*);
4304 4286
4305 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; 4287 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE;
4306 4288
4307 HValue* left() { return OperandAt(0); } 4289 HValue* left() { return OperandAt(0); }
4308 HValue* right() { return OperandAt(1); } 4290 HValue* right() { return OperandAt(1); }
4309 4291
4310 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 4292 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
4311 4293
4312 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4294 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
4313 return Representation::Tagged(); 4295 return Representation::Tagged();
4314 } 4296 }
4315 4297
4316 virtual Representation observed_input_representation(int index) V8_OVERRIDE { 4298 virtual Representation observed_input_representation(int index) V8_OVERRIDE {
4317 return Representation::Tagged(); 4299 return Representation::Tagged();
4318 } 4300 }
4319 4301
4320 DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch) 4302 DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch)
4303
4304 private:
4305 HCompareObjectEqAndBranch(HValue* left,
4306 HValue* right,
4307 HBasicBlock* true_target = NULL,
4308 HBasicBlock* false_target = NULL) {
4309 ASSERT(!left->IsConstant() ||
4310 (!HConstant::cast(left)->HasInteger32Value() ||
4311 HConstant::cast(left)->HasSmiValue()));
4312 ASSERT(!right->IsConstant() ||
4313 (!HConstant::cast(right)->HasInteger32Value() ||
4314 HConstant::cast(right)->HasSmiValue()));
4315 SetOperandAt(0, left);
4316 SetOperandAt(1, right);
4317 SetSuccessorAt(0, true_target);
4318 SetSuccessorAt(1, false_target);
4319 }
4321 }; 4320 };
4322 4321
4323 4322
4324 class HIsObjectAndBranch V8_FINAL : public HUnaryControlInstruction { 4323 class HIsObjectAndBranch V8_FINAL : public HUnaryControlInstruction {
4325 public: 4324 public:
4326 DECLARE_INSTRUCTION_FACTORY_P1(HIsObjectAndBranch, HValue*); 4325 DECLARE_INSTRUCTION_FACTORY_P1(HIsObjectAndBranch, HValue*);
4327 DECLARE_INSTRUCTION_FACTORY_P3(HIsObjectAndBranch, HValue*, 4326 DECLARE_INSTRUCTION_FACTORY_P3(HIsObjectAndBranch, HValue*,
4328 HBasicBlock*, HBasicBlock*); 4327 HBasicBlock*, HBasicBlock*);
4329 4328
4330 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 4329 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
(...skipping 3186 matching lines...) Expand 10 before | Expand all | Expand 10 after
7517 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 7516 virtual bool IsDeletable() const V8_OVERRIDE { return true; }
7518 }; 7517 };
7519 7518
7520 7519
7521 #undef DECLARE_INSTRUCTION 7520 #undef DECLARE_INSTRUCTION
7522 #undef DECLARE_CONCRETE_INSTRUCTION 7521 #undef DECLARE_CONCRETE_INSTRUCTION
7523 7522
7524 } } // namespace v8::internal 7523 } } // namespace v8::internal
7525 7524
7526 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 7525 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« no previous file with comments | « no previous file | src/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698