src/share/vm/c1/c1_LIRGenerator.hpp

Thu, 07 Apr 2011 09:53:20 -0700

author
johnc
date
Thu, 07 Apr 2011 09:53:20 -0700
changeset 2781
e1162778c1c8
parent 2486
403dc4c1d7f5
child 3592
701a83c86f28
permissions
-rw-r--r--

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer.
Reviewed-by: kvn, iveresov, never, tonyp, dholmes

duke@435 1 /*
never@2486 2 * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_C1_C1_LIRGENERATOR_HPP
stefank@2314 26 #define SHARE_VM_C1_C1_LIRGENERATOR_HPP
stefank@2314 27
stefank@2314 28 #include "c1/c1_Instruction.hpp"
stefank@2314 29 #include "c1/c1_LIR.hpp"
stefank@2314 30 #include "ci/ciMethodData.hpp"
stefank@2314 31 #include "utilities/sizes.hpp"
stefank@2314 32
duke@435 33 // The classes responsible for code emission and register allocation
duke@435 34
duke@435 35
duke@435 36 class LIRGenerator;
duke@435 37 class LIREmitter;
duke@435 38 class Invoke;
duke@435 39 class SwitchRange;
duke@435 40 class LIRItem;
duke@435 41
duke@435 42 define_array(LIRItemArray, LIRItem*)
duke@435 43 define_stack(LIRItemList, LIRItemArray)
duke@435 44
duke@435 45 class SwitchRange: public CompilationResourceObj {
duke@435 46 private:
duke@435 47 int _low_key;
duke@435 48 int _high_key;
duke@435 49 BlockBegin* _sux;
duke@435 50 public:
duke@435 51 SwitchRange(int start_key, BlockBegin* sux): _low_key(start_key), _high_key(start_key), _sux(sux) {}
duke@435 52 void set_high_key(int key) { _high_key = key; }
duke@435 53
duke@435 54 int high_key() const { return _high_key; }
duke@435 55 int low_key() const { return _low_key; }
duke@435 56 BlockBegin* sux() const { return _sux; }
duke@435 57 };
duke@435 58
duke@435 59 define_array(SwitchRangeArray, SwitchRange*)
duke@435 60 define_stack(SwitchRangeList, SwitchRangeArray)
duke@435 61
duke@435 62
duke@435 63 class ResolveNode;
duke@435 64
duke@435 65 define_array(NodeArray, ResolveNode*);
duke@435 66 define_stack(NodeList, NodeArray);
duke@435 67
duke@435 68
duke@435 69 // Node objects form a directed graph of LIR_Opr
duke@435 70 // Edges between Nodes represent moves from one Node to its destinations
duke@435 71 class ResolveNode: public CompilationResourceObj {
duke@435 72 private:
duke@435 73 LIR_Opr _operand; // the source or destinaton
duke@435 74 NodeList _destinations; // for the operand
duke@435 75 bool _assigned; // Value assigned to this Node?
duke@435 76 bool _visited; // Node already visited?
duke@435 77 bool _start_node; // Start node already visited?
duke@435 78
duke@435 79 public:
duke@435 80 ResolveNode(LIR_Opr operand)
duke@435 81 : _operand(operand)
duke@435 82 , _assigned(false)
duke@435 83 , _visited(false)
duke@435 84 , _start_node(false) {};
duke@435 85
duke@435 86 // accessors
duke@435 87 LIR_Opr operand() const { return _operand; }
duke@435 88 int no_of_destinations() const { return _destinations.length(); }
duke@435 89 ResolveNode* destination_at(int i) { return _destinations[i]; }
duke@435 90 bool assigned() const { return _assigned; }
duke@435 91 bool visited() const { return _visited; }
duke@435 92 bool start_node() const { return _start_node; }
duke@435 93
duke@435 94 // modifiers
duke@435 95 void append(ResolveNode* dest) { _destinations.append(dest); }
duke@435 96 void set_assigned() { _assigned = true; }
duke@435 97 void set_visited() { _visited = true; }
duke@435 98 void set_start_node() { _start_node = true; }
duke@435 99 };
duke@435 100
duke@435 101
duke@435 102 // This is shared state to be used by the PhiResolver so the operand
duke@435 103 // arrays don't have to be reallocated for reach resolution.
duke@435 104 class PhiResolverState: public CompilationResourceObj {
duke@435 105 friend class PhiResolver;
duke@435 106
duke@435 107 private:
duke@435 108 NodeList _virtual_operands; // Nodes where the operand is a virtual register
duke@435 109 NodeList _other_operands; // Nodes where the operand is not a virtual register
duke@435 110 NodeList _vreg_table; // Mapping from virtual register to Node
duke@435 111
duke@435 112 public:
duke@435 113 PhiResolverState() {}
duke@435 114
duke@435 115 void reset(int max_vregs);
duke@435 116 };
duke@435 117
duke@435 118
duke@435 119 // class used to move value of phi operand to phi function
duke@435 120 class PhiResolver: public CompilationResourceObj {
duke@435 121 private:
duke@435 122 LIRGenerator* _gen;
duke@435 123 PhiResolverState& _state; // temporary state cached by LIRGenerator
duke@435 124
duke@435 125 ResolveNode* _loop;
duke@435 126 LIR_Opr _temp;
duke@435 127
duke@435 128 // access to shared state arrays
duke@435 129 NodeList& virtual_operands() { return _state._virtual_operands; }
duke@435 130 NodeList& other_operands() { return _state._other_operands; }
duke@435 131 NodeList& vreg_table() { return _state._vreg_table; }
duke@435 132
duke@435 133 ResolveNode* create_node(LIR_Opr opr, bool source);
duke@435 134 ResolveNode* source_node(LIR_Opr opr) { return create_node(opr, true); }
duke@435 135 ResolveNode* destination_node(LIR_Opr opr) { return create_node(opr, false); }
duke@435 136
duke@435 137 void emit_move(LIR_Opr src, LIR_Opr dest);
duke@435 138 void move_to_temp(LIR_Opr src);
duke@435 139 void move_temp_to(LIR_Opr dest);
duke@435 140 void move(ResolveNode* src, ResolveNode* dest);
duke@435 141
duke@435 142 LIRGenerator* gen() {
duke@435 143 return _gen;
duke@435 144 }
duke@435 145
duke@435 146 public:
duke@435 147 PhiResolver(LIRGenerator* _lir_gen, int max_vregs);
duke@435 148 ~PhiResolver();
duke@435 149
duke@435 150 void move(LIR_Opr src, LIR_Opr dest);
duke@435 151 };
duke@435 152
duke@435 153
duke@435 154 // only the classes below belong in the same file
duke@435 155 class LIRGenerator: public InstructionVisitor, public BlockClosure {
ysr@777 156
duke@435 157 private:
duke@435 158 Compilation* _compilation;
duke@435 159 ciMethod* _method; // method that we are compiling
duke@435 160 PhiResolverState _resolver_state;
duke@435 161 BlockBegin* _block;
duke@435 162 int _virtual_register_number;
duke@435 163 Values _instruction_for_operand;
duke@435 164 BitMap2D _vreg_flags; // flags which can be set on a per-vreg basis
duke@435 165 LIR_List* _lir;
ysr@777 166 BarrierSet* _bs;
duke@435 167
duke@435 168 LIRGenerator* gen() {
duke@435 169 return this;
duke@435 170 }
duke@435 171
duke@435 172 #ifdef ASSERT
duke@435 173 LIR_List* lir(const char * file, int line) const {
duke@435 174 _lir->set_file_and_line(file, line);
duke@435 175 return _lir;
duke@435 176 }
duke@435 177 #endif
duke@435 178 LIR_List* lir() const {
duke@435 179 return _lir;
duke@435 180 }
duke@435 181
duke@435 182 // a simple cache of constants used within a block
duke@435 183 GrowableArray<LIR_Const*> _constants;
duke@435 184 LIR_OprList _reg_for_constants;
duke@435 185 Values _unpinned_constants;
duke@435 186
duke@435 187 friend class PhiResolver;
duke@435 188
duke@435 189 // unified bailout support
duke@435 190 void bailout(const char* msg) const { compilation()->bailout(msg); }
duke@435 191 bool bailed_out() const { return compilation()->bailed_out(); }
duke@435 192
duke@435 193 void block_do_prolog(BlockBegin* block);
duke@435 194 void block_do_epilog(BlockBegin* block);
duke@435 195
duke@435 196 // register allocation
duke@435 197 LIR_Opr rlock(Value instr); // lock a free register
duke@435 198 LIR_Opr rlock_result(Value instr);
duke@435 199 LIR_Opr rlock_result(Value instr, BasicType type);
duke@435 200 LIR_Opr rlock_byte(BasicType type);
duke@435 201 LIR_Opr rlock_callee_saved(BasicType type);
duke@435 202
duke@435 203 // get a constant into a register and get track of what register was used
duke@435 204 LIR_Opr load_constant(Constant* x);
duke@435 205 LIR_Opr load_constant(LIR_Const* constant);
duke@435 206
iveresov@2138 207 // Given an immediate value, return an operand usable in logical ops.
iveresov@2138 208 LIR_Opr load_immediate(int x, BasicType type);
iveresov@2138 209
duke@435 210 void set_result(Value x, LIR_Opr opr) {
duke@435 211 assert(opr->is_valid(), "must set to valid value");
duke@435 212 assert(x->operand()->is_illegal(), "operand should never change");
duke@435 213 assert(!opr->is_register() || opr->is_virtual(), "should never set result to a physical register");
duke@435 214 x->set_operand(opr);
duke@435 215 assert(opr == x->operand(), "must be");
duke@435 216 if (opr->is_virtual()) {
duke@435 217 _instruction_for_operand.at_put_grow(opr->vreg_number(), x, NULL);
duke@435 218 }
duke@435 219 }
duke@435 220 void set_no_result(Value x) { assert(!x->has_uses(), "can't have use"); x->clear_operand(); }
duke@435 221
duke@435 222 friend class LIRItem;
duke@435 223
duke@435 224 LIR_Opr round_item(LIR_Opr opr);
duke@435 225 LIR_Opr force_to_spill(LIR_Opr value, BasicType t);
duke@435 226
duke@435 227 PhiResolverState& resolver_state() { return _resolver_state; }
duke@435 228
duke@435 229 void move_to_phi(PhiResolver* resolver, Value cur_val, Value sux_val);
duke@435 230 void move_to_phi(ValueStack* cur_state);
duke@435 231
duke@435 232 // code emission
duke@435 233 void do_ArithmeticOp_Long (ArithmeticOp* x);
duke@435 234 void do_ArithmeticOp_Int (ArithmeticOp* x);
duke@435 235 void do_ArithmeticOp_FPU (ArithmeticOp* x);
duke@435 236
duke@435 237 // platform dependent
duke@435 238 LIR_Opr getThreadPointer();
duke@435 239
duke@435 240 void do_RegisterFinalizer(Intrinsic* x);
duke@435 241 void do_getClass(Intrinsic* x);
duke@435 242 void do_currentThread(Intrinsic* x);
duke@435 243 void do_MathIntrinsic(Intrinsic* x);
duke@435 244 void do_ArrayCopy(Intrinsic* x);
duke@435 245 void do_CompareAndSwap(Intrinsic* x, ValueType* type);
duke@435 246 void do_AttemptUpdate(Intrinsic* x);
duke@435 247 void do_NIOCheckIndex(Intrinsic* x);
duke@435 248 void do_FPIntrinsics(Intrinsic* x);
johnc@2781 249 void do_Reference_get(Intrinsic* x);
duke@435 250
duke@435 251 void do_UnsafePrefetch(UnsafePrefetch* x, bool is_store);
duke@435 252
duke@435 253 LIR_Opr call_runtime(BasicTypeArray* signature, LIRItemList* args, address entry, ValueType* result_type, CodeEmitInfo* info);
duke@435 254 LIR_Opr call_runtime(BasicTypeArray* signature, LIR_OprList* args, address entry, ValueType* result_type, CodeEmitInfo* info);
duke@435 255
duke@435 256 // convenience functions
duke@435 257 LIR_Opr call_runtime(Value arg1, address entry, ValueType* result_type, CodeEmitInfo* info);
duke@435 258 LIR_Opr call_runtime(Value arg1, Value arg2, address entry, ValueType* result_type, CodeEmitInfo* info);
duke@435 259
duke@435 260 // GC Barriers
duke@435 261
duke@435 262 // generic interface
duke@435 263
johnc@2781 264 void pre_barrier(LIR_Opr addr_opr, LIR_Opr pre_val, bool do_load, bool patch, CodeEmitInfo* info);
duke@435 265 void post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val);
duke@435 266
duke@435 267 // specific implementations
ysr@777 268 // pre barriers
ysr@777 269
johnc@2781 270 void G1SATBCardTableModRef_pre_barrier(LIR_Opr addr_opr, LIR_Opr pre_val,
johnc@2781 271 bool do_load, bool patch, CodeEmitInfo* info);
duke@435 272
duke@435 273 // post barriers
duke@435 274
ysr@777 275 void G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val);
duke@435 276 void CardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val);
duke@435 277
duke@435 278
duke@435 279 static LIR_Opr result_register_for(ValueType* type, bool callee = false);
duke@435 280
duke@435 281 ciObject* get_jobject_constant(Value value);
duke@435 282
duke@435 283 LIRItemList* invoke_visit_arguments(Invoke* x);
duke@435 284 void invoke_load_arguments(Invoke* x, LIRItemList* args, const LIR_OprList* arg_list);
duke@435 285
duke@435 286 void trace_block_entry(BlockBegin* block);
duke@435 287
duke@435 288 // volatile field operations are never patchable because a klass
duke@435 289 // must be loaded to know it's volatile which means that the offset
duke@435 290 // it always known as well.
duke@435 291 void volatile_field_store(LIR_Opr value, LIR_Address* address, CodeEmitInfo* info);
duke@435 292 void volatile_field_load(LIR_Address* address, LIR_Opr result, CodeEmitInfo* info);
duke@435 293
duke@435 294 void put_Object_unsafe(LIR_Opr src, LIR_Opr offset, LIR_Opr data, BasicType type, bool is_volatile);
duke@435 295 void get_Object_unsafe(LIR_Opr dest, LIR_Opr src, LIR_Opr offset, BasicType type, bool is_volatile);
duke@435 296
duke@435 297 void arithmetic_call_op (Bytecodes::Code code, LIR_Opr result, LIR_OprList* args);
duke@435 298
iveresov@2138 299 void increment_counter(address counter, BasicType type, int step = 1);
duke@435 300 void increment_counter(LIR_Address* addr, int step = 1);
duke@435 301
duke@435 302 // is_strictfp is only needed for mul and div (and only generates different code on i486)
duke@435 303 void arithmetic_op(Bytecodes::Code code, LIR_Opr result, LIR_Opr left, LIR_Opr right, bool is_strictfp, LIR_Opr tmp, CodeEmitInfo* info = NULL);
duke@435 304 // machine dependent. returns true if it emitted code for the multiply
duke@435 305 bool strength_reduce_multiply(LIR_Opr left, int constant, LIR_Opr result, LIR_Opr tmp);
duke@435 306
duke@435 307 void store_stack_parameter (LIR_Opr opr, ByteSize offset_from_sp_in_bytes);
duke@435 308
duke@435 309 void jobject2reg_with_patching(LIR_Opr r, ciObject* obj, CodeEmitInfo* info);
duke@435 310
duke@435 311 // this loads the length and compares against the index
duke@435 312 void array_range_check (LIR_Opr array, LIR_Opr index, CodeEmitInfo* null_check_info, CodeEmitInfo* range_check_info);
duke@435 313 // For java.nio.Buffer.checkIndex
duke@435 314 void nio_range_check (LIR_Opr buffer, LIR_Opr index, LIR_Opr result, CodeEmitInfo* info);
duke@435 315
duke@435 316 void arithmetic_op_int (Bytecodes::Code code, LIR_Opr result, LIR_Opr left, LIR_Opr right, LIR_Opr tmp);
duke@435 317 void arithmetic_op_long (Bytecodes::Code code, LIR_Opr result, LIR_Opr left, LIR_Opr right, CodeEmitInfo* info = NULL);
duke@435 318 void arithmetic_op_fpu (Bytecodes::Code code, LIR_Opr result, LIR_Opr left, LIR_Opr right, bool is_strictfp, LIR_Opr tmp = LIR_OprFact::illegalOpr);
duke@435 319
duke@435 320 void shift_op (Bytecodes::Code code, LIR_Opr dst_reg, LIR_Opr value, LIR_Opr count, LIR_Opr tmp);
duke@435 321
duke@435 322 void logic_op (Bytecodes::Code code, LIR_Opr dst_reg, LIR_Opr left, LIR_Opr right);
duke@435 323
duke@435 324 void monitor_enter (LIR_Opr object, LIR_Opr lock, LIR_Opr hdr, LIR_Opr scratch, int monitor_no, CodeEmitInfo* info_for_exception, CodeEmitInfo* info);
bobv@2036 325 void monitor_exit (LIR_Opr object, LIR_Opr lock, LIR_Opr hdr, LIR_Opr scratch, int monitor_no);
duke@435 326
duke@435 327 void new_instance (LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info);
duke@435 328
duke@435 329 // machine dependent
duke@435 330 void cmp_mem_int(LIR_Condition condition, LIR_Opr base, int disp, int c, CodeEmitInfo* info);
duke@435 331 void cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Opr base, int disp, BasicType type, CodeEmitInfo* info);
duke@435 332 void cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Opr base, LIR_Opr disp, BasicType type, CodeEmitInfo* info);
duke@435 333
duke@435 334 void arraycopy_helper(Intrinsic* x, int* flags, ciArrayKlass** expected_type);
duke@435 335
duke@435 336 // returns a LIR_Address to address an array location. May also
duke@435 337 // emit some code as part of address calculation. If
duke@435 338 // needs_card_mark is true then compute the full address for use by
duke@435 339 // both the store and the card mark.
duke@435 340 LIR_Address* generate_address(LIR_Opr base,
duke@435 341 LIR_Opr index, int shift,
duke@435 342 int disp,
duke@435 343 BasicType type);
duke@435 344 LIR_Address* generate_address(LIR_Opr base, int disp, BasicType type) {
duke@435 345 return generate_address(base, LIR_OprFact::illegalOpr, 0, disp, type);
duke@435 346 }
duke@435 347 LIR_Address* emit_array_address(LIR_Opr array_opr, LIR_Opr index_opr, BasicType type, bool needs_card_mark);
duke@435 348
bobv@2036 349 // the helper for generate_address
bobv@2036 350 void add_large_constant(LIR_Opr src, int c, LIR_Opr dest);
bobv@2036 351
duke@435 352 // machine preferences and characteristics
duke@435 353 bool can_inline_as_constant(Value i) const;
duke@435 354 bool can_inline_as_constant(LIR_Const* c) const;
duke@435 355 bool can_store_as_constant(Value i, BasicType type) const;
duke@435 356
duke@435 357 LIR_Opr safepoint_poll_register();
iveresov@2138 358
iveresov@2138 359 void profile_branch(If* if_instr, If::Condition cond);
iveresov@2138 360 void increment_event_counter_impl(CodeEmitInfo* info,
iveresov@2138 361 ciMethod *method, int frequency,
iveresov@2138 362 int bci, bool backedge, bool notify);
iveresov@2138 363 void increment_event_counter(CodeEmitInfo* info, int bci, bool backedge);
iveresov@2138 364 void increment_invocation_counter(CodeEmitInfo *info) {
iveresov@2138 365 if (compilation()->count_invocations()) {
iveresov@2138 366 increment_event_counter(info, InvocationEntryBci, false);
iveresov@2138 367 }
iveresov@2138 368 }
iveresov@2138 369 void increment_backedge_counter(CodeEmitInfo* info, int bci) {
iveresov@2138 370 if (compilation()->count_backedges()) {
iveresov@2138 371 increment_event_counter(info, bci, true);
iveresov@2138 372 }
duke@435 373 }
duke@435 374
duke@435 375 CodeEmitInfo* state_for(Instruction* x, ValueStack* state, bool ignore_xhandler = false);
duke@435 376 CodeEmitInfo* state_for(Instruction* x);
duke@435 377
duke@435 378 // allocates a virtual register for this instruction if
duke@435 379 // one isn't already allocated. Only for Phi and Local.
duke@435 380 LIR_Opr operand_for_instruction(Instruction *x);
duke@435 381
duke@435 382 void set_block(BlockBegin* block) { _block = block; }
duke@435 383
duke@435 384 void block_prolog(BlockBegin* block);
duke@435 385 void block_epilog(BlockBegin* block);
duke@435 386
duke@435 387 void do_root (Instruction* instr);
duke@435 388 void walk (Instruction* instr);
duke@435 389
duke@435 390 void bind_block_entry(BlockBegin* block);
duke@435 391 void start_block(BlockBegin* block);
duke@435 392
duke@435 393 LIR_Opr new_register(BasicType type);
duke@435 394 LIR_Opr new_register(Value value) { return new_register(as_BasicType(value->type())); }
duke@435 395 LIR_Opr new_register(ValueType* type) { return new_register(as_BasicType(type)); }
duke@435 396
duke@435 397 // returns a register suitable for doing pointer math
duke@435 398 LIR_Opr new_pointer_register() {
duke@435 399 #ifdef _LP64
duke@435 400 return new_register(T_LONG);
duke@435 401 #else
duke@435 402 return new_register(T_INT);
duke@435 403 #endif
duke@435 404 }
duke@435 405
duke@435 406 static LIR_Condition lir_cond(If::Condition cond) {
duke@435 407 LIR_Condition l;
duke@435 408 switch (cond) {
duke@435 409 case If::eql: l = lir_cond_equal; break;
duke@435 410 case If::neq: l = lir_cond_notEqual; break;
duke@435 411 case If::lss: l = lir_cond_less; break;
duke@435 412 case If::leq: l = lir_cond_lessEqual; break;
duke@435 413 case If::geq: l = lir_cond_greaterEqual; break;
duke@435 414 case If::gtr: l = lir_cond_greater; break;
duke@435 415 };
duke@435 416 return l;
duke@435 417 }
duke@435 418
bobv@2036 419 #ifdef __SOFTFP__
bobv@2036 420 void do_soft_float_compare(If *x);
bobv@2036 421 #endif // __SOFTFP__
bobv@2036 422
duke@435 423 void init();
duke@435 424
duke@435 425 SwitchRangeArray* create_lookup_ranges(TableSwitch* x);
duke@435 426 SwitchRangeArray* create_lookup_ranges(LookupSwitch* x);
duke@435 427 void do_SwitchRanges(SwitchRangeArray* x, LIR_Opr value, BlockBegin* default_sux);
duke@435 428
duke@435 429 public:
duke@435 430 Compilation* compilation() const { return _compilation; }
duke@435 431 FrameMap* frame_map() const { return _compilation->frame_map(); }
duke@435 432 ciMethod* method() const { return _method; }
duke@435 433 BlockBegin* block() const { return _block; }
duke@435 434 IRScope* scope() const { return block()->scope(); }
duke@435 435
duke@435 436 int max_virtual_register_number() const { return _virtual_register_number; }
duke@435 437
duke@435 438 void block_do(BlockBegin* block);
duke@435 439
duke@435 440 // Flags that can be set on vregs
duke@435 441 enum VregFlag {
duke@435 442 must_start_in_memory = 0 // needs to be assigned a memory location at beginning, but may then be loaded in a register
duke@435 443 , callee_saved = 1 // must be in a callee saved register
duke@435 444 , byte_reg = 2 // must be in a byte register
duke@435 445 , num_vreg_flags
duke@435 446
duke@435 447 };
duke@435 448
duke@435 449 LIRGenerator(Compilation* compilation, ciMethod* method)
duke@435 450 : _compilation(compilation)
duke@435 451 , _method(method)
duke@435 452 , _virtual_register_number(LIR_OprDesc::vreg_base)
duke@435 453 , _vreg_flags(NULL, 0, num_vreg_flags) {
duke@435 454 init();
duke@435 455 }
duke@435 456
duke@435 457 // for virtual registers, maps them back to Phi's or Local's
duke@435 458 Instruction* instruction_for_opr(LIR_Opr opr);
duke@435 459 Instruction* instruction_for_vreg(int reg_num);
duke@435 460
duke@435 461 void set_vreg_flag (int vreg_num, VregFlag f);
duke@435 462 bool is_vreg_flag_set(int vreg_num, VregFlag f);
duke@435 463 void set_vreg_flag (LIR_Opr opr, VregFlag f) { set_vreg_flag(opr->vreg_number(), f); }
duke@435 464 bool is_vreg_flag_set(LIR_Opr opr, VregFlag f) { return is_vreg_flag_set(opr->vreg_number(), f); }
duke@435 465
duke@435 466 // statics
duke@435 467 static LIR_Opr exceptionOopOpr();
duke@435 468 static LIR_Opr exceptionPcOpr();
duke@435 469 static LIR_Opr divInOpr();
duke@435 470 static LIR_Opr divOutOpr();
duke@435 471 static LIR_Opr remOutOpr();
duke@435 472 static LIR_Opr shiftCountOpr();
duke@435 473 LIR_Opr syncTempOpr();
bobv@2036 474 LIR_Opr atomicLockOpr();
duke@435 475
duke@435 476 // returns a register suitable for saving the thread in a
duke@435 477 // call_runtime_leaf if one is needed.
duke@435 478 LIR_Opr getThreadTemp();
duke@435 479
duke@435 480 // visitor functionality
duke@435 481 virtual void do_Phi (Phi* x);
duke@435 482 virtual void do_Local (Local* x);
duke@435 483 virtual void do_Constant (Constant* x);
duke@435 484 virtual void do_LoadField (LoadField* x);
duke@435 485 virtual void do_StoreField (StoreField* x);
duke@435 486 virtual void do_ArrayLength (ArrayLength* x);
duke@435 487 virtual void do_LoadIndexed (LoadIndexed* x);
duke@435 488 virtual void do_StoreIndexed (StoreIndexed* x);
duke@435 489 virtual void do_NegateOp (NegateOp* x);
duke@435 490 virtual void do_ArithmeticOp (ArithmeticOp* x);
duke@435 491 virtual void do_ShiftOp (ShiftOp* x);
duke@435 492 virtual void do_LogicOp (LogicOp* x);
duke@435 493 virtual void do_CompareOp (CompareOp* x);
duke@435 494 virtual void do_IfOp (IfOp* x);
duke@435 495 virtual void do_Convert (Convert* x);
duke@435 496 virtual void do_NullCheck (NullCheck* x);
duke@435 497 virtual void do_Invoke (Invoke* x);
duke@435 498 virtual void do_NewInstance (NewInstance* x);
duke@435 499 virtual void do_NewTypeArray (NewTypeArray* x);
duke@435 500 virtual void do_NewObjectArray (NewObjectArray* x);
duke@435 501 virtual void do_NewMultiArray (NewMultiArray* x);
duke@435 502 virtual void do_CheckCast (CheckCast* x);
duke@435 503 virtual void do_InstanceOf (InstanceOf* x);
duke@435 504 virtual void do_MonitorEnter (MonitorEnter* x);
duke@435 505 virtual void do_MonitorExit (MonitorExit* x);
duke@435 506 virtual void do_Intrinsic (Intrinsic* x);
duke@435 507 virtual void do_BlockBegin (BlockBegin* x);
duke@435 508 virtual void do_Goto (Goto* x);
duke@435 509 virtual void do_If (If* x);
duke@435 510 virtual void do_IfInstanceOf (IfInstanceOf* x);
duke@435 511 virtual void do_TableSwitch (TableSwitch* x);
duke@435 512 virtual void do_LookupSwitch (LookupSwitch* x);
duke@435 513 virtual void do_Return (Return* x);
duke@435 514 virtual void do_Throw (Throw* x);
duke@435 515 virtual void do_Base (Base* x);
duke@435 516 virtual void do_OsrEntry (OsrEntry* x);
duke@435 517 virtual void do_ExceptionObject(ExceptionObject* x);
duke@435 518 virtual void do_RoundFP (RoundFP* x);
duke@435 519 virtual void do_UnsafeGetRaw (UnsafeGetRaw* x);
duke@435 520 virtual void do_UnsafePutRaw (UnsafePutRaw* x);
duke@435 521 virtual void do_UnsafeGetObject(UnsafeGetObject* x);
duke@435 522 virtual void do_UnsafePutObject(UnsafePutObject* x);
duke@435 523 virtual void do_UnsafePrefetchRead (UnsafePrefetchRead* x);
duke@435 524 virtual void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x);
duke@435 525 virtual void do_ProfileCall (ProfileCall* x);
iveresov@2138 526 virtual void do_ProfileInvoke (ProfileInvoke* x);
never@2486 527 virtual void do_RuntimeCall (RuntimeCall* x);
duke@435 528 };
duke@435 529
duke@435 530
duke@435 531 class LIRItem: public CompilationResourceObj {
duke@435 532 private:
duke@435 533 Value _value;
duke@435 534 LIRGenerator* _gen;
duke@435 535 LIR_Opr _result;
duke@435 536 bool _destroys_register;
duke@435 537 LIR_Opr _new_result;
duke@435 538
duke@435 539 LIRGenerator* gen() const { return _gen; }
duke@435 540
duke@435 541 public:
duke@435 542 LIRItem(Value value, LIRGenerator* gen) {
duke@435 543 _destroys_register = false;
duke@435 544 _gen = gen;
duke@435 545 set_instruction(value);
duke@435 546 }
duke@435 547
duke@435 548 LIRItem(LIRGenerator* gen) {
duke@435 549 _destroys_register = false;
duke@435 550 _gen = gen;
duke@435 551 _result = LIR_OprFact::illegalOpr;
duke@435 552 set_instruction(NULL);
duke@435 553 }
duke@435 554
duke@435 555 void set_instruction(Value value) {
duke@435 556 _value = value;
duke@435 557 _result = LIR_OprFact::illegalOpr;
duke@435 558 if (_value != NULL) {
duke@435 559 _gen->walk(_value);
duke@435 560 _result = _value->operand();
duke@435 561 }
duke@435 562 _new_result = LIR_OprFact::illegalOpr;
duke@435 563 }
duke@435 564
duke@435 565 Value value() const { return _value; }
duke@435 566 ValueType* type() const { return value()->type(); }
duke@435 567 LIR_Opr result() {
duke@435 568 assert(!_destroys_register || (!_result->is_register() || _result->is_virtual()),
duke@435 569 "shouldn't use set_destroys_register with physical regsiters");
duke@435 570 if (_destroys_register && _result->is_register()) {
duke@435 571 if (_new_result->is_illegal()) {
duke@435 572 _new_result = _gen->new_register(type());
duke@435 573 gen()->lir()->move(_result, _new_result);
duke@435 574 }
duke@435 575 return _new_result;
duke@435 576 } else {
duke@435 577 return _result;
duke@435 578 }
duke@435 579 return _result;
duke@435 580 }
duke@435 581
duke@435 582 void set_result(LIR_Opr opr);
duke@435 583
duke@435 584 void load_item();
duke@435 585 void load_byte_item();
duke@435 586 void load_nonconstant();
duke@435 587 // load any values which can't be expressed as part of a single store instruction
duke@435 588 void load_for_store(BasicType store_type);
duke@435 589 void load_item_force(LIR_Opr reg);
duke@435 590
duke@435 591 void dont_load_item() {
duke@435 592 // do nothing
duke@435 593 }
duke@435 594
duke@435 595 void set_destroys_register() {
duke@435 596 _destroys_register = true;
duke@435 597 }
duke@435 598
duke@435 599 bool is_constant() const { return value()->as_Constant() != NULL; }
duke@435 600 bool is_stack() { return result()->is_stack(); }
duke@435 601 bool is_register() { return result()->is_register(); }
duke@435 602
duke@435 603 ciObject* get_jobject_constant() const;
duke@435 604 jint get_jint_constant() const;
duke@435 605 jlong get_jlong_constant() const;
duke@435 606 jfloat get_jfloat_constant() const;
duke@435 607 jdouble get_jdouble_constant() const;
duke@435 608 jint get_address_constant() const;
duke@435 609 };
stefank@2314 610
stefank@2314 611 #endif // SHARE_VM_C1_C1_LIRGENERATOR_HPP

mercurial