1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/share/vm/c1/c1_IR.cpp Sat Dec 01 00:00:00 2007 +0000 1.3 @@ -0,0 +1,1323 @@ 1.4 +/* 1.5 + * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. 1.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.7 + * 1.8 + * This code is free software; you can redistribute it and/or modify it 1.9 + * under the terms of the GNU General Public License version 2 only, as 1.10 + * published by the Free Software Foundation. 1.11 + * 1.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 1.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1.15 + * version 2 for more details (a copy is included in the LICENSE file that 1.16 + * accompanied this code). 1.17 + * 1.18 + * You should have received a copy of the GNU General Public License version 1.19 + * 2 along with this work; if not, write to the Free Software Foundation, 1.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1.21 + * 1.22 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 1.23 + * CA 95054 USA or visit www.sun.com if you need additional information or 1.24 + * have any questions. 1.25 + * 1.26 + */ 1.27 + 1.28 +# include "incls/_precompiled.incl" 1.29 +# include "incls/_c1_IR.cpp.incl" 1.30 + 1.31 + 1.32 +// Implementation of XHandlers 1.33 +// 1.34 +// Note: This code could eventually go away if we are 1.35 +// just using the ciExceptionHandlerStream. 1.36 + 1.37 +XHandlers::XHandlers(ciMethod* method) : _list(method->exception_table_length()) { 1.38 + ciExceptionHandlerStream s(method); 1.39 + while (!s.is_done()) { 1.40 + _list.append(new XHandler(s.handler())); 1.41 + s.next(); 1.42 + } 1.43 + assert(s.count() == method->exception_table_length(), "exception table lengths inconsistent"); 1.44 +} 1.45 + 1.46 +// deep copy of all XHandler contained in list 1.47 +XHandlers::XHandlers(XHandlers* other) : 1.48 + _list(other->length()) 1.49 +{ 1.50 + for (int i = 0; i < other->length(); i++) { 1.51 + _list.append(new XHandler(other->handler_at(i))); 1.52 + } 1.53 +} 1.54 + 1.55 +// Returns whether a particular exception type can be caught. Also 1.56 +// returns true if klass is unloaded or any exception handler 1.57 +// classes are unloaded. type_is_exact indicates whether the throw 1.58 +// is known to be exactly that class or it might throw a subtype. 1.59 +bool XHandlers::could_catch(ciInstanceKlass* klass, bool type_is_exact) const { 1.60 + // the type is unknown so be conservative 1.61 + if (!klass->is_loaded()) { 1.62 + return true; 1.63 + } 1.64 + 1.65 + for (int i = 0; i < length(); i++) { 1.66 + XHandler* handler = handler_at(i); 1.67 + if (handler->is_catch_all()) { 1.68 + // catch of ANY 1.69 + return true; 1.70 + } 1.71 + ciInstanceKlass* handler_klass = handler->catch_klass(); 1.72 + // if it's unknown it might be catchable 1.73 + if (!handler_klass->is_loaded()) { 1.74 + return true; 1.75 + } 1.76 + // if the throw type is definitely a subtype of the catch type 1.77 + // then it can be caught. 1.78 + if (klass->is_subtype_of(handler_klass)) { 1.79 + return true; 1.80 + } 1.81 + if (!type_is_exact) { 1.82 + // If the type isn't exactly known then it can also be caught by 1.83 + // catch statements where the inexact type is a subtype of the 1.84 + // catch type. 1.85 + // given: foo extends bar extends Exception 1.86 + // throw bar can be caught by catch foo, catch bar, and catch 1.87 + // Exception, however it can't be caught by any handlers without 1.88 + // bar in its type hierarchy. 1.89 + if (handler_klass->is_subtype_of(klass)) { 1.90 + return true; 1.91 + } 1.92 + } 1.93 + } 1.94 + 1.95 + return false; 1.96 +} 1.97 + 1.98 + 1.99 +bool XHandlers::equals(XHandlers* others) const { 1.100 + if (others == NULL) return false; 1.101 + if (length() != others->length()) return false; 1.102 + 1.103 + for (int i = 0; i < length(); i++) { 1.104 + if (!handler_at(i)->equals(others->handler_at(i))) return false; 1.105 + } 1.106 + return true; 1.107 +} 1.108 + 1.109 +bool XHandler::equals(XHandler* other) const { 1.110 + assert(entry_pco() != -1 && other->entry_pco() != -1, "must have entry_pco"); 1.111 + 1.112 + if (entry_pco() != other->entry_pco()) return false; 1.113 + if (scope_count() != other->scope_count()) return false; 1.114 + if (_desc != other->_desc) return false; 1.115 + 1.116 + assert(entry_block() == other->entry_block(), "entry_block must be equal when entry_pco is equal"); 1.117 + return true; 1.118 +} 1.119 + 1.120 + 1.121 +// Implementation of IRScope 1.122 + 1.123 +BlockBegin* IRScope::header_block(BlockBegin* entry, BlockBegin::Flag f, ValueStack* state) { 1.124 + if (entry == NULL) return NULL; 1.125 + assert(entry->is_set(f), "entry/flag mismatch"); 1.126 + // create header block 1.127 + BlockBegin* h = new BlockBegin(entry->bci()); 1.128 + BlockEnd* g = new Goto(entry, false); 1.129 + h->set_next(g, entry->bci()); 1.130 + h->set_end(g); 1.131 + h->set(f); 1.132 + // setup header block end state 1.133 + ValueStack* s = state->copy(); // can use copy since stack is empty (=> no phis) 1.134 + assert(s->stack_is_empty(), "must have empty stack at entry point"); 1.135 + g->set_state(s); 1.136 + return h; 1.137 +} 1.138 + 1.139 + 1.140 +BlockBegin* IRScope::build_graph(Compilation* compilation, int osr_bci) { 1.141 + GraphBuilder gm(compilation, this); 1.142 + NOT_PRODUCT(if (PrintValueNumbering && Verbose) gm.print_stats()); 1.143 + if (compilation->bailed_out()) return NULL; 1.144 + return gm.start(); 1.145 +} 1.146 + 1.147 + 1.148 +IRScope::IRScope(Compilation* compilation, IRScope* caller, int caller_bci, ciMethod* method, int osr_bci, bool create_graph) 1.149 +: _callees(2) 1.150 +, _compilation(compilation) 1.151 +, _lock_stack_size(-1) 1.152 +, _requires_phi_function(method->max_locals()) 1.153 +{ 1.154 + _caller = caller; 1.155 + _caller_bci = caller == NULL ? -1 : caller_bci; 1.156 + _caller_state = NULL; // Must be set later if needed 1.157 + _level = caller == NULL ? 0 : caller->level() + 1; 1.158 + _method = method; 1.159 + _xhandlers = new XHandlers(method); 1.160 + _number_of_locks = 0; 1.161 + _monitor_pairing_ok = method->has_balanced_monitors(); 1.162 + _start = NULL; 1.163 + 1.164 + if (osr_bci == -1) { 1.165 + _requires_phi_function.clear(); 1.166 + } else { 1.167 + // selective creation of phi functions is not possibel in osr-methods 1.168 + _requires_phi_function.set_range(0, method->max_locals()); 1.169 + } 1.170 + 1.171 + assert(method->holder()->is_loaded() , "method holder must be loaded"); 1.172 + 1.173 + // build graph if monitor pairing is ok 1.174 + if (create_graph && monitor_pairing_ok()) _start = build_graph(compilation, osr_bci); 1.175 +} 1.176 + 1.177 + 1.178 +int IRScope::max_stack() const { 1.179 + int my_max = method()->max_stack(); 1.180 + int callee_max = 0; 1.181 + for (int i = 0; i < number_of_callees(); i++) { 1.182 + callee_max = MAX2(callee_max, callee_no(i)->max_stack()); 1.183 + } 1.184 + return my_max + callee_max; 1.185 +} 1.186 + 1.187 + 1.188 +void IRScope::compute_lock_stack_size() { 1.189 + if (!InlineMethodsWithExceptionHandlers) { 1.190 + _lock_stack_size = 0; 1.191 + return; 1.192 + } 1.193 + 1.194 + // Figure out whether we have to preserve expression stack elements 1.195 + // for parent scopes, and if so, how many 1.196 + IRScope* cur_scope = this; 1.197 + while (cur_scope != NULL && !cur_scope->xhandlers()->has_handlers()) { 1.198 + cur_scope = cur_scope->caller(); 1.199 + } 1.200 + _lock_stack_size = (cur_scope == NULL ? 0 : 1.201 + (cur_scope->caller_state() == NULL ? 0 : 1.202 + cur_scope->caller_state()->stack_size())); 1.203 +} 1.204 + 1.205 +int IRScope::top_scope_bci() const { 1.206 + assert(!is_top_scope(), "no correct answer for top scope possible"); 1.207 + const IRScope* scope = this; 1.208 + while (!scope->caller()->is_top_scope()) { 1.209 + scope = scope->caller(); 1.210 + } 1.211 + return scope->caller_bci(); 1.212 +} 1.213 + 1.214 + 1.215 + 1.216 +// Implementation of CodeEmitInfo 1.217 + 1.218 +// Stack must be NON-null 1.219 +CodeEmitInfo::CodeEmitInfo(int bci, ValueStack* stack, XHandlers* exception_handlers) 1.220 + : _scope(stack->scope()) 1.221 + , _bci(bci) 1.222 + , _scope_debug_info(NULL) 1.223 + , _oop_map(NULL) 1.224 + , _stack(stack) 1.225 + , _exception_handlers(exception_handlers) 1.226 + , _next(NULL) 1.227 + , _id(-1) { 1.228 + assert(_stack != NULL, "must be non null"); 1.229 + assert(_bci == SynchronizationEntryBCI || Bytecodes::is_defined(scope()->method()->java_code_at_bci(_bci)), "make sure bci points at a real bytecode"); 1.230 +} 1.231 + 1.232 + 1.233 +CodeEmitInfo::CodeEmitInfo(CodeEmitInfo* info, bool lock_stack_only) 1.234 + : _scope(info->_scope) 1.235 + , _exception_handlers(NULL) 1.236 + , _bci(info->_bci) 1.237 + , _scope_debug_info(NULL) 1.238 + , _oop_map(NULL) { 1.239 + if (lock_stack_only) { 1.240 + if (info->_stack != NULL) { 1.241 + _stack = info->_stack->copy_locks(); 1.242 + } else { 1.243 + _stack = NULL; 1.244 + } 1.245 + } else { 1.246 + _stack = info->_stack; 1.247 + } 1.248 + 1.249 + // deep copy of exception handlers 1.250 + if (info->_exception_handlers != NULL) { 1.251 + _exception_handlers = new XHandlers(info->_exception_handlers); 1.252 + } 1.253 +} 1.254 + 1.255 + 1.256 +void CodeEmitInfo::record_debug_info(DebugInformationRecorder* recorder, int pc_offset) { 1.257 + // record the safepoint before recording the debug info for enclosing scopes 1.258 + recorder->add_safepoint(pc_offset, _oop_map->deep_copy()); 1.259 + _scope_debug_info->record_debug_info(recorder, pc_offset); 1.260 + recorder->end_safepoint(pc_offset); 1.261 +} 1.262 + 1.263 + 1.264 +void CodeEmitInfo::add_register_oop(LIR_Opr opr) { 1.265 + assert(_oop_map != NULL, "oop map must already exist"); 1.266 + assert(opr->is_single_cpu(), "should not call otherwise"); 1.267 + 1.268 + int frame_size = frame_map()->framesize(); 1.269 + int arg_count = frame_map()->oop_map_arg_count(); 1.270 + VMReg name = frame_map()->regname(opr); 1.271 + _oop_map->set_oop(name); 1.272 +} 1.273 + 1.274 + 1.275 + 1.276 + 1.277 +// Implementation of IR 1.278 + 1.279 +IR::IR(Compilation* compilation, ciMethod* method, int osr_bci) : 1.280 + _locals_size(in_WordSize(-1)) 1.281 + , _num_loops(0) { 1.282 + // initialize data structures 1.283 + ValueType::initialize(); 1.284 + Instruction::initialize(); 1.285 + BlockBegin::initialize(); 1.286 + GraphBuilder::initialize(); 1.287 + // setup IR fields 1.288 + _compilation = compilation; 1.289 + _top_scope = new IRScope(compilation, NULL, -1, method, osr_bci, true); 1.290 + _code = NULL; 1.291 +} 1.292 + 1.293 + 1.294 +void IR::optimize() { 1.295 + Optimizer opt(this); 1.296 + if (DoCEE) { 1.297 + opt.eliminate_conditional_expressions(); 1.298 +#ifndef PRODUCT 1.299 + if (PrintCFG || PrintCFG1) { tty->print_cr("CFG after CEE"); print(true); } 1.300 + if (PrintIR || PrintIR1 ) { tty->print_cr("IR after CEE"); print(false); } 1.301 +#endif 1.302 + } 1.303 + if (EliminateBlocks) { 1.304 + opt.eliminate_blocks(); 1.305 +#ifndef PRODUCT 1.306 + if (PrintCFG || PrintCFG1) { tty->print_cr("CFG after block elimination"); print(true); } 1.307 + if (PrintIR || PrintIR1 ) { tty->print_cr("IR after block elimination"); print(false); } 1.308 +#endif 1.309 + } 1.310 + if (EliminateNullChecks) { 1.311 + opt.eliminate_null_checks(); 1.312 +#ifndef PRODUCT 1.313 + if (PrintCFG || PrintCFG1) { tty->print_cr("CFG after null check elimination"); print(true); } 1.314 + if (PrintIR || PrintIR1 ) { tty->print_cr("IR after null check elimination"); print(false); } 1.315 +#endif 1.316 + } 1.317 +} 1.318 + 1.319 + 1.320 +static int sort_pairs(BlockPair** a, BlockPair** b) { 1.321 + if ((*a)->from() == (*b)->from()) { 1.322 + return (*a)->to()->block_id() - (*b)->to()->block_id(); 1.323 + } else { 1.324 + return (*a)->from()->block_id() - (*b)->from()->block_id(); 1.325 + } 1.326 +} 1.327 + 1.328 + 1.329 +class CriticalEdgeFinder: public BlockClosure { 1.330 + BlockPairList blocks; 1.331 + IR* _ir; 1.332 + 1.333 + public: 1.334 + CriticalEdgeFinder(IR* ir): _ir(ir) {} 1.335 + void block_do(BlockBegin* bb) { 1.336 + BlockEnd* be = bb->end(); 1.337 + int nos = be->number_of_sux(); 1.338 + if (nos >= 2) { 1.339 + for (int i = 0; i < nos; i++) { 1.340 + BlockBegin* sux = be->sux_at(i); 1.341 + if (sux->number_of_preds() >= 2) { 1.342 + blocks.append(new BlockPair(bb, sux)); 1.343 + } 1.344 + } 1.345 + } 1.346 + } 1.347 + 1.348 + void split_edges() { 1.349 + BlockPair* last_pair = NULL; 1.350 + blocks.sort(sort_pairs); 1.351 + for (int i = 0; i < blocks.length(); i++) { 1.352 + BlockPair* pair = blocks.at(i); 1.353 + if (last_pair != NULL && pair->is_same(last_pair)) continue; 1.354 + BlockBegin* from = pair->from(); 1.355 + BlockBegin* to = pair->to(); 1.356 + BlockBegin* split = from->insert_block_between(to); 1.357 +#ifndef PRODUCT 1.358 + if ((PrintIR || PrintIR1) && Verbose) { 1.359 + tty->print_cr("Split critical edge B%d -> B%d (new block B%d)", 1.360 + from->block_id(), to->block_id(), split->block_id()); 1.361 + } 1.362 +#endif 1.363 + last_pair = pair; 1.364 + } 1.365 + } 1.366 +}; 1.367 + 1.368 +void IR::split_critical_edges() { 1.369 + CriticalEdgeFinder cef(this); 1.370 + 1.371 + iterate_preorder(&cef); 1.372 + cef.split_edges(); 1.373 +} 1.374 + 1.375 + 1.376 +class UseCountComputer: public AllStatic { 1.377 + private: 1.378 + static void update_use_count(Value* n) { 1.379 + // Local instructions and Phis for expression stack values at the 1.380 + // start of basic blocks are not added to the instruction list 1.381 + if ((*n)->bci() == -99 && (*n)->as_Local() == NULL && 1.382 + (*n)->as_Phi() == NULL) { 1.383 + assert(false, "a node was not appended to the graph"); 1.384 + Compilation::current_compilation()->bailout("a node was not appended to the graph"); 1.385 + } 1.386 + // use n's input if not visited before 1.387 + if (!(*n)->is_pinned() && !(*n)->has_uses()) { 1.388 + // note: a) if the instruction is pinned, it will be handled by compute_use_count 1.389 + // b) if the instruction has uses, it was touched before 1.390 + // => in both cases we don't need to update n's values 1.391 + uses_do(n); 1.392 + } 1.393 + // use n 1.394 + (*n)->_use_count++; 1.395 + } 1.396 + 1.397 + static Values* worklist; 1.398 + static int depth; 1.399 + enum { 1.400 + max_recurse_depth = 20 1.401 + }; 1.402 + 1.403 + static void uses_do(Value* n) { 1.404 + depth++; 1.405 + if (depth > max_recurse_depth) { 1.406 + // don't allow the traversal to recurse too deeply 1.407 + worklist->push(*n); 1.408 + } else { 1.409 + (*n)->input_values_do(update_use_count); 1.410 + // special handling for some instructions 1.411 + if ((*n)->as_BlockEnd() != NULL) { 1.412 + // note on BlockEnd: 1.413 + // must 'use' the stack only if the method doesn't 1.414 + // terminate, however, in those cases stack is empty 1.415 + (*n)->state_values_do(update_use_count); 1.416 + } 1.417 + } 1.418 + depth--; 1.419 + } 1.420 + 1.421 + static void basic_compute_use_count(BlockBegin* b) { 1.422 + depth = 0; 1.423 + // process all pinned nodes as the roots of expression trees 1.424 + for (Instruction* n = b; n != NULL; n = n->next()) { 1.425 + if (n->is_pinned()) uses_do(&n); 1.426 + } 1.427 + assert(depth == 0, "should have counted back down"); 1.428 + 1.429 + // now process any unpinned nodes which recursed too deeply 1.430 + while (worklist->length() > 0) { 1.431 + Value t = worklist->pop(); 1.432 + if (!t->is_pinned()) { 1.433 + // compute the use count 1.434 + uses_do(&t); 1.435 + 1.436 + // pin the instruction so that LIRGenerator doesn't recurse 1.437 + // too deeply during it's evaluation. 1.438 + t->pin(); 1.439 + } 1.440 + } 1.441 + assert(depth == 0, "should have counted back down"); 1.442 + } 1.443 + 1.444 + public: 1.445 + static void compute(BlockList* blocks) { 1.446 + worklist = new Values(); 1.447 + blocks->blocks_do(basic_compute_use_count); 1.448 + worklist = NULL; 1.449 + } 1.450 +}; 1.451 + 1.452 + 1.453 +Values* UseCountComputer::worklist = NULL; 1.454 +int UseCountComputer::depth = 0; 1.455 + 1.456 +// helper macro for short definition of trace-output inside code 1.457 +#ifndef PRODUCT 1.458 + #define TRACE_LINEAR_SCAN(level, code) \ 1.459 + if (TraceLinearScanLevel >= level) { \ 1.460 + code; \ 1.461 + } 1.462 +#else 1.463 + #define TRACE_LINEAR_SCAN(level, code) 1.464 +#endif 1.465 + 1.466 +class ComputeLinearScanOrder : public StackObj { 1.467 + private: 1.468 + int _max_block_id; // the highest block_id of a block 1.469 + int _num_blocks; // total number of blocks (smaller than _max_block_id) 1.470 + int _num_loops; // total number of loops 1.471 + bool _iterative_dominators;// method requires iterative computation of dominatiors 1.472 + 1.473 + BlockList* _linear_scan_order; // the resulting list of blocks in correct order 1.474 + 1.475 + BitMap _visited_blocks; // used for recursive processing of blocks 1.476 + BitMap _active_blocks; // used for recursive processing of blocks 1.477 + BitMap _dominator_blocks; // temproary BitMap used for computation of dominator 1.478 + intArray _forward_branches; // number of incoming forward branches for each block 1.479 + BlockList _loop_end_blocks; // list of all loop end blocks collected during count_edges 1.480 + BitMap2D _loop_map; // two-dimensional bit set: a bit is set if a block is contained in a loop 1.481 + BlockList _work_list; // temporary list (used in mark_loops and compute_order) 1.482 + 1.483 + // accessors for _visited_blocks and _active_blocks 1.484 + void init_visited() { _active_blocks.clear(); _visited_blocks.clear(); } 1.485 + bool is_visited(BlockBegin* b) const { return _visited_blocks.at(b->block_id()); } 1.486 + bool is_active(BlockBegin* b) const { return _active_blocks.at(b->block_id()); } 1.487 + void set_visited(BlockBegin* b) { assert(!is_visited(b), "already set"); _visited_blocks.set_bit(b->block_id()); } 1.488 + void set_active(BlockBegin* b) { assert(!is_active(b), "already set"); _active_blocks.set_bit(b->block_id()); } 1.489 + void clear_active(BlockBegin* b) { assert(is_active(b), "not already"); _active_blocks.clear_bit(b->block_id()); } 1.490 + 1.491 + // accessors for _forward_branches 1.492 + void inc_forward_branches(BlockBegin* b) { _forward_branches.at_put(b->block_id(), _forward_branches.at(b->block_id()) + 1); } 1.493 + int dec_forward_branches(BlockBegin* b) { _forward_branches.at_put(b->block_id(), _forward_branches.at(b->block_id()) - 1); return _forward_branches.at(b->block_id()); } 1.494 + 1.495 + // accessors for _loop_map 1.496 + bool is_block_in_loop (int loop_idx, BlockBegin* b) const { return _loop_map.at(loop_idx, b->block_id()); } 1.497 + void set_block_in_loop (int loop_idx, BlockBegin* b) { _loop_map.set_bit(loop_idx, b->block_id()); } 1.498 + void clear_block_in_loop(int loop_idx, int block_id) { _loop_map.clear_bit(loop_idx, block_id); } 1.499 + 1.500 + // count edges between blocks 1.501 + void count_edges(BlockBegin* cur, BlockBegin* parent); 1.502 + 1.503 + // loop detection 1.504 + void mark_loops(); 1.505 + void clear_non_natural_loops(BlockBegin* start_block); 1.506 + void assign_loop_depth(BlockBegin* start_block); 1.507 + 1.508 + // computation of final block order 1.509 + BlockBegin* common_dominator(BlockBegin* a, BlockBegin* b); 1.510 + void compute_dominator(BlockBegin* cur, BlockBegin* parent); 1.511 + int compute_weight(BlockBegin* cur); 1.512 + bool ready_for_processing(BlockBegin* cur); 1.513 + void sort_into_work_list(BlockBegin* b); 1.514 + void append_block(BlockBegin* cur); 1.515 + void compute_order(BlockBegin* start_block); 1.516 + 1.517 + // fixup of dominators for non-natural loops 1.518 + bool compute_dominators_iter(); 1.519 + void compute_dominators(); 1.520 + 1.521 + // debug functions 1.522 + NOT_PRODUCT(void print_blocks();) 1.523 + DEBUG_ONLY(void verify();) 1.524 + 1.525 + public: 1.526 + ComputeLinearScanOrder(BlockBegin* start_block); 1.527 + 1.528 + // accessors for final result 1.529 + BlockList* linear_scan_order() const { return _linear_scan_order; } 1.530 + int num_loops() const { return _num_loops; } 1.531 +}; 1.532 + 1.533 + 1.534 +ComputeLinearScanOrder::ComputeLinearScanOrder(BlockBegin* start_block) : 1.535 + _max_block_id(BlockBegin::number_of_blocks()), 1.536 + _num_blocks(0), 1.537 + _num_loops(0), 1.538 + _iterative_dominators(false), 1.539 + _visited_blocks(_max_block_id), 1.540 + _active_blocks(_max_block_id), 1.541 + _dominator_blocks(_max_block_id), 1.542 + _forward_branches(_max_block_id, 0), 1.543 + _loop_end_blocks(8), 1.544 + _work_list(8), 1.545 + _linear_scan_order(NULL), // initialized later with correct size 1.546 + _loop_map(0, 0) // initialized later with correct size 1.547 +{ 1.548 + TRACE_LINEAR_SCAN(2, "***** computing linear-scan block order"); 1.549 + 1.550 + init_visited(); 1.551 + count_edges(start_block, NULL); 1.552 + 1.553 + if (_num_loops > 0) { 1.554 + mark_loops(); 1.555 + clear_non_natural_loops(start_block); 1.556 + assign_loop_depth(start_block); 1.557 + } 1.558 + 1.559 + compute_order(start_block); 1.560 + compute_dominators(); 1.561 + 1.562 + NOT_PRODUCT(print_blocks()); 1.563 + DEBUG_ONLY(verify()); 1.564 +} 1.565 + 1.566 + 1.567 +// Traverse the CFG: 1.568 +// * count total number of blocks 1.569 +// * count all incoming edges and backward incoming edges 1.570 +// * number loop header blocks 1.571 +// * create a list with all loop end blocks 1.572 +void ComputeLinearScanOrder::count_edges(BlockBegin* cur, BlockBegin* parent) { 1.573 + TRACE_LINEAR_SCAN(3, tty->print_cr("Enter count_edges for block B%d coming from B%d", cur->block_id(), parent != NULL ? parent->block_id() : -1)); 1.574 + assert(cur->dominator() == NULL, "dominator already initialized"); 1.575 + 1.576 + if (is_active(cur)) { 1.577 + TRACE_LINEAR_SCAN(3, tty->print_cr("backward branch")); 1.578 + assert(is_visited(cur), "block must be visisted when block is active"); 1.579 + assert(parent != NULL, "must have parent"); 1.580 + assert(parent->number_of_sux() == 1, "loop end blocks must have one successor (critical edges are split)"); 1.581 + 1.582 + cur->set(BlockBegin::linear_scan_loop_header_flag); 1.583 + cur->set(BlockBegin::backward_branch_target_flag); 1.584 + 1.585 + parent->set(BlockBegin::linear_scan_loop_end_flag); 1.586 + _loop_end_blocks.append(parent); 1.587 + return; 1.588 + } 1.589 + 1.590 + // increment number of incoming forward branches 1.591 + inc_forward_branches(cur); 1.592 + 1.593 + if (is_visited(cur)) { 1.594 + TRACE_LINEAR_SCAN(3, tty->print_cr("block already visited")); 1.595 + return; 1.596 + } 1.597 + 1.598 + _num_blocks++; 1.599 + set_visited(cur); 1.600 + set_active(cur); 1.601 + 1.602 + // recursive call for all successors 1.603 + int i; 1.604 + for (i = cur->number_of_sux() - 1; i >= 0; i--) { 1.605 + count_edges(cur->sux_at(i), cur); 1.606 + } 1.607 + for (i = cur->number_of_exception_handlers() - 1; i >= 0; i--) { 1.608 + count_edges(cur->exception_handler_at(i), cur); 1.609 + } 1.610 + 1.611 + clear_active(cur); 1.612 + 1.613 + // Each loop has a unique number. 1.614 + // When multiple loops are nested, assign_loop_depth assumes that the 1.615 + // innermost loop has the lowest number. This is guaranteed by setting 1.616 + // the loop number after the recursive calls for the successors above 1.617 + // have returned. 1.618 + if (cur->is_set(BlockBegin::linear_scan_loop_header_flag)) { 1.619 + assert(cur->loop_index() == -1, "cannot set loop-index twice"); 1.620 + TRACE_LINEAR_SCAN(3, tty->print_cr("Block B%d is loop header of loop %d", cur->block_id(), _num_loops)); 1.621 + 1.622 + cur->set_loop_index(_num_loops); 1.623 + _num_loops++; 1.624 + } 1.625 + 1.626 + TRACE_LINEAR_SCAN(3, tty->print_cr("Finished count_edges for block B%d", cur->block_id())); 1.627 +} 1.628 + 1.629 + 1.630 +void ComputeLinearScanOrder::mark_loops() { 1.631 + TRACE_LINEAR_SCAN(3, tty->print_cr("----- marking loops")); 1.632 + 1.633 + _loop_map = BitMap2D(_num_loops, _max_block_id); 1.634 + _loop_map.clear(); 1.635 + 1.636 + for (int i = _loop_end_blocks.length() - 1; i >= 0; i--) { 1.637 + BlockBegin* loop_end = _loop_end_blocks.at(i); 1.638 + BlockBegin* loop_start = loop_end->sux_at(0); 1.639 + int loop_idx = loop_start->loop_index(); 1.640 + 1.641 + TRACE_LINEAR_SCAN(3, tty->print_cr("Processing loop from B%d to B%d (loop %d):", loop_start->block_id(), loop_end->block_id(), loop_idx)); 1.642 + assert(loop_end->is_set(BlockBegin::linear_scan_loop_end_flag), "loop end flag must be set"); 1.643 + assert(loop_end->number_of_sux() == 1, "incorrect number of successors"); 1.644 + assert(loop_start->is_set(BlockBegin::linear_scan_loop_header_flag), "loop header flag must be set"); 1.645 + assert(loop_idx >= 0 && loop_idx < _num_loops, "loop index not set"); 1.646 + assert(_work_list.is_empty(), "work list must be empty before processing"); 1.647 + 1.648 + // add the end-block of the loop to the working list 1.649 + _work_list.push(loop_end); 1.650 + set_block_in_loop(loop_idx, loop_end); 1.651 + do { 1.652 + BlockBegin* cur = _work_list.pop(); 1.653 + 1.654 + TRACE_LINEAR_SCAN(3, tty->print_cr(" processing B%d", cur->block_id())); 1.655 + assert(is_block_in_loop(loop_idx, cur), "bit in loop map must be set when block is in work list"); 1.656 + 1.657 + // recursive processing of all predecessors ends when start block of loop is reached 1.658 + if (cur != loop_start && !cur->is_set(BlockBegin::osr_entry_flag)) { 1.659 + for (int j = cur->number_of_preds() - 1; j >= 0; j--) { 1.660 + BlockBegin* pred = cur->pred_at(j); 1.661 + 1.662 + if (!is_block_in_loop(loop_idx, pred) /*&& !pred->is_set(BlockBeginosr_entry_flag)*/) { 1.663 + // this predecessor has not been processed yet, so add it to work list 1.664 + TRACE_LINEAR_SCAN(3, tty->print_cr(" pushing B%d", pred->block_id())); 1.665 + _work_list.push(pred); 1.666 + set_block_in_loop(loop_idx, pred); 1.667 + } 1.668 + } 1.669 + } 1.670 + } while (!_work_list.is_empty()); 1.671 + } 1.672 +} 1.673 + 1.674 + 1.675 +// check for non-natural loops (loops where the loop header does not dominate 1.676 +// all other loop blocks = loops with mulitple entries). 1.677 +// such loops are ignored 1.678 +void ComputeLinearScanOrder::clear_non_natural_loops(BlockBegin* start_block) { 1.679 + for (int i = _num_loops - 1; i >= 0; i--) { 1.680 + if (is_block_in_loop(i, start_block)) { 1.681 + // loop i contains the entry block of the method 1.682 + // -> this is not a natural loop, so ignore it 1.683 + TRACE_LINEAR_SCAN(2, tty->print_cr("Loop %d is non-natural, so it is ignored", i)); 1.684 + 1.685 + for (int block_id = _max_block_id - 1; block_id >= 0; block_id--) { 1.686 + clear_block_in_loop(i, block_id); 1.687 + } 1.688 + _iterative_dominators = true; 1.689 + } 1.690 + } 1.691 +} 1.692 + 1.693 +void ComputeLinearScanOrder::assign_loop_depth(BlockBegin* start_block) { 1.694 + TRACE_LINEAR_SCAN(3, "----- computing loop-depth and weight"); 1.695 + init_visited(); 1.696 + 1.697 + assert(_work_list.is_empty(), "work list must be empty before processing"); 1.698 + _work_list.append(start_block); 1.699 + 1.700 + do { 1.701 + BlockBegin* cur = _work_list.pop(); 1.702 + 1.703 + if (!is_visited(cur)) { 1.704 + set_visited(cur); 1.705 + TRACE_LINEAR_SCAN(4, tty->print_cr("Computing loop depth for block B%d", cur->block_id())); 1.706 + 1.707 + // compute loop-depth and loop-index for the block 1.708 + assert(cur->loop_depth() == 0, "cannot set loop-depth twice"); 1.709 + int i; 1.710 + int loop_depth = 0; 1.711 + int min_loop_idx = -1; 1.712 + for (i = _num_loops - 1; i >= 0; i--) { 1.713 + if (is_block_in_loop(i, cur)) { 1.714 + loop_depth++; 1.715 + min_loop_idx = i; 1.716 + } 1.717 + } 1.718 + cur->set_loop_depth(loop_depth); 1.719 + cur->set_loop_index(min_loop_idx); 1.720 + 1.721 + // append all unvisited successors to work list 1.722 + for (i = cur->number_of_sux() - 1; i >= 0; i--) { 1.723 + _work_list.append(cur->sux_at(i)); 1.724 + } 1.725 + for (i = cur->number_of_exception_handlers() - 1; i >= 0; i--) { 1.726 + _work_list.append(cur->exception_handler_at(i)); 1.727 + } 1.728 + } 1.729 + } while (!_work_list.is_empty()); 1.730 +} 1.731 + 1.732 + 1.733 +BlockBegin* ComputeLinearScanOrder::common_dominator(BlockBegin* a, BlockBegin* b) { 1.734 + assert(a != NULL && b != NULL, "must have input blocks"); 1.735 + 1.736 + _dominator_blocks.clear(); 1.737 + while (a != NULL) { 1.738 + _dominator_blocks.set_bit(a->block_id()); 1.739 + assert(a->dominator() != NULL || a == _linear_scan_order->at(0), "dominator must be initialized"); 1.740 + a = a->dominator(); 1.741 + } 1.742 + while (b != NULL && !_dominator_blocks.at(b->block_id())) { 1.743 + assert(b->dominator() != NULL || b == _linear_scan_order->at(0), "dominator must be initialized"); 1.744 + b = b->dominator(); 1.745 + } 1.746 + 1.747 + assert(b != NULL, "could not find dominator"); 1.748 + return b; 1.749 +} 1.750 + 1.751 +void ComputeLinearScanOrder::compute_dominator(BlockBegin* cur, BlockBegin* parent) { 1.752 + if (cur->dominator() == NULL) { 1.753 + TRACE_LINEAR_SCAN(4, tty->print_cr("DOM: initializing dominator of B%d to B%d", cur->block_id(), parent->block_id())); 1.754 + cur->set_dominator(parent); 1.755 + 1.756 + } else if (!(cur->is_set(BlockBegin::linear_scan_loop_header_flag) && parent->is_set(BlockBegin::linear_scan_loop_end_flag))) { 1.757 + TRACE_LINEAR_SCAN(4, tty->print_cr("DOM: computing dominator of B%d: common dominator of B%d and B%d is B%d", cur->block_id(), parent->block_id(), cur->dominator()->block_id(), common_dominator(cur->dominator(), parent)->block_id())); 1.758 + assert(cur->number_of_preds() > 1, ""); 1.759 + cur->set_dominator(common_dominator(cur->dominator(), parent)); 1.760 + } 1.761 +} 1.762 + 1.763 + 1.764 +int ComputeLinearScanOrder::compute_weight(BlockBegin* cur) { 1.765 + BlockBegin* single_sux = NULL; 1.766 + if (cur->number_of_sux() == 1) { 1.767 + single_sux = cur->sux_at(0); 1.768 + } 1.769 + 1.770 + // limit loop-depth to 15 bit (only for security reason, it will never be so big) 1.771 + int weight = (cur->loop_depth() & 0x7FFF) << 16; 1.772 + 1.773 + // general macro for short definition of weight flags 1.774 + // the first instance of INC_WEIGHT_IF has the highest priority 1.775 + int cur_bit = 15; 1.776 + #define INC_WEIGHT_IF(condition) if ((condition)) { weight |= (1 << cur_bit); } cur_bit--; 1.777 + 1.778 + // this is necessery for the (very rare) case that two successing blocks have 1.779 + // the same loop depth, but a different loop index (can happen for endless loops 1.780 + // with exception handlers) 1.781 + INC_WEIGHT_IF(!cur->is_set(BlockBegin::linear_scan_loop_header_flag)); 1.782 + 1.783 + // loop end blocks (blocks that end with a backward branch) are added 1.784 + // after all other blocks of the loop. 1.785 + INC_WEIGHT_IF(!cur->is_set(BlockBegin::linear_scan_loop_end_flag)); 1.786 + 1.787 + // critical edge split blocks are prefered because than they have a bigger 1.788 + // proability to be completely empty 1.789 + INC_WEIGHT_IF(cur->is_set(BlockBegin::critical_edge_split_flag)); 1.790 + 1.791 + // exceptions should not be thrown in normal control flow, so these blocks 1.792 + // are added as late as possible 1.793 + INC_WEIGHT_IF(cur->end()->as_Throw() == NULL && (single_sux == NULL || single_sux->end()->as_Throw() == NULL)); 1.794 + INC_WEIGHT_IF(cur->end()->as_Return() == NULL && (single_sux == NULL || single_sux->end()->as_Return() == NULL)); 1.795 + 1.796 + // exceptions handlers are added as late as possible 1.797 + INC_WEIGHT_IF(!cur->is_set(BlockBegin::exception_entry_flag)); 1.798 + 1.799 + // guarantee that weight is > 0 1.800 + weight |= 1; 1.801 + 1.802 + #undef INC_WEIGHT_IF 1.803 + assert(cur_bit >= 0, "too many flags"); 1.804 + assert(weight > 0, "weight cannot become negative"); 1.805 + 1.806 + return weight; 1.807 +} 1.808 + 1.809 +bool ComputeLinearScanOrder::ready_for_processing(BlockBegin* cur) { 1.810 + // Discount the edge just traveled. 1.811 + // When the number drops to zero, all forward branches were processed 1.812 + if (dec_forward_branches(cur) != 0) { 1.813 + return false; 1.814 + } 1.815 + 1.816 + assert(_linear_scan_order->index_of(cur) == -1, "block already processed (block can be ready only once)"); 1.817 + assert(_work_list.index_of(cur) == -1, "block already in work-list (block can be ready only once)"); 1.818 + return true; 1.819 +} 1.820 + 1.821 +void ComputeLinearScanOrder::sort_into_work_list(BlockBegin* cur) { 1.822 + assert(_work_list.index_of(cur) == -1, "block already in work list"); 1.823 + 1.824 + int cur_weight = compute_weight(cur); 1.825 + 1.826 + // the linear_scan_number is used to cache the weight of a block 1.827 + cur->set_linear_scan_number(cur_weight); 1.828 + 1.829 +#ifndef PRODUCT 1.830 + if (StressLinearScan) { 1.831 + _work_list.insert_before(0, cur); 1.832 + return; 1.833 + } 1.834 +#endif 1.835 + 1.836 + _work_list.append(NULL); // provide space for new element 1.837 + 1.838 + int insert_idx = _work_list.length() - 1; 1.839 + while (insert_idx > 0 && _work_list.at(insert_idx - 1)->linear_scan_number() > cur_weight) { 1.840 + _work_list.at_put(insert_idx, _work_list.at(insert_idx - 1)); 1.841 + insert_idx--; 1.842 + } 1.843 + _work_list.at_put(insert_idx, cur); 1.844 + 1.845 + TRACE_LINEAR_SCAN(3, tty->print_cr("Sorted B%d into worklist. new worklist:", cur->block_id())); 1.846 + TRACE_LINEAR_SCAN(3, for (int i = 0; i < _work_list.length(); i++) tty->print_cr("%8d B%2d weight:%6x", i, _work_list.at(i)->block_id(), _work_list.at(i)->linear_scan_number())); 1.847 + 1.848 +#ifdef ASSERT 1.849 + for (int i = 0; i < _work_list.length(); i++) { 1.850 + assert(_work_list.at(i)->linear_scan_number() > 0, "weight not set"); 1.851 + assert(i == 0 || _work_list.at(i - 1)->linear_scan_number() <= _work_list.at(i)->linear_scan_number(), "incorrect order in worklist"); 1.852 + } 1.853 +#endif 1.854 +} 1.855 + 1.856 +void ComputeLinearScanOrder::append_block(BlockBegin* cur) { 1.857 + TRACE_LINEAR_SCAN(3, tty->print_cr("appending block B%d (weight 0x%6x) to linear-scan order", cur->block_id(), cur->linear_scan_number())); 1.858 + assert(_linear_scan_order->index_of(cur) == -1, "cannot add the same block twice"); 1.859 + 1.860 + // currently, the linear scan order and code emit order are equal. 1.861 + // therefore the linear_scan_number and the weight of a block must also 1.862 + // be equal. 1.863 + cur->set_linear_scan_number(_linear_scan_order->length()); 1.864 + _linear_scan_order->append(cur); 1.865 +} 1.866 + 1.867 +void ComputeLinearScanOrder::compute_order(BlockBegin* start_block) { 1.868 + TRACE_LINEAR_SCAN(3, "----- computing final block order"); 1.869 + 1.870 + // the start block is always the first block in the linear scan order 1.871 + _linear_scan_order = new BlockList(_num_blocks); 1.872 + append_block(start_block); 1.873 + 1.874 + assert(start_block->end()->as_Base() != NULL, "start block must end with Base-instruction"); 1.875 + BlockBegin* std_entry = ((Base*)start_block->end())->std_entry(); 1.876 + BlockBegin* osr_entry = ((Base*)start_block->end())->osr_entry(); 1.877 + 1.878 + BlockBegin* sux_of_osr_entry = NULL; 1.879 + if (osr_entry != NULL) { 1.880 + // special handling for osr entry: 1.881 + // ignore the edge between the osr entry and its successor for processing 1.882 + // the osr entry block is added manually below 1.883 + assert(osr_entry->number_of_sux() == 1, "osr entry must have exactly one successor"); 1.884 + assert(osr_entry->sux_at(0)->number_of_preds() >= 2, "sucessor of osr entry must have two predecessors (otherwise it is not present in normal control flow"); 1.885 + 1.886 + sux_of_osr_entry = osr_entry->sux_at(0); 1.887 + dec_forward_branches(sux_of_osr_entry); 1.888 + 1.889 + compute_dominator(osr_entry, start_block); 1.890 + _iterative_dominators = true; 1.891 + } 1.892 + compute_dominator(std_entry, start_block); 1.893 + 1.894 + // start processing with standard entry block 1.895 + assert(_work_list.is_empty(), "list must be empty before processing"); 1.896 + 1.897 + if (ready_for_processing(std_entry)) { 1.898 + sort_into_work_list(std_entry); 1.899 + } else { 1.900 + assert(false, "the std_entry must be ready for processing (otherwise, the method has no start block)"); 1.901 + } 1.902 + 1.903 + do { 1.904 + BlockBegin* cur = _work_list.pop(); 1.905 + 1.906 + if (cur == sux_of_osr_entry) { 1.907 + // the osr entry block is ignored in normal processing, it is never added to the 1.908 + // work list. Instead, it is added as late as possible manually here. 1.909 + append_block(osr_entry); 1.910 + compute_dominator(cur, osr_entry); 1.911 + } 1.912 + append_block(cur); 1.913 + 1.914 + int i; 1.915 + int num_sux = cur->number_of_sux(); 1.916 + // changed loop order to get "intuitive" order of if- and else-blocks 1.917 + for (i = 0; i < num_sux; i++) { 1.918 + BlockBegin* sux = cur->sux_at(i); 1.919 + compute_dominator(sux, cur); 1.920 + if (ready_for_processing(sux)) { 1.921 + sort_into_work_list(sux); 1.922 + } 1.923 + } 1.924 + num_sux = cur->number_of_exception_handlers(); 1.925 + for (i = 0; i < num_sux; i++) { 1.926 + BlockBegin* sux = cur->exception_handler_at(i); 1.927 + compute_dominator(sux, cur); 1.928 + if (ready_for_processing(sux)) { 1.929 + sort_into_work_list(sux); 1.930 + } 1.931 + } 1.932 + } while (_work_list.length() > 0); 1.933 +} 1.934 + 1.935 + 1.936 +bool ComputeLinearScanOrder::compute_dominators_iter() { 1.937 + bool changed = false; 1.938 + int num_blocks = _linear_scan_order->length(); 1.939 + 1.940 + assert(_linear_scan_order->at(0)->dominator() == NULL, "must not have dominator"); 1.941 + assert(_linear_scan_order->at(0)->number_of_preds() == 0, "must not have predecessors"); 1.942 + for (int i = 1; i < num_blocks; i++) { 1.943 + BlockBegin* block = _linear_scan_order->at(i); 1.944 + 1.945 + BlockBegin* dominator = block->pred_at(0); 1.946 + int num_preds = block->number_of_preds(); 1.947 + for (int i = 1; i < num_preds; i++) { 1.948 + dominator = common_dominator(dominator, block->pred_at(i)); 1.949 + } 1.950 + 1.951 + if (dominator != block->dominator()) { 1.952 + TRACE_LINEAR_SCAN(4, tty->print_cr("DOM: updating dominator of B%d from B%d to B%d", block->block_id(), block->dominator()->block_id(), dominator->block_id())); 1.953 + 1.954 + block->set_dominator(dominator); 1.955 + changed = true; 1.956 + } 1.957 + } 1.958 + return changed; 1.959 +} 1.960 + 1.961 +void ComputeLinearScanOrder::compute_dominators() { 1.962 + TRACE_LINEAR_SCAN(3, tty->print_cr("----- computing dominators (iterative computation reqired: %d)", _iterative_dominators)); 1.963 + 1.964 + // iterative computation of dominators is only required for methods with non-natural loops 1.965 + // and OSR-methods. For all other methods, the dominators computed when generating the 1.966 + // linear scan block order are correct. 1.967 + if (_iterative_dominators) { 1.968 + do { 1.969 + TRACE_LINEAR_SCAN(1, tty->print_cr("DOM: next iteration of fix-point calculation")); 1.970 + } while (compute_dominators_iter()); 1.971 + } 1.972 + 1.973 + // check that dominators are correct 1.974 + assert(!compute_dominators_iter(), "fix point not reached"); 1.975 +} 1.976 + 1.977 + 1.978 +#ifndef PRODUCT 1.979 +void ComputeLinearScanOrder::print_blocks() { 1.980 + if (TraceLinearScanLevel >= 2) { 1.981 + tty->print_cr("----- loop information:"); 1.982 + for (int block_idx = 0; block_idx < _linear_scan_order->length(); block_idx++) { 1.983 + BlockBegin* cur = _linear_scan_order->at(block_idx); 1.984 + 1.985 + tty->print("%4d: B%2d: ", cur->linear_scan_number(), cur->block_id()); 1.986 + for (int loop_idx = 0; loop_idx < _num_loops; loop_idx++) { 1.987 + tty->print ("%d ", is_block_in_loop(loop_idx, cur)); 1.988 + } 1.989 + tty->print_cr(" -> loop_index: %2d, loop_depth: %2d", cur->loop_index(), cur->loop_depth()); 1.990 + } 1.991 + } 1.992 + 1.993 + if (TraceLinearScanLevel >= 1) { 1.994 + tty->print_cr("----- linear-scan block order:"); 1.995 + for (int block_idx = 0; block_idx < _linear_scan_order->length(); block_idx++) { 1.996 + BlockBegin* cur = _linear_scan_order->at(block_idx); 1.997 + tty->print("%4d: B%2d loop: %2d depth: %2d", cur->linear_scan_number(), cur->block_id(), cur->loop_index(), cur->loop_depth()); 1.998 + 1.999 + tty->print(cur->is_set(BlockBegin::exception_entry_flag) ? " ex" : " "); 1.1000 + tty->print(cur->is_set(BlockBegin::critical_edge_split_flag) ? " ce" : " "); 1.1001 + tty->print(cur->is_set(BlockBegin::linear_scan_loop_header_flag) ? " lh" : " "); 1.1002 + tty->print(cur->is_set(BlockBegin::linear_scan_loop_end_flag) ? " le" : " "); 1.1003 + 1.1004 + if (cur->dominator() != NULL) { 1.1005 + tty->print(" dom: B%d ", cur->dominator()->block_id()); 1.1006 + } else { 1.1007 + tty->print(" dom: NULL "); 1.1008 + } 1.1009 + 1.1010 + if (cur->number_of_preds() > 0) { 1.1011 + tty->print(" preds: "); 1.1012 + for (int j = 0; j < cur->number_of_preds(); j++) { 1.1013 + BlockBegin* pred = cur->pred_at(j); 1.1014 + tty->print("B%d ", pred->block_id()); 1.1015 + } 1.1016 + } 1.1017 + if (cur->number_of_sux() > 0) { 1.1018 + tty->print(" sux: "); 1.1019 + for (int j = 0; j < cur->number_of_sux(); j++) { 1.1020 + BlockBegin* sux = cur->sux_at(j); 1.1021 + tty->print("B%d ", sux->block_id()); 1.1022 + } 1.1023 + } 1.1024 + if (cur->number_of_exception_handlers() > 0) { 1.1025 + tty->print(" ex: "); 1.1026 + for (int j = 0; j < cur->number_of_exception_handlers(); j++) { 1.1027 + BlockBegin* ex = cur->exception_handler_at(j); 1.1028 + tty->print("B%d ", ex->block_id()); 1.1029 + } 1.1030 + } 1.1031 + tty->cr(); 1.1032 + } 1.1033 + } 1.1034 +} 1.1035 +#endif 1.1036 + 1.1037 +#ifdef ASSERT 1.1038 +void ComputeLinearScanOrder::verify() { 1.1039 + assert(_linear_scan_order->length() == _num_blocks, "wrong number of blocks in list"); 1.1040 + 1.1041 + if (StressLinearScan) { 1.1042 + // blocks are scrambled when StressLinearScan is used 1.1043 + return; 1.1044 + } 1.1045 + 1.1046 + // check that all successors of a block have a higher linear-scan-number 1.1047 + // and that all predecessors of a block have a lower linear-scan-number 1.1048 + // (only backward branches of loops are ignored) 1.1049 + int i; 1.1050 + for (i = 0; i < _linear_scan_order->length(); i++) { 1.1051 + BlockBegin* cur = _linear_scan_order->at(i); 1.1052 + 1.1053 + assert(cur->linear_scan_number() == i, "incorrect linear_scan_number"); 1.1054 + assert(cur->linear_scan_number() >= 0 && cur->linear_scan_number() == _linear_scan_order->index_of(cur), "incorrect linear_scan_number"); 1.1055 + 1.1056 + int j; 1.1057 + for (j = cur->number_of_sux() - 1; j >= 0; j--) { 1.1058 + BlockBegin* sux = cur->sux_at(j); 1.1059 + 1.1060 + assert(sux->linear_scan_number() >= 0 && sux->linear_scan_number() == _linear_scan_order->index_of(sux), "incorrect linear_scan_number"); 1.1061 + if (!cur->is_set(BlockBegin::linear_scan_loop_end_flag)) { 1.1062 + assert(cur->linear_scan_number() < sux->linear_scan_number(), "invalid order"); 1.1063 + } 1.1064 + if (cur->loop_depth() == sux->loop_depth()) { 1.1065 + assert(cur->loop_index() == sux->loop_index() || sux->is_set(BlockBegin::linear_scan_loop_header_flag), "successing blocks with same loop depth must have same loop index"); 1.1066 + } 1.1067 + } 1.1068 + 1.1069 + for (j = cur->number_of_preds() - 1; j >= 0; j--) { 1.1070 + BlockBegin* pred = cur->pred_at(j); 1.1071 + 1.1072 + assert(pred->linear_scan_number() >= 0 && pred->linear_scan_number() == _linear_scan_order->index_of(pred), "incorrect linear_scan_number"); 1.1073 + if (!cur->is_set(BlockBegin::linear_scan_loop_header_flag)) { 1.1074 + assert(cur->linear_scan_number() > pred->linear_scan_number(), "invalid order"); 1.1075 + } 1.1076 + if (cur->loop_depth() == pred->loop_depth()) { 1.1077 + assert(cur->loop_index() == pred->loop_index() || cur->is_set(BlockBegin::linear_scan_loop_header_flag), "successing blocks with same loop depth must have same loop index"); 1.1078 + } 1.1079 + 1.1080 + assert(cur->dominator()->linear_scan_number() <= cur->pred_at(j)->linear_scan_number(), "dominator must be before predecessors"); 1.1081 + } 1.1082 + 1.1083 + // check dominator 1.1084 + if (i == 0) { 1.1085 + assert(cur->dominator() == NULL, "first block has no dominator"); 1.1086 + } else { 1.1087 + assert(cur->dominator() != NULL, "all but first block must have dominator"); 1.1088 + } 1.1089 + assert(cur->number_of_preds() != 1 || cur->dominator() == cur->pred_at(0), "Single predecessor must also be dominator"); 1.1090 + } 1.1091 + 1.1092 + // check that all loops are continuous 1.1093 + for (int loop_idx = 0; loop_idx < _num_loops; loop_idx++) { 1.1094 + int block_idx = 0; 1.1095 + assert(!is_block_in_loop(loop_idx, _linear_scan_order->at(block_idx)), "the first block must not be present in any loop"); 1.1096 + 1.1097 + // skip blocks before the loop 1.1098 + while (block_idx < _num_blocks && !is_block_in_loop(loop_idx, _linear_scan_order->at(block_idx))) { 1.1099 + block_idx++; 1.1100 + } 1.1101 + // skip blocks of loop 1.1102 + while (block_idx < _num_blocks && is_block_in_loop(loop_idx, _linear_scan_order->at(block_idx))) { 1.1103 + block_idx++; 1.1104 + } 1.1105 + // after the first non-loop block, there must not be another loop-block 1.1106 + while (block_idx < _num_blocks) { 1.1107 + assert(!is_block_in_loop(loop_idx, _linear_scan_order->at(block_idx)), "loop not continuous in linear-scan order"); 1.1108 + block_idx++; 1.1109 + } 1.1110 + } 1.1111 +} 1.1112 +#endif 1.1113 + 1.1114 + 1.1115 +void IR::compute_code() { 1.1116 + assert(is_valid(), "IR must be valid"); 1.1117 + 1.1118 + ComputeLinearScanOrder compute_order(start()); 1.1119 + _num_loops = compute_order.num_loops(); 1.1120 + _code = compute_order.linear_scan_order(); 1.1121 +} 1.1122 + 1.1123 + 1.1124 +void IR::compute_use_counts() { 1.1125 + // make sure all values coming out of this block get evaluated. 1.1126 + int num_blocks = _code->length(); 1.1127 + for (int i = 0; i < num_blocks; i++) { 1.1128 + _code->at(i)->end()->state()->pin_stack_for_linear_scan(); 1.1129 + } 1.1130 + 1.1131 + // compute use counts 1.1132 + UseCountComputer::compute(_code); 1.1133 +} 1.1134 + 1.1135 + 1.1136 +void IR::iterate_preorder(BlockClosure* closure) { 1.1137 + assert(is_valid(), "IR must be valid"); 1.1138 + start()->iterate_preorder(closure); 1.1139 +} 1.1140 + 1.1141 + 1.1142 +void IR::iterate_postorder(BlockClosure* closure) { 1.1143 + assert(is_valid(), "IR must be valid"); 1.1144 + start()->iterate_postorder(closure); 1.1145 +} 1.1146 + 1.1147 +void IR::iterate_linear_scan_order(BlockClosure* closure) { 1.1148 + linear_scan_order()->iterate_forward(closure); 1.1149 +} 1.1150 + 1.1151 + 1.1152 +#ifndef PRODUCT 1.1153 +class BlockPrinter: public BlockClosure { 1.1154 + private: 1.1155 + InstructionPrinter* _ip; 1.1156 + bool _cfg_only; 1.1157 + bool _live_only; 1.1158 + 1.1159 + public: 1.1160 + BlockPrinter(InstructionPrinter* ip, bool cfg_only, bool live_only = false) { 1.1161 + _ip = ip; 1.1162 + _cfg_only = cfg_only; 1.1163 + _live_only = live_only; 1.1164 + } 1.1165 + 1.1166 + virtual void block_do(BlockBegin* block) { 1.1167 + if (_cfg_only) { 1.1168 + _ip->print_instr(block); tty->cr(); 1.1169 + } else { 1.1170 + block->print_block(*_ip, _live_only); 1.1171 + } 1.1172 + } 1.1173 +}; 1.1174 + 1.1175 + 1.1176 +void IR::print(BlockBegin* start, bool cfg_only, bool live_only) { 1.1177 + ttyLocker ttyl; 1.1178 + InstructionPrinter ip(!cfg_only); 1.1179 + BlockPrinter bp(&ip, cfg_only, live_only); 1.1180 + start->iterate_preorder(&bp); 1.1181 + tty->cr(); 1.1182 +} 1.1183 + 1.1184 +void IR::print(bool cfg_only, bool live_only) { 1.1185 + if (is_valid()) { 1.1186 + print(start(), cfg_only, live_only); 1.1187 + } else { 1.1188 + tty->print_cr("invalid IR"); 1.1189 + } 1.1190 +} 1.1191 + 1.1192 + 1.1193 +define_array(BlockListArray, BlockList*) 1.1194 +define_stack(BlockListList, BlockListArray) 1.1195 + 1.1196 +class PredecessorValidator : public BlockClosure { 1.1197 + private: 1.1198 + BlockListList* _predecessors; 1.1199 + BlockList* _blocks; 1.1200 + 1.1201 + static int cmp(BlockBegin** a, BlockBegin** b) { 1.1202 + return (*a)->block_id() - (*b)->block_id(); 1.1203 + } 1.1204 + 1.1205 + public: 1.1206 + PredecessorValidator(IR* hir) { 1.1207 + ResourceMark rm; 1.1208 + _predecessors = new BlockListList(BlockBegin::number_of_blocks(), NULL); 1.1209 + _blocks = new BlockList(); 1.1210 + 1.1211 + int i; 1.1212 + hir->start()->iterate_preorder(this); 1.1213 + if (hir->code() != NULL) { 1.1214 + assert(hir->code()->length() == _blocks->length(), "must match"); 1.1215 + for (i = 0; i < _blocks->length(); i++) { 1.1216 + assert(hir->code()->contains(_blocks->at(i)), "should be in both lists"); 1.1217 + } 1.1218 + } 1.1219 + 1.1220 + for (i = 0; i < _blocks->length(); i++) { 1.1221 + BlockBegin* block = _blocks->at(i); 1.1222 + BlockList* preds = _predecessors->at(block->block_id()); 1.1223 + if (preds == NULL) { 1.1224 + assert(block->number_of_preds() == 0, "should be the same"); 1.1225 + continue; 1.1226 + } 1.1227 + 1.1228 + // clone the pred list so we can mutate it 1.1229 + BlockList* pred_copy = new BlockList(); 1.1230 + int j; 1.1231 + for (j = 0; j < block->number_of_preds(); j++) { 1.1232 + pred_copy->append(block->pred_at(j)); 1.1233 + } 1.1234 + // sort them in the same order 1.1235 + preds->sort(cmp); 1.1236 + pred_copy->sort(cmp); 1.1237 + int length = MIN2(preds->length(), block->number_of_preds()); 1.1238 + for (j = 0; j < block->number_of_preds(); j++) { 1.1239 + assert(preds->at(j) == pred_copy->at(j), "must match"); 1.1240 + } 1.1241 + 1.1242 + assert(preds->length() == block->number_of_preds(), "should be the same"); 1.1243 + } 1.1244 + } 1.1245 + 1.1246 + virtual void block_do(BlockBegin* block) { 1.1247 + _blocks->append(block); 1.1248 + BlockEnd* be = block->end(); 1.1249 + int n = be->number_of_sux(); 1.1250 + int i; 1.1251 + for (i = 0; i < n; i++) { 1.1252 + BlockBegin* sux = be->sux_at(i); 1.1253 + assert(!sux->is_set(BlockBegin::exception_entry_flag), "must not be xhandler"); 1.1254 + 1.1255 + BlockList* preds = _predecessors->at_grow(sux->block_id(), NULL); 1.1256 + if (preds == NULL) { 1.1257 + preds = new BlockList(); 1.1258 + _predecessors->at_put(sux->block_id(), preds); 1.1259 + } 1.1260 + preds->append(block); 1.1261 + } 1.1262 + 1.1263 + n = block->number_of_exception_handlers(); 1.1264 + for (i = 0; i < n; i++) { 1.1265 + BlockBegin* sux = block->exception_handler_at(i); 1.1266 + assert(sux->is_set(BlockBegin::exception_entry_flag), "must be xhandler"); 1.1267 + 1.1268 + BlockList* preds = _predecessors->at_grow(sux->block_id(), NULL); 1.1269 + if (preds == NULL) { 1.1270 + preds = new BlockList(); 1.1271 + _predecessors->at_put(sux->block_id(), preds); 1.1272 + } 1.1273 + preds->append(block); 1.1274 + } 1.1275 + } 1.1276 +}; 1.1277 + 1.1278 +void IR::verify() { 1.1279 +#ifdef ASSERT 1.1280 + PredecessorValidator pv(this); 1.1281 +#endif 1.1282 +} 1.1283 + 1.1284 +#endif // PRODUCT 1.1285 + 1.1286 +void SubstitutionResolver::substitute(Value* v) { 1.1287 + Value v0 = *v; 1.1288 + if (v0) { 1.1289 + Value vs = v0->subst(); 1.1290 + if (vs != v0) { 1.1291 + *v = v0->subst(); 1.1292 + } 1.1293 + } 1.1294 +} 1.1295 + 1.1296 +#ifdef ASSERT 1.1297 +void check_substitute(Value* v) { 1.1298 + Value v0 = *v; 1.1299 + if (v0) { 1.1300 + Value vs = v0->subst(); 1.1301 + assert(vs == v0, "missed substitution"); 1.1302 + } 1.1303 +} 1.1304 +#endif 1.1305 + 1.1306 + 1.1307 +void SubstitutionResolver::block_do(BlockBegin* block) { 1.1308 + Instruction* last = NULL; 1.1309 + for (Instruction* n = block; n != NULL;) { 1.1310 + n->values_do(substitute); 1.1311 + // need to remove this instruction from the instruction stream 1.1312 + if (n->subst() != n) { 1.1313 + assert(last != NULL, "must have last"); 1.1314 + last->set_next(n->next(), n->next()->bci()); 1.1315 + } else { 1.1316 + last = n; 1.1317 + } 1.1318 + n = last->next(); 1.1319 + } 1.1320 + 1.1321 +#ifdef ASSERT 1.1322 + if (block->state()) block->state()->values_do(check_substitute); 1.1323 + block->block_values_do(check_substitute); 1.1324 + if (block->end() && block->end()->state()) block->end()->state()->values_do(check_substitute); 1.1325 +#endif 1.1326 +}