< prev index next >

src/hotspot/share/c1/c1_ValueMap.hpp

Print this page

  1 /*
  2  * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *

131 
132 typedef GrowableArray<ValueMap*> ValueMapArray;
133 
134 class ValueNumberingVisitor: public InstructionVisitor {
135  protected:
136   // called by visitor functions for instructions that kill values
137   virtual void kill_memory() = 0;
138   virtual void kill_field(ciField* field, bool all_offsets) = 0;
139   virtual void kill_array(ValueType* type) = 0;
140 
141   // visitor functions
142   void do_StoreField     (StoreField*      x) {
143     if (x->is_init_point() ||  // putstatic is an initialization point so treat it as a wide kill
144         // This is actually too strict and the JMM doesn't require
145         // this in all cases (e.g. load a; volatile store b; load a)
146         // but possible future optimizations might require this.
147         x->field()->is_volatile()) {
148       kill_memory();
149     } else {
150       kill_field(x->field(), x->needs_patching());



151     }
152   }
153   void do_StoreIndexed   (StoreIndexed*    x) { kill_array(x->type()); }
154   void do_MonitorEnter   (MonitorEnter*    x) { kill_memory(); }
155   void do_MonitorExit    (MonitorExit*     x) { kill_memory(); }
156   void do_Invoke         (Invoke*          x) { kill_memory(); }
157   void do_UnsafePut      (UnsafePut*       x) { kill_memory(); }
158   void do_UnsafeGetAndSet(UnsafeGetAndSet* x) { kill_memory(); }
159   void do_UnsafeGet      (UnsafeGet*       x) {
160     if (x->is_volatile()) { // the JMM requires this
161       kill_memory();
162     }
163   }
164   void do_Intrinsic      (Intrinsic*       x) { if (!x->preserves_state()) kill_memory(); }
165 
166   void do_Phi            (Phi*             x) { /* nothing to do */ }
167   void do_Local          (Local*           x) { /* nothing to do */ }
168   void do_Constant       (Constant*        x) { /* nothing to do */ }
169   void do_LoadField      (LoadField*       x) {
170     if (x->is_init_point() ||         // getstatic is an initialization point so treat it as a wide kill
171         x->field()->is_volatile()) {  // the JMM requires this
172       kill_memory();
173     }
174   }
175   void do_ArrayLength    (ArrayLength*     x) { /* nothing to do */ }
176   void do_LoadIndexed    (LoadIndexed*     x) { /* nothing to do */ }
177   void do_NegateOp       (NegateOp*        x) { /* nothing to do */ }
178   void do_ArithmeticOp   (ArithmeticOp*    x) { /* nothing to do */ }
179   void do_ShiftOp        (ShiftOp*         x) { /* nothing to do */ }
180   void do_LogicOp        (LogicOp*         x) { /* nothing to do */ }
181   void do_CompareOp      (CompareOp*       x) { /* nothing to do */ }
182   void do_IfOp           (IfOp*            x) { /* nothing to do */ }
183   void do_Convert        (Convert*         x) { /* nothing to do */ }
184   void do_NullCheck      (NullCheck*       x) { /* nothing to do */ }
185   void do_TypeCast       (TypeCast*        x) { /* nothing to do */ }
186   void do_NewInstance    (NewInstance*     x) { /* nothing to do */ }

187   void do_NewTypeArray   (NewTypeArray*    x) { /* nothing to do */ }
188   void do_NewObjectArray (NewObjectArray*  x) { /* nothing to do */ }
189   void do_NewMultiArray  (NewMultiArray*   x) { /* nothing to do */ }

190   void do_CheckCast      (CheckCast*       x) { /* nothing to do */ }
191   void do_InstanceOf     (InstanceOf*      x) { /* nothing to do */ }
192   void do_BlockBegin     (BlockBegin*      x) { /* nothing to do */ }
193   void do_Goto           (Goto*            x) { /* nothing to do */ }
194   void do_If             (If*              x) { /* nothing to do */ }
195   void do_TableSwitch    (TableSwitch*     x) { /* nothing to do */ }
196   void do_LookupSwitch   (LookupSwitch*    x) { /* nothing to do */ }
197   void do_Return         (Return*          x) { /* nothing to do */ }
198   void do_Throw          (Throw*           x) { /* nothing to do */ }
199   void do_Base           (Base*            x) { /* nothing to do */ }
200   void do_OsrEntry       (OsrEntry*        x) { /* nothing to do */ }
201   void do_ExceptionObject(ExceptionObject* x) { /* nothing to do */ }
202   void do_RoundFP        (RoundFP*         x) { /* nothing to do */ }
203   void do_ProfileCall    (ProfileCall*     x) { /* nothing to do */ }
204   void do_ProfileReturnType (ProfileReturnType*  x) { /* nothing to do */ }

205   void do_ProfileInvoke  (ProfileInvoke*   x) { /* nothing to do */ };
206   void do_RuntimeCall    (RuntimeCall*     x) { /* nothing to do */ };
207   void do_MemBar         (MemBar*          x) { /* nothing to do */ };
208   void do_RangeCheckPredicate(RangeCheckPredicate* x) { /* nothing to do */ };
209 #ifdef ASSERT
210   void do_Assert         (Assert*          x) { /* nothing to do */ };
211 #endif
212 };
213 
214 
215 class ValueNumberingEffects: public ValueNumberingVisitor {
216  private:
217   ValueMap*     _map;
218 
219  public:
220   // implementation for abstract methods of ValueNumberingVisitor
221   void          kill_memory()                                 { _map->kill_memory(); }
222   void          kill_field(ciField* field, bool all_offsets)  { _map->kill_field(field, all_offsets); }
223   void          kill_array(ValueType* type)                   { _map->kill_array(type); }
224 

  1 /*
  2  * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *

131 
132 typedef GrowableArray<ValueMap*> ValueMapArray;
133 
134 class ValueNumberingVisitor: public InstructionVisitor {
135  protected:
136   // called by visitor functions for instructions that kill values
137   virtual void kill_memory() = 0;
138   virtual void kill_field(ciField* field, bool all_offsets) = 0;
139   virtual void kill_array(ValueType* type) = 0;
140 
141   // visitor functions
142   void do_StoreField     (StoreField*      x) {
143     if (x->is_init_point() ||  // putstatic is an initialization point so treat it as a wide kill
144         // This is actually too strict and the JMM doesn't require
145         // this in all cases (e.g. load a; volatile store b; load a)
146         // but possible future optimizations might require this.
147         x->field()->is_volatile()) {
148       kill_memory();
149     } else {
150       kill_field(x->field(), x->needs_patching());
151       if (x->enclosing_field() != NULL) {
152         kill_field(x->enclosing_field(), true);
153       }
154     }
155   }
156   void do_StoreIndexed   (StoreIndexed*    x) { kill_array(x->type()); }
157   void do_MonitorEnter   (MonitorEnter*    x) { kill_memory(); }
158   void do_MonitorExit    (MonitorExit*     x) { kill_memory(); }
159   void do_Invoke         (Invoke*          x) { kill_memory(); }
160   void do_UnsafePut      (UnsafePut*       x) { kill_memory(); }
161   void do_UnsafeGetAndSet(UnsafeGetAndSet* x) { kill_memory(); }
162   void do_UnsafeGet      (UnsafeGet*       x) {
163     if (x->is_volatile()) { // the JMM requires this
164       kill_memory();
165     }
166   }
167   void do_Intrinsic      (Intrinsic*       x) { if (!x->preserves_state()) kill_memory(); }
168 
169   void do_Phi            (Phi*             x) { /* nothing to do */ }
170   void do_Local          (Local*           x) { /* nothing to do */ }
171   void do_Constant       (Constant*        x) { /* nothing to do */ }
172   void do_LoadField      (LoadField*       x) {
173     if (x->is_init_point() ||         // getstatic is an initialization point so treat it as a wide kill
174         x->field()->is_volatile()) {  // the JMM requires this
175       kill_memory();
176     }
177   }
178   void do_ArrayLength    (ArrayLength*     x) { /* nothing to do */ }
179   void do_LoadIndexed    (LoadIndexed*     x) { /* nothing to do */ }
180   void do_NegateOp       (NegateOp*        x) { /* nothing to do */ }
181   void do_ArithmeticOp   (ArithmeticOp*    x) { /* nothing to do */ }
182   void do_ShiftOp        (ShiftOp*         x) { /* nothing to do */ }
183   void do_LogicOp        (LogicOp*         x) { /* nothing to do */ }
184   void do_CompareOp      (CompareOp*       x) { /* nothing to do */ }
185   void do_IfOp           (IfOp*            x) { /* nothing to do */ }
186   void do_Convert        (Convert*         x) { /* nothing to do */ }
187   void do_NullCheck      (NullCheck*       x) { /* nothing to do */ }
188   void do_TypeCast       (TypeCast*        x) { /* nothing to do */ }
189   void do_NewInstance    (NewInstance*     x) { /* nothing to do */ }
190   void do_NewInlineTypeInstance(NewInlineTypeInstance* x) { /* nothing to do */ }
191   void do_NewTypeArray   (NewTypeArray*    x) { /* nothing to do */ }
192   void do_NewObjectArray (NewObjectArray*  x) { /* nothing to do */ }
193   void do_NewMultiArray  (NewMultiArray*   x) { /* nothing to do */ }
194   void do_Deoptimize     (Deoptimize*      x) { /* nothing to do */ }
195   void do_CheckCast      (CheckCast*       x) { /* nothing to do */ }
196   void do_InstanceOf     (InstanceOf*      x) { /* nothing to do */ }
197   void do_BlockBegin     (BlockBegin*      x) { /* nothing to do */ }
198   void do_Goto           (Goto*            x) { /* nothing to do */ }
199   void do_If             (If*              x) { /* nothing to do */ }
200   void do_TableSwitch    (TableSwitch*     x) { /* nothing to do */ }
201   void do_LookupSwitch   (LookupSwitch*    x) { /* nothing to do */ }
202   void do_Return         (Return*          x) { /* nothing to do */ }
203   void do_Throw          (Throw*           x) { /* nothing to do */ }
204   void do_Base           (Base*            x) { /* nothing to do */ }
205   void do_OsrEntry       (OsrEntry*        x) { /* nothing to do */ }
206   void do_ExceptionObject(ExceptionObject* x) { /* nothing to do */ }
207   void do_RoundFP        (RoundFP*         x) { /* nothing to do */ }
208   void do_ProfileCall    (ProfileCall*     x) { /* nothing to do */ }
209   void do_ProfileReturnType (ProfileReturnType*  x) { /* nothing to do */ }
210   void do_ProfileACmpTypes(ProfileACmpTypes*  x) { /* nothing to do */ }
211   void do_ProfileInvoke  (ProfileInvoke*   x) { /* nothing to do */ };
212   void do_RuntimeCall    (RuntimeCall*     x) { /* nothing to do */ };
213   void do_MemBar         (MemBar*          x) { /* nothing to do */ };
214   void do_RangeCheckPredicate(RangeCheckPredicate* x) { /* nothing to do */ };
215 #ifdef ASSERT
216   void do_Assert         (Assert*          x) { /* nothing to do */ };
217 #endif
218 };
219 
220 
221 class ValueNumberingEffects: public ValueNumberingVisitor {
222  private:
223   ValueMap*     _map;
224 
225  public:
226   // implementation for abstract methods of ValueNumberingVisitor
227   void          kill_memory()                                 { _map->kill_memory(); }
228   void          kill_field(ciField* field, bool all_offsets)  { _map->kill_field(field, all_offsets); }
229   void          kill_array(ValueType* type)                   { _map->kill_array(type); }
230 
< prev index next >