comparison src/share/vm/opto/chaitin.hpp @ 12877:d8a449d2f5b2

8011415: CTW on Sparc: assert(lrg.lo_degree()) failed: Summary: Increased the LRG AllStack mask size since the previous size was not big enough when compiling huge methods (60k+ nodes) Reviewed-by: kvn, roland, twisti
author adlertz
date Fri, 11 Oct 2013 13:10:22 +0200
parents 8c83625e3a53
children de6a9e811145
comparison
equal deleted inserted replaced
12874:46ef27bcacb3 12877:d8a449d2f5b2
50 //------------------------------LRG-------------------------------------------- 50 //------------------------------LRG--------------------------------------------
51 // Live-RanGe structure. 51 // Live-RanGe structure.
52 class LRG : public ResourceObj { 52 class LRG : public ResourceObj {
53 friend class VMStructs; 53 friend class VMStructs;
54 public: 54 public:
55 static const uint AllStack_size = 0xFFFFF; // This mask size is used to tell that the mask of this LRG supports stack positions
55 enum { SPILL_REG=29999 }; // Register number of a spilled LRG 56 enum { SPILL_REG=29999 }; // Register number of a spilled LRG
56 57
57 double _cost; // 2 for loads/1 for stores times block freq 58 double _cost; // 2 for loads/1 for stores times block freq
58 double _area; // Sum of all simultaneously live values 59 double _area; // Sum of all simultaneously live values
59 double score() const; // Compute score from cost and area 60 double score() const; // Compute score from cost and area
78 void set_reg( OptoReg::Name r ) { _reg = r; } 79 void set_reg( OptoReg::Name r ) { _reg = r; }
79 80
80 private: 81 private:
81 uint _eff_degree; // Effective degree: Sum of neighbors _num_regs 82 uint _eff_degree; // Effective degree: Sum of neighbors _num_regs
82 public: 83 public:
83 int degree() const { assert( _degree_valid, "" ); return _eff_degree; } 84 int degree() const { assert( _degree_valid , "" ); return _eff_degree; }
84 // Degree starts not valid and any change to the IFG neighbor 85 // Degree starts not valid and any change to the IFG neighbor
85 // set makes it not valid. 86 // set makes it not valid.
86 void set_degree( uint degree ) { _eff_degree = degree; debug_only(_degree_valid = 1;) } 87 void set_degree( uint degree ) {
88 _eff_degree = degree;
89 debug_only(_degree_valid = 1;)
90 assert(!_mask.is_AllStack() || (_mask.is_AllStack() && lo_degree()), "_eff_degree can't be bigger than AllStack_size - _num_regs if the mask supports stack registers");
91 }
87 // Made a change that hammered degree 92 // Made a change that hammered degree
88 void invalid_degree() { debug_only(_degree_valid=0;) } 93 void invalid_degree() { debug_only(_degree_valid=0;) }
89 // Incrementally modify degree. If it was correct, it should remain correct 94 // Incrementally modify degree. If it was correct, it should remain correct
90 void inc_degree( uint mod ) { _eff_degree += mod; } 95 void inc_degree( uint mod ) {
96 _eff_degree += mod;
97 assert(!_mask.is_AllStack() || (_mask.is_AllStack() && lo_degree()), "_eff_degree can't be bigger than AllStack_size - _num_regs if the mask supports stack registers");
98 }
91 // Compute the degree between 2 live ranges 99 // Compute the degree between 2 live ranges
92 int compute_degree( LRG &l ) const; 100 int compute_degree( LRG &l ) const;
93 101
94 private: 102 private:
95 RegMask _mask; // Allowed registers for this LRG 103 RegMask _mask; // Allowed registers for this LRG
96 uint _mask_size; // cache of _mask.Size(); 104 uint _mask_size; // cache of _mask.Size();
97 public: 105 public:
98 int compute_mask_size() const { return _mask.is_AllStack() ? 65535 : _mask.Size(); } 106 int compute_mask_size() const { return _mask.is_AllStack() ? AllStack_size : _mask.Size(); }
99 void set_mask_size( int size ) { 107 void set_mask_size( int size ) {
100 assert((size == 65535) || (size == (int)_mask.Size()), ""); 108 assert((size == (int)AllStack_size) || (size == (int)_mask.Size()), "");
101 _mask_size = size; 109 _mask_size = size;
102 #ifdef ASSERT 110 #ifdef ASSERT
103 _msize_valid=1; 111 _msize_valid=1;
104 if (_is_vector) { 112 if (_is_vector) {
105 assert(!_fat_proj, "sanity"); 113 assert(!_fat_proj, "sanity");