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

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

Issue 6905166: Change heuristics for deciding phi-representation types to use int32 more frequently. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 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 unified diff | Download patch | Annotate | Revision Log
« src/hydrogen.cc ('K') | « src/hydrogen.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 536 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 Representation representation() const { return representation_; } 547 Representation representation() const { return representation_; }
548 void ChangeRepresentation(Representation r) { 548 void ChangeRepresentation(Representation r) {
549 // Representation was already set and is allowed to be changed. 549 // Representation was already set and is allowed to be changed.
550 ASSERT(!representation_.IsNone()); 550 ASSERT(!representation_.IsNone());
551 ASSERT(!r.IsNone()); 551 ASSERT(!r.IsNone());
552 ASSERT(CheckFlag(kFlexibleRepresentation)); 552 ASSERT(CheckFlag(kFlexibleRepresentation));
553 RepresentationChanged(r); 553 RepresentationChanged(r);
554 representation_ = r; 554 representation_ = r;
555 } 555 }
556 556
557 virtual bool IsConvertibleToInteger() const { return true; }
558
557 HType type() const { return type_; } 559 HType type() const { return type_; }
558 void set_type(HType type) { 560 void set_type(HType type) {
559 ASSERT(HasNoUses()); 561 ASSERT(HasNoUses());
560 type_ = type; 562 type_ = type;
561 } 563 }
562 564
563 // An operation needs to override this function iff: 565 // An operation needs to override this function iff:
564 // 1) it can produce an int32 output. 566 // 1) it can produce an int32 output.
565 // 2) the true value of its output can potentially be minus zero. 567 // 2) the true value of its output can potentially be minus zero.
566 // The implementation must set a flag so that it bails out in the case where 568 // The implementation must set a flag so that it bails out in the case where
(...skipping 1348 matching lines...) Expand 10 before | Expand all | Expand 10 after
1915 virtual bool DataEquals(HValue* other) { return true; } 1917 virtual bool DataEquals(HValue* other) { return true; }
1916 }; 1918 };
1917 1919
1918 1920
1919 class HPhi: public HValue { 1921 class HPhi: public HValue {
1920 public: 1922 public:
1921 explicit HPhi(int merged_index) 1923 explicit HPhi(int merged_index)
1922 : inputs_(2), 1924 : inputs_(2),
1923 merged_index_(merged_index), 1925 merged_index_(merged_index),
1924 phi_id_(-1), 1926 phi_id_(-1),
1925 is_live_(false) { 1927 is_live_(false),
1928 is_convertible_to_integer_(true) {
1926 for (int i = 0; i < Representation::kNumRepresentations; i++) { 1929 for (int i = 0; i < Representation::kNumRepresentations; i++) {
1927 non_phi_uses_[i] = 0; 1930 non_phi_uses_[i] = 0;
1928 indirect_uses_[i] = 0; 1931 indirect_uses_[i] = 0;
1929 } 1932 }
1930 ASSERT(merged_index >= 0); 1933 ASSERT(merged_index >= 0);
1931 set_representation(Representation::Tagged()); 1934 set_representation(Representation::Tagged());
1932 SetFlag(kFlexibleRepresentation); 1935 SetFlag(kFlexibleRepresentation);
1933 } 1936 }
1934 1937
1935 virtual Representation InferredRepresentation() { 1938 virtual Representation InferredRepresentation() {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1993 int phi_id() { return phi_id_; } 1996 int phi_id() { return phi_id_; }
1994 bool is_live() { return is_live_; } 1997 bool is_live() { return is_live_; }
1995 void set_is_live(bool b) { is_live_ = b; } 1998 void set_is_live(bool b) { is_live_ = b; }
1996 1999
1997 static HPhi* cast(HValue* value) { 2000 static HPhi* cast(HValue* value) {
1998 ASSERT(value->IsPhi()); 2001 ASSERT(value->IsPhi());
1999 return reinterpret_cast<HPhi*>(value); 2002 return reinterpret_cast<HPhi*>(value);
2000 } 2003 }
2001 virtual Opcode opcode() const { return HValue::kPhi; } 2004 virtual Opcode opcode() const { return HValue::kPhi; }
2002 2005
2006 virtual bool IsConvertibleToInteger() const {
2007 return is_convertible_to_integer_;
2008 }
2009
2010 void set_is_convertible_to_integer(bool b) {
2011 is_convertible_to_integer_ = b;
2012 }
2013
2003 protected: 2014 protected:
2004 virtual void DeleteFromGraph(); 2015 virtual void DeleteFromGraph();
2005 virtual void InternalSetOperandAt(int index, HValue* value) { 2016 virtual void InternalSetOperandAt(int index, HValue* value) {
2006 inputs_[index] = value; 2017 inputs_[index] = value;
2007 } 2018 }
2008 2019
2009 private: 2020 private:
2010 ZoneList<HValue*> inputs_; 2021 ZoneList<HValue*> inputs_;
2011 int merged_index_; 2022 int merged_index_;
2012 2023
2013 int non_phi_uses_[Representation::kNumRepresentations]; 2024 int non_phi_uses_[Representation::kNumRepresentations];
2014 int indirect_uses_[Representation::kNumRepresentations]; 2025 int indirect_uses_[Representation::kNumRepresentations];
2015 int phi_id_; 2026 int phi_id_;
2016 bool is_live_; 2027 bool is_live_;
2028 bool is_convertible_to_integer_;
2017 }; 2029 };
2018 2030
2019 2031
2020 class HArgumentsObject: public HTemplateInstruction<0> { 2032 class HArgumentsObject: public HTemplateInstruction<0> {
2021 public: 2033 public:
2022 HArgumentsObject() { 2034 HArgumentsObject() {
2023 set_representation(Representation::Tagged()); 2035 set_representation(Representation::Tagged());
2024 SetFlag(kIsArguments); 2036 SetFlag(kIsArguments);
2025 } 2037 }
2026 2038
(...skipping 10 matching lines...) Expand all
2037 HConstant(Handle<Object> handle, Representation r); 2049 HConstant(Handle<Object> handle, Representation r);
2038 2050
2039 Handle<Object> handle() const { return handle_; } 2051 Handle<Object> handle() const { return handle_; }
2040 2052
2041 bool InOldSpace() const { return !HEAP->InNewSpace(*handle_); } 2053 bool InOldSpace() const { return !HEAP->InNewSpace(*handle_); }
2042 2054
2043 virtual Representation RequiredInputRepresentation(int index) const { 2055 virtual Representation RequiredInputRepresentation(int index) const {
2044 return Representation::None(); 2056 return Representation::None();
2045 } 2057 }
2046 2058
2059 virtual bool IsConvertibleToInteger() const {
2060 if (handle_->IsSmi()) return true;
2061 if (handle_->IsHeapNumber() &&
2062 (HeapNumber::cast(*handle_)->value() ==
2063 static_cast<double>(NumberToInt32(*handle_)))) return true;
2064 return false;
2065 }
2066
2047 virtual bool EmitAtUses() { return !representation().IsDouble(); } 2067 virtual bool EmitAtUses() { return !representation().IsDouble(); }
2048 virtual void PrintDataTo(StringStream* stream); 2068 virtual void PrintDataTo(StringStream* stream);
2049 virtual HType CalculateInferredType(); 2069 virtual HType CalculateInferredType();
2050 bool IsInteger() const { return handle_->IsSmi(); } 2070 bool IsInteger() const { return handle_->IsSmi(); }
2051 HConstant* CopyToRepresentation(Representation r) const; 2071 HConstant* CopyToRepresentation(Representation r) const;
2052 HConstant* CopyToTruncatedInt32() const; 2072 HConstant* CopyToTruncatedInt32() const;
2053 bool HasInteger32Value() const { return has_int32_value_; } 2073 bool HasInteger32Value() const { return has_int32_value_; }
2054 int32_t Integer32Value() const { 2074 int32_t Integer32Value() const {
2055 ASSERT(HasInteger32Value()); 2075 ASSERT(HasInteger32Value());
2056 return int32_value_; 2076 return int32_value_;
(...skipping 1749 matching lines...) Expand 10 before | Expand all | Expand 10 after
3806 3826
3807 DECLARE_CONCRETE_INSTRUCTION(In) 3827 DECLARE_CONCRETE_INSTRUCTION(In)
3808 }; 3828 };
3809 3829
3810 #undef DECLARE_INSTRUCTION 3830 #undef DECLARE_INSTRUCTION
3811 #undef DECLARE_CONCRETE_INSTRUCTION 3831 #undef DECLARE_CONCRETE_INSTRUCTION
3812 3832
3813 } } // namespace v8::internal 3833 } } // namespace v8::internal
3814 3834
3815 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 3835 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« src/hydrogen.cc ('K') | « src/hydrogen.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698