equal
deleted
inserted
replaced
139 virtual void kill_field(ciField* field) = 0; |
139 virtual void kill_field(ciField* field) = 0; |
140 virtual void kill_array(ValueType* type) = 0; |
140 virtual void kill_array(ValueType* type) = 0; |
141 |
141 |
142 // visitor functions |
142 // visitor functions |
143 void do_StoreField (StoreField* x) { |
143 void do_StoreField (StoreField* x) { |
144 if (x->is_init_point()) { |
144 if (x->is_init_point() || // putstatic is an initialization point so treat it as a wide kill |
145 // putstatic is an initialization point so treat it as a wide kill |
145 // This is actually too strict and the JMM doesn't require |
|
146 // this in all cases (e.g. load a; volatile store b; load a) |
|
147 // but possible future optimizations might require this. |
|
148 x->field()->is_volatile()) { |
146 kill_memory(); |
149 kill_memory(); |
147 } else { |
150 } else { |
148 kill_field(x->field()); |
151 kill_field(x->field()); |
149 } |
152 } |
150 } |
153 } |
158 |
161 |
159 void do_Phi (Phi* x) { /* nothing to do */ } |
162 void do_Phi (Phi* x) { /* nothing to do */ } |
160 void do_Local (Local* x) { /* nothing to do */ } |
163 void do_Local (Local* x) { /* nothing to do */ } |
161 void do_Constant (Constant* x) { /* nothing to do */ } |
164 void do_Constant (Constant* x) { /* nothing to do */ } |
162 void do_LoadField (LoadField* x) { |
165 void do_LoadField (LoadField* x) { |
163 if (x->is_init_point()) { |
166 if (x->is_init_point() || // getstatic is an initialization point so treat it as a wide kill |
164 // getstatic is an initialization point so treat it as a wide kill |
167 x->field()->is_volatile()) { // the JMM requires this |
165 kill_memory(); |
168 kill_memory(); |
166 } |
169 } |
167 } |
170 } |
168 void do_ArrayLength (ArrayLength* x) { /* nothing to do */ } |
171 void do_ArrayLength (ArrayLength* x) { /* nothing to do */ } |
169 void do_LoadIndexed (LoadIndexed* x) { /* nothing to do */ } |
172 void do_LoadIndexed (LoadIndexed* x) { /* nothing to do */ } |