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