src/share/vm/c1/c1_IR.cpp

Thu, 02 Dec 2010 17:21:12 -0800

author
iveresov
date
Thu, 02 Dec 2010 17:21:12 -0800
changeset 2349
5ddfcf4b079e
parent 2314
f95d63e2154a
child 3592
701a83c86f28
permissions
-rw-r--r--

7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation.
Reviewed-by: kvn, never

duke@435 1 /*
trims@1907 2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #include "precompiled.hpp"
stefank@2314 26 #include "c1/c1_Compilation.hpp"
stefank@2314 27 #include "c1/c1_FrameMap.hpp"
stefank@2314 28 #include "c1/c1_GraphBuilder.hpp"
stefank@2314 29 #include "c1/c1_IR.hpp"
stefank@2314 30 #include "c1/c1_InstructionPrinter.hpp"
stefank@2314 31 #include "c1/c1_Optimizer.hpp"
stefank@2314 32 #include "utilities/bitMap.inline.hpp"
duke@435 33
duke@435 34
duke@435 35 // Implementation of XHandlers
duke@435 36 //
duke@435 37 // Note: This code could eventually go away if we are
duke@435 38 // just using the ciExceptionHandlerStream.
duke@435 39
duke@435 40 XHandlers::XHandlers(ciMethod* method) : _list(method->exception_table_length()) {
duke@435 41 ciExceptionHandlerStream s(method);
duke@435 42 while (!s.is_done()) {
duke@435 43 _list.append(new XHandler(s.handler()));
duke@435 44 s.next();
duke@435 45 }
duke@435 46 assert(s.count() == method->exception_table_length(), "exception table lengths inconsistent");
duke@435 47 }
duke@435 48
duke@435 49 // deep copy of all XHandler contained in list
duke@435 50 XHandlers::XHandlers(XHandlers* other) :
duke@435 51 _list(other->length())
duke@435 52 {
duke@435 53 for (int i = 0; i < other->length(); i++) {
duke@435 54 _list.append(new XHandler(other->handler_at(i)));
duke@435 55 }
duke@435 56 }
duke@435 57
duke@435 58 // Returns whether a particular exception type can be caught. Also
duke@435 59 // returns true if klass is unloaded or any exception handler
duke@435 60 // classes are unloaded. type_is_exact indicates whether the throw
duke@435 61 // is known to be exactly that class or it might throw a subtype.
duke@435 62 bool XHandlers::could_catch(ciInstanceKlass* klass, bool type_is_exact) const {
duke@435 63 // the type is unknown so be conservative
duke@435 64 if (!klass->is_loaded()) {
duke@435 65 return true;
duke@435 66 }
duke@435 67
duke@435 68 for (int i = 0; i < length(); i++) {
duke@435 69 XHandler* handler = handler_at(i);
duke@435 70 if (handler->is_catch_all()) {
duke@435 71 // catch of ANY
duke@435 72 return true;
duke@435 73 }
duke@435 74 ciInstanceKlass* handler_klass = handler->catch_klass();
duke@435 75 // if it's unknown it might be catchable
duke@435 76 if (!handler_klass->is_loaded()) {
duke@435 77 return true;
duke@435 78 }
duke@435 79 // if the throw type is definitely a subtype of the catch type
duke@435 80 // then it can be caught.
duke@435 81 if (klass->is_subtype_of(handler_klass)) {
duke@435 82 return true;
duke@435 83 }
duke@435 84 if (!type_is_exact) {
duke@435 85 // If the type isn't exactly known then it can also be caught by
duke@435 86 // catch statements where the inexact type is a subtype of the
duke@435 87 // catch type.
duke@435 88 // given: foo extends bar extends Exception
duke@435 89 // throw bar can be caught by catch foo, catch bar, and catch
duke@435 90 // Exception, however it can't be caught by any handlers without
duke@435 91 // bar in its type hierarchy.
duke@435 92 if (handler_klass->is_subtype_of(klass)) {
duke@435 93 return true;
duke@435 94 }
duke@435 95 }
duke@435 96 }
duke@435 97
duke@435 98 return false;
duke@435 99 }
duke@435 100
duke@435 101
duke@435 102 bool XHandlers::equals(XHandlers* others) const {
duke@435 103 if (others == NULL) return false;
duke@435 104 if (length() != others->length()) return false;
duke@435 105
duke@435 106 for (int i = 0; i < length(); i++) {
duke@435 107 if (!handler_at(i)->equals(others->handler_at(i))) return false;
duke@435 108 }
duke@435 109 return true;
duke@435 110 }
duke@435 111
duke@435 112 bool XHandler::equals(XHandler* other) const {
duke@435 113 assert(entry_pco() != -1 && other->entry_pco() != -1, "must have entry_pco");
duke@435 114
duke@435 115 if (entry_pco() != other->entry_pco()) return false;
duke@435 116 if (scope_count() != other->scope_count()) return false;
duke@435 117 if (_desc != other->_desc) return false;
duke@435 118
duke@435 119 assert(entry_block() == other->entry_block(), "entry_block must be equal when entry_pco is equal");
duke@435 120 return true;
duke@435 121 }
duke@435 122
duke@435 123
duke@435 124 // Implementation of IRScope
duke@435 125 BlockBegin* IRScope::build_graph(Compilation* compilation, int osr_bci) {
duke@435 126 GraphBuilder gm(compilation, this);
duke@435 127 NOT_PRODUCT(if (PrintValueNumbering && Verbose) gm.print_stats());
duke@435 128 if (compilation->bailed_out()) return NULL;
duke@435 129 return gm.start();
duke@435 130 }
duke@435 131
duke@435 132
duke@435 133 IRScope::IRScope(Compilation* compilation, IRScope* caller, int caller_bci, ciMethod* method, int osr_bci, bool create_graph)
duke@435 134 : _callees(2)
duke@435 135 , _compilation(compilation)
duke@435 136 , _requires_phi_function(method->max_locals())
duke@435 137 {
duke@435 138 _caller = caller;
duke@435 139 _level = caller == NULL ? 0 : caller->level() + 1;
duke@435 140 _method = method;
duke@435 141 _xhandlers = new XHandlers(method);
duke@435 142 _number_of_locks = 0;
duke@435 143 _monitor_pairing_ok = method->has_balanced_monitors();
duke@435 144 _start = NULL;
duke@435 145
duke@435 146 if (osr_bci == -1) {
duke@435 147 _requires_phi_function.clear();
duke@435 148 } else {
duke@435 149 // selective creation of phi functions is not possibel in osr-methods
duke@435 150 _requires_phi_function.set_range(0, method->max_locals());
duke@435 151 }
duke@435 152
duke@435 153 assert(method->holder()->is_loaded() , "method holder must be loaded");
duke@435 154
duke@435 155 // build graph if monitor pairing is ok
duke@435 156 if (create_graph && monitor_pairing_ok()) _start = build_graph(compilation, osr_bci);
duke@435 157 }
duke@435 158
duke@435 159
duke@435 160 int IRScope::max_stack() const {
duke@435 161 int my_max = method()->max_stack();
duke@435 162 int callee_max = 0;
duke@435 163 for (int i = 0; i < number_of_callees(); i++) {
duke@435 164 callee_max = MAX2(callee_max, callee_no(i)->max_stack());
duke@435 165 }
duke@435 166 return my_max + callee_max;
duke@435 167 }
duke@435 168
duke@435 169
cfang@1335 170 bool IRScopeDebugInfo::should_reexecute() {
cfang@1335 171 ciMethod* cur_method = scope()->method();
cfang@1335 172 int cur_bci = bci();
cfang@1335 173 if (cur_method != NULL && cur_bci != SynchronizationEntryBCI) {
cfang@1335 174 Bytecodes::Code code = cur_method->java_code_at_bci(cur_bci);
cfang@1335 175 return Interpreter::bytecode_should_reexecute(code);
cfang@1335 176 } else
cfang@1335 177 return false;
cfang@1335 178 }
duke@435 179
duke@435 180
duke@435 181 // Implementation of CodeEmitInfo
duke@435 182
duke@435 183 // Stack must be NON-null
roland@2174 184 CodeEmitInfo::CodeEmitInfo(ValueStack* stack, XHandlers* exception_handlers)
duke@435 185 : _scope(stack->scope())
duke@435 186 , _scope_debug_info(NULL)
duke@435 187 , _oop_map(NULL)
duke@435 188 , _stack(stack)
duke@435 189 , _exception_handlers(exception_handlers)
twisti@1919 190 , _is_method_handle_invoke(false) {
duke@435 191 assert(_stack != NULL, "must be non null");
duke@435 192 }
duke@435 193
duke@435 194
roland@2174 195 CodeEmitInfo::CodeEmitInfo(CodeEmitInfo* info, ValueStack* stack)
duke@435 196 : _scope(info->_scope)
duke@435 197 , _exception_handlers(NULL)
duke@435 198 , _scope_debug_info(NULL)
twisti@1919 199 , _oop_map(NULL)
roland@2174 200 , _stack(stack == NULL ? info->_stack : stack)
twisti@1919 201 , _is_method_handle_invoke(info->_is_method_handle_invoke) {
duke@435 202
duke@435 203 // deep copy of exception handlers
duke@435 204 if (info->_exception_handlers != NULL) {
duke@435 205 _exception_handlers = new XHandlers(info->_exception_handlers);
duke@435 206 }
duke@435 207 }
duke@435 208
duke@435 209
twisti@1919 210 void CodeEmitInfo::record_debug_info(DebugInformationRecorder* recorder, int pc_offset) {
duke@435 211 // record the safepoint before recording the debug info for enclosing scopes
duke@435 212 recorder->add_safepoint(pc_offset, _oop_map->deep_copy());
twisti@1919 213 _scope_debug_info->record_debug_info(recorder, pc_offset, true/*topmost*/, _is_method_handle_invoke);
duke@435 214 recorder->end_safepoint(pc_offset);
duke@435 215 }
duke@435 216
duke@435 217
duke@435 218 void CodeEmitInfo::add_register_oop(LIR_Opr opr) {
duke@435 219 assert(_oop_map != NULL, "oop map must already exist");
duke@435 220 assert(opr->is_single_cpu(), "should not call otherwise");
duke@435 221
duke@435 222 VMReg name = frame_map()->regname(opr);
duke@435 223 _oop_map->set_oop(name);
duke@435 224 }
duke@435 225
duke@435 226
duke@435 227
duke@435 228
duke@435 229 // Implementation of IR
duke@435 230
duke@435 231 IR::IR(Compilation* compilation, ciMethod* method, int osr_bci) :
duke@435 232 _locals_size(in_WordSize(-1))
duke@435 233 , _num_loops(0) {
duke@435 234 // setup IR fields
duke@435 235 _compilation = compilation;
duke@435 236 _top_scope = new IRScope(compilation, NULL, -1, method, osr_bci, true);
duke@435 237 _code = NULL;
duke@435 238 }
duke@435 239
duke@435 240
duke@435 241 void IR::optimize() {
duke@435 242 Optimizer opt(this);
iveresov@2138 243 if (!compilation()->profile_branches()) {
iveresov@2138 244 if (DoCEE) {
iveresov@2138 245 opt.eliminate_conditional_expressions();
duke@435 246 #ifndef PRODUCT
iveresov@2138 247 if (PrintCFG || PrintCFG1) { tty->print_cr("CFG after CEE"); print(true); }
iveresov@2138 248 if (PrintIR || PrintIR1 ) { tty->print_cr("IR after CEE"); print(false); }
duke@435 249 #endif
iveresov@2138 250 }
iveresov@2138 251 if (EliminateBlocks) {
iveresov@2138 252 opt.eliminate_blocks();
duke@435 253 #ifndef PRODUCT
iveresov@2138 254 if (PrintCFG || PrintCFG1) { tty->print_cr("CFG after block elimination"); print(true); }
iveresov@2138 255 if (PrintIR || PrintIR1 ) { tty->print_cr("IR after block elimination"); print(false); }
duke@435 256 #endif
iveresov@2138 257 }
duke@435 258 }
duke@435 259 if (EliminateNullChecks) {
duke@435 260 opt.eliminate_null_checks();
duke@435 261 #ifndef PRODUCT
duke@435 262 if (PrintCFG || PrintCFG1) { tty->print_cr("CFG after null check elimination"); print(true); }
duke@435 263 if (PrintIR || PrintIR1 ) { tty->print_cr("IR after null check elimination"); print(false); }
duke@435 264 #endif
duke@435 265 }
duke@435 266 }
duke@435 267
duke@435 268
duke@435 269 static int sort_pairs(BlockPair** a, BlockPair** b) {
duke@435 270 if ((*a)->from() == (*b)->from()) {
duke@435 271 return (*a)->to()->block_id() - (*b)->to()->block_id();
duke@435 272 } else {
duke@435 273 return (*a)->from()->block_id() - (*b)->from()->block_id();
duke@435 274 }
duke@435 275 }
duke@435 276
duke@435 277
duke@435 278 class CriticalEdgeFinder: public BlockClosure {
duke@435 279 BlockPairList blocks;
duke@435 280 IR* _ir;
duke@435 281
duke@435 282 public:
duke@435 283 CriticalEdgeFinder(IR* ir): _ir(ir) {}
duke@435 284 void block_do(BlockBegin* bb) {
duke@435 285 BlockEnd* be = bb->end();
duke@435 286 int nos = be->number_of_sux();
duke@435 287 if (nos >= 2) {
duke@435 288 for (int i = 0; i < nos; i++) {
duke@435 289 BlockBegin* sux = be->sux_at(i);
duke@435 290 if (sux->number_of_preds() >= 2) {
duke@435 291 blocks.append(new BlockPair(bb, sux));
duke@435 292 }
duke@435 293 }
duke@435 294 }
duke@435 295 }
duke@435 296
duke@435 297 void split_edges() {
duke@435 298 BlockPair* last_pair = NULL;
duke@435 299 blocks.sort(sort_pairs);
duke@435 300 for (int i = 0; i < blocks.length(); i++) {
duke@435 301 BlockPair* pair = blocks.at(i);
duke@435 302 if (last_pair != NULL && pair->is_same(last_pair)) continue;
duke@435 303 BlockBegin* from = pair->from();
duke@435 304 BlockBegin* to = pair->to();
duke@435 305 BlockBegin* split = from->insert_block_between(to);
duke@435 306 #ifndef PRODUCT
duke@435 307 if ((PrintIR || PrintIR1) && Verbose) {
duke@435 308 tty->print_cr("Split critical edge B%d -> B%d (new block B%d)",
duke@435 309 from->block_id(), to->block_id(), split->block_id());
duke@435 310 }
duke@435 311 #endif
duke@435 312 last_pair = pair;
duke@435 313 }
duke@435 314 }
duke@435 315 };
duke@435 316
duke@435 317 void IR::split_critical_edges() {
duke@435 318 CriticalEdgeFinder cef(this);
duke@435 319
duke@435 320 iterate_preorder(&cef);
duke@435 321 cef.split_edges();
duke@435 322 }
duke@435 323
duke@435 324
iveresov@1939 325 class UseCountComputer: public ValueVisitor, BlockClosure {
duke@435 326 private:
iveresov@1939 327 void visit(Value* n) {
duke@435 328 // Local instructions and Phis for expression stack values at the
duke@435 329 // start of basic blocks are not added to the instruction list
roland@2254 330 if (!(*n)->is_linked() && (*n)->can_be_linked()) {
duke@435 331 assert(false, "a node was not appended to the graph");
iveresov@1939 332 Compilation::current()->bailout("a node was not appended to the graph");
duke@435 333 }
duke@435 334 // use n's input if not visited before
duke@435 335 if (!(*n)->is_pinned() && !(*n)->has_uses()) {
duke@435 336 // note: a) if the instruction is pinned, it will be handled by compute_use_count
duke@435 337 // b) if the instruction has uses, it was touched before
duke@435 338 // => in both cases we don't need to update n's values
duke@435 339 uses_do(n);
duke@435 340 }
duke@435 341 // use n
duke@435 342 (*n)->_use_count++;
duke@435 343 }
duke@435 344
iveresov@1939 345 Values* worklist;
iveresov@1939 346 int depth;
duke@435 347 enum {
duke@435 348 max_recurse_depth = 20
duke@435 349 };
duke@435 350
iveresov@1939 351 void uses_do(Value* n) {
duke@435 352 depth++;
duke@435 353 if (depth > max_recurse_depth) {
duke@435 354 // don't allow the traversal to recurse too deeply
duke@435 355 worklist->push(*n);
duke@435 356 } else {
iveresov@1939 357 (*n)->input_values_do(this);
duke@435 358 // special handling for some instructions
duke@435 359 if ((*n)->as_BlockEnd() != NULL) {
duke@435 360 // note on BlockEnd:
duke@435 361 // must 'use' the stack only if the method doesn't
duke@435 362 // terminate, however, in those cases stack is empty
iveresov@1939 363 (*n)->state_values_do(this);
duke@435 364 }
duke@435 365 }
duke@435 366 depth--;
duke@435 367 }
duke@435 368
iveresov@1939 369 void block_do(BlockBegin* b) {
duke@435 370 depth = 0;
duke@435 371 // process all pinned nodes as the roots of expression trees
duke@435 372 for (Instruction* n = b; n != NULL; n = n->next()) {
duke@435 373 if (n->is_pinned()) uses_do(&n);
duke@435 374 }
duke@435 375 assert(depth == 0, "should have counted back down");
duke@435 376
duke@435 377 // now process any unpinned nodes which recursed too deeply
duke@435 378 while (worklist->length() > 0) {
duke@435 379 Value t = worklist->pop();
duke@435 380 if (!t->is_pinned()) {
duke@435 381 // compute the use count
duke@435 382 uses_do(&t);
duke@435 383
duke@435 384 // pin the instruction so that LIRGenerator doesn't recurse
duke@435 385 // too deeply during it's evaluation.
duke@435 386 t->pin();
duke@435 387 }
duke@435 388 }
duke@435 389 assert(depth == 0, "should have counted back down");
duke@435 390 }
duke@435 391
iveresov@1939 392 UseCountComputer() {
iveresov@1939 393 worklist = new Values();
iveresov@1939 394 depth = 0;
iveresov@1939 395 }
iveresov@1939 396
duke@435 397 public:
duke@435 398 static void compute(BlockList* blocks) {
iveresov@1939 399 UseCountComputer ucc;
iveresov@1939 400 blocks->iterate_backward(&ucc);
duke@435 401 }
duke@435 402 };
duke@435 403
duke@435 404
duke@435 405 // helper macro for short definition of trace-output inside code
duke@435 406 #ifndef PRODUCT
duke@435 407 #define TRACE_LINEAR_SCAN(level, code) \
duke@435 408 if (TraceLinearScanLevel >= level) { \
duke@435 409 code; \
duke@435 410 }
duke@435 411 #else
duke@435 412 #define TRACE_LINEAR_SCAN(level, code)
duke@435 413 #endif
duke@435 414
duke@435 415 class ComputeLinearScanOrder : public StackObj {
duke@435 416 private:
duke@435 417 int _max_block_id; // the highest block_id of a block
duke@435 418 int _num_blocks; // total number of blocks (smaller than _max_block_id)
duke@435 419 int _num_loops; // total number of loops
duke@435 420 bool _iterative_dominators;// method requires iterative computation of dominatiors
duke@435 421
duke@435 422 BlockList* _linear_scan_order; // the resulting list of blocks in correct order
duke@435 423
duke@435 424 BitMap _visited_blocks; // used for recursive processing of blocks
duke@435 425 BitMap _active_blocks; // used for recursive processing of blocks
duke@435 426 BitMap _dominator_blocks; // temproary BitMap used for computation of dominator
duke@435 427 intArray _forward_branches; // number of incoming forward branches for each block
duke@435 428 BlockList _loop_end_blocks; // list of all loop end blocks collected during count_edges
duke@435 429 BitMap2D _loop_map; // two-dimensional bit set: a bit is set if a block is contained in a loop
duke@435 430 BlockList _work_list; // temporary list (used in mark_loops and compute_order)
duke@435 431
iveresov@2138 432 Compilation* _compilation;
iveresov@2138 433
duke@435 434 // accessors for _visited_blocks and _active_blocks
duke@435 435 void init_visited() { _active_blocks.clear(); _visited_blocks.clear(); }
duke@435 436 bool is_visited(BlockBegin* b) const { return _visited_blocks.at(b->block_id()); }
duke@435 437 bool is_active(BlockBegin* b) const { return _active_blocks.at(b->block_id()); }
duke@435 438 void set_visited(BlockBegin* b) { assert(!is_visited(b), "already set"); _visited_blocks.set_bit(b->block_id()); }
duke@435 439 void set_active(BlockBegin* b) { assert(!is_active(b), "already set"); _active_blocks.set_bit(b->block_id()); }
duke@435 440 void clear_active(BlockBegin* b) { assert(is_active(b), "not already"); _active_blocks.clear_bit(b->block_id()); }
duke@435 441
duke@435 442 // accessors for _forward_branches
duke@435 443 void inc_forward_branches(BlockBegin* b) { _forward_branches.at_put(b->block_id(), _forward_branches.at(b->block_id()) + 1); }
duke@435 444 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()); }
duke@435 445
duke@435 446 // accessors for _loop_map
duke@435 447 bool is_block_in_loop (int loop_idx, BlockBegin* b) const { return _loop_map.at(loop_idx, b->block_id()); }
duke@435 448 void set_block_in_loop (int loop_idx, BlockBegin* b) { _loop_map.set_bit(loop_idx, b->block_id()); }
duke@435 449 void clear_block_in_loop(int loop_idx, int block_id) { _loop_map.clear_bit(loop_idx, block_id); }
duke@435 450
duke@435 451 // count edges between blocks
duke@435 452 void count_edges(BlockBegin* cur, BlockBegin* parent);
duke@435 453
duke@435 454 // loop detection
duke@435 455 void mark_loops();
duke@435 456 void clear_non_natural_loops(BlockBegin* start_block);
duke@435 457 void assign_loop_depth(BlockBegin* start_block);
duke@435 458
duke@435 459 // computation of final block order
duke@435 460 BlockBegin* common_dominator(BlockBegin* a, BlockBegin* b);
duke@435 461 void compute_dominator(BlockBegin* cur, BlockBegin* parent);
duke@435 462 int compute_weight(BlockBegin* cur);
duke@435 463 bool ready_for_processing(BlockBegin* cur);
duke@435 464 void sort_into_work_list(BlockBegin* b);
duke@435 465 void append_block(BlockBegin* cur);
duke@435 466 void compute_order(BlockBegin* start_block);
duke@435 467
duke@435 468 // fixup of dominators for non-natural loops
duke@435 469 bool compute_dominators_iter();
duke@435 470 void compute_dominators();
duke@435 471
duke@435 472 // debug functions
duke@435 473 NOT_PRODUCT(void print_blocks();)
duke@435 474 DEBUG_ONLY(void verify();)
duke@435 475
iveresov@2138 476 Compilation* compilation() const { return _compilation; }
duke@435 477 public:
iveresov@2138 478 ComputeLinearScanOrder(Compilation* c, BlockBegin* start_block);
duke@435 479
duke@435 480 // accessors for final result
duke@435 481 BlockList* linear_scan_order() const { return _linear_scan_order; }
duke@435 482 int num_loops() const { return _num_loops; }
duke@435 483 };
duke@435 484
duke@435 485
iveresov@2138 486 ComputeLinearScanOrder::ComputeLinearScanOrder(Compilation* c, BlockBegin* start_block) :
duke@435 487 _max_block_id(BlockBegin::number_of_blocks()),
duke@435 488 _num_blocks(0),
duke@435 489 _num_loops(0),
duke@435 490 _iterative_dominators(false),
duke@435 491 _visited_blocks(_max_block_id),
duke@435 492 _active_blocks(_max_block_id),
duke@435 493 _dominator_blocks(_max_block_id),
duke@435 494 _forward_branches(_max_block_id, 0),
duke@435 495 _loop_end_blocks(8),
duke@435 496 _work_list(8),
duke@435 497 _linear_scan_order(NULL), // initialized later with correct size
iveresov@2138 498 _loop_map(0, 0), // initialized later with correct size
iveresov@2138 499 _compilation(c)
duke@435 500 {
duke@435 501 TRACE_LINEAR_SCAN(2, "***** computing linear-scan block order");
duke@435 502
duke@435 503 init_visited();
duke@435 504 count_edges(start_block, NULL);
duke@435 505
iveresov@2138 506 if (compilation()->is_profiling()) {
iveresov@2349 507 ciMethod *method = compilation()->method();
iveresov@2349 508 if (!method->is_accessor()) {
iveresov@2349 509 ciMethodData* md = method->method_data_or_null();
iveresov@2349 510 assert(md != NULL, "Sanity");
iveresov@2349 511 md->set_compilation_stats(_num_loops, _num_blocks);
iveresov@2349 512 }
iveresov@2138 513 }
iveresov@2138 514
duke@435 515 if (_num_loops > 0) {
duke@435 516 mark_loops();
duke@435 517 clear_non_natural_loops(start_block);
duke@435 518 assign_loop_depth(start_block);
duke@435 519 }
duke@435 520
duke@435 521 compute_order(start_block);
duke@435 522 compute_dominators();
duke@435 523
duke@435 524 NOT_PRODUCT(print_blocks());
duke@435 525 DEBUG_ONLY(verify());
duke@435 526 }
duke@435 527
duke@435 528
duke@435 529 // Traverse the CFG:
duke@435 530 // * count total number of blocks
duke@435 531 // * count all incoming edges and backward incoming edges
duke@435 532 // * number loop header blocks
duke@435 533 // * create a list with all loop end blocks
duke@435 534 void ComputeLinearScanOrder::count_edges(BlockBegin* cur, BlockBegin* parent) {
duke@435 535 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));
duke@435 536 assert(cur->dominator() == NULL, "dominator already initialized");
duke@435 537
duke@435 538 if (is_active(cur)) {
duke@435 539 TRACE_LINEAR_SCAN(3, tty->print_cr("backward branch"));
duke@435 540 assert(is_visited(cur), "block must be visisted when block is active");
duke@435 541 assert(parent != NULL, "must have parent");
duke@435 542
duke@435 543 cur->set(BlockBegin::linear_scan_loop_header_flag);
duke@435 544 cur->set(BlockBegin::backward_branch_target_flag);
duke@435 545
duke@435 546 parent->set(BlockBegin::linear_scan_loop_end_flag);
never@863 547
never@863 548 // When a loop header is also the start of an exception handler, then the backward branch is
never@863 549 // an exception edge. Because such edges are usually critical edges which cannot be split, the
never@863 550 // loop must be excluded here from processing.
never@863 551 if (cur->is_set(BlockBegin::exception_entry_flag)) {
never@863 552 // Make sure that dominators are correct in this weird situation
never@863 553 _iterative_dominators = true;
never@863 554 return;
never@863 555 }
never@863 556 assert(parent->number_of_sux() == 1 && parent->sux_at(0) == cur,
never@863 557 "loop end blocks must have one successor (critical edges are split)");
never@863 558
duke@435 559 _loop_end_blocks.append(parent);
duke@435 560 return;
duke@435 561 }
duke@435 562
duke@435 563 // increment number of incoming forward branches
duke@435 564 inc_forward_branches(cur);
duke@435 565
duke@435 566 if (is_visited(cur)) {
duke@435 567 TRACE_LINEAR_SCAN(3, tty->print_cr("block already visited"));
duke@435 568 return;
duke@435 569 }
duke@435 570
duke@435 571 _num_blocks++;
duke@435 572 set_visited(cur);
duke@435 573 set_active(cur);
duke@435 574
duke@435 575 // recursive call for all successors
duke@435 576 int i;
duke@435 577 for (i = cur->number_of_sux() - 1; i >= 0; i--) {
duke@435 578 count_edges(cur->sux_at(i), cur);
duke@435 579 }
duke@435 580 for (i = cur->number_of_exception_handlers() - 1; i >= 0; i--) {
duke@435 581 count_edges(cur->exception_handler_at(i), cur);
duke@435 582 }
duke@435 583
duke@435 584 clear_active(cur);
duke@435 585
duke@435 586 // Each loop has a unique number.
duke@435 587 // When multiple loops are nested, assign_loop_depth assumes that the
duke@435 588 // innermost loop has the lowest number. This is guaranteed by setting
duke@435 589 // the loop number after the recursive calls for the successors above
duke@435 590 // have returned.
duke@435 591 if (cur->is_set(BlockBegin::linear_scan_loop_header_flag)) {
duke@435 592 assert(cur->loop_index() == -1, "cannot set loop-index twice");
duke@435 593 TRACE_LINEAR_SCAN(3, tty->print_cr("Block B%d is loop header of loop %d", cur->block_id(), _num_loops));
duke@435 594
duke@435 595 cur->set_loop_index(_num_loops);
duke@435 596 _num_loops++;
duke@435 597 }
duke@435 598
duke@435 599 TRACE_LINEAR_SCAN(3, tty->print_cr("Finished count_edges for block B%d", cur->block_id()));
duke@435 600 }
duke@435 601
duke@435 602
duke@435 603 void ComputeLinearScanOrder::mark_loops() {
duke@435 604 TRACE_LINEAR_SCAN(3, tty->print_cr("----- marking loops"));
duke@435 605
duke@435 606 _loop_map = BitMap2D(_num_loops, _max_block_id);
duke@435 607 _loop_map.clear();
duke@435 608
duke@435 609 for (int i = _loop_end_blocks.length() - 1; i >= 0; i--) {
duke@435 610 BlockBegin* loop_end = _loop_end_blocks.at(i);
duke@435 611 BlockBegin* loop_start = loop_end->sux_at(0);
duke@435 612 int loop_idx = loop_start->loop_index();
duke@435 613
duke@435 614 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));
duke@435 615 assert(loop_end->is_set(BlockBegin::linear_scan_loop_end_flag), "loop end flag must be set");
duke@435 616 assert(loop_end->number_of_sux() == 1, "incorrect number of successors");
duke@435 617 assert(loop_start->is_set(BlockBegin::linear_scan_loop_header_flag), "loop header flag must be set");
duke@435 618 assert(loop_idx >= 0 && loop_idx < _num_loops, "loop index not set");
duke@435 619 assert(_work_list.is_empty(), "work list must be empty before processing");
duke@435 620
duke@435 621 // add the end-block of the loop to the working list
duke@435 622 _work_list.push(loop_end);
duke@435 623 set_block_in_loop(loop_idx, loop_end);
duke@435 624 do {
duke@435 625 BlockBegin* cur = _work_list.pop();
duke@435 626
duke@435 627 TRACE_LINEAR_SCAN(3, tty->print_cr(" processing B%d", cur->block_id()));
duke@435 628 assert(is_block_in_loop(loop_idx, cur), "bit in loop map must be set when block is in work list");
duke@435 629
duke@435 630 // recursive processing of all predecessors ends when start block of loop is reached
duke@435 631 if (cur != loop_start && !cur->is_set(BlockBegin::osr_entry_flag)) {
duke@435 632 for (int j = cur->number_of_preds() - 1; j >= 0; j--) {
duke@435 633 BlockBegin* pred = cur->pred_at(j);
duke@435 634
duke@435 635 if (!is_block_in_loop(loop_idx, pred) /*&& !pred->is_set(BlockBeginosr_entry_flag)*/) {
duke@435 636 // this predecessor has not been processed yet, so add it to work list
duke@435 637 TRACE_LINEAR_SCAN(3, tty->print_cr(" pushing B%d", pred->block_id()));
duke@435 638 _work_list.push(pred);
duke@435 639 set_block_in_loop(loop_idx, pred);
duke@435 640 }
duke@435 641 }
duke@435 642 }
duke@435 643 } while (!_work_list.is_empty());
duke@435 644 }
duke@435 645 }
duke@435 646
duke@435 647
duke@435 648 // check for non-natural loops (loops where the loop header does not dominate
duke@435 649 // all other loop blocks = loops with mulitple entries).
duke@435 650 // such loops are ignored
duke@435 651 void ComputeLinearScanOrder::clear_non_natural_loops(BlockBegin* start_block) {
duke@435 652 for (int i = _num_loops - 1; i >= 0; i--) {
duke@435 653 if (is_block_in_loop(i, start_block)) {
duke@435 654 // loop i contains the entry block of the method
duke@435 655 // -> this is not a natural loop, so ignore it
duke@435 656 TRACE_LINEAR_SCAN(2, tty->print_cr("Loop %d is non-natural, so it is ignored", i));
duke@435 657
duke@435 658 for (int block_id = _max_block_id - 1; block_id >= 0; block_id--) {
duke@435 659 clear_block_in_loop(i, block_id);
duke@435 660 }
duke@435 661 _iterative_dominators = true;
duke@435 662 }
duke@435 663 }
duke@435 664 }
duke@435 665
duke@435 666 void ComputeLinearScanOrder::assign_loop_depth(BlockBegin* start_block) {
duke@435 667 TRACE_LINEAR_SCAN(3, "----- computing loop-depth and weight");
duke@435 668 init_visited();
duke@435 669
duke@435 670 assert(_work_list.is_empty(), "work list must be empty before processing");
duke@435 671 _work_list.append(start_block);
duke@435 672
duke@435 673 do {
duke@435 674 BlockBegin* cur = _work_list.pop();
duke@435 675
duke@435 676 if (!is_visited(cur)) {
duke@435 677 set_visited(cur);
duke@435 678 TRACE_LINEAR_SCAN(4, tty->print_cr("Computing loop depth for block B%d", cur->block_id()));
duke@435 679
duke@435 680 // compute loop-depth and loop-index for the block
duke@435 681 assert(cur->loop_depth() == 0, "cannot set loop-depth twice");
duke@435 682 int i;
duke@435 683 int loop_depth = 0;
duke@435 684 int min_loop_idx = -1;
duke@435 685 for (i = _num_loops - 1; i >= 0; i--) {
duke@435 686 if (is_block_in_loop(i, cur)) {
duke@435 687 loop_depth++;
duke@435 688 min_loop_idx = i;
duke@435 689 }
duke@435 690 }
duke@435 691 cur->set_loop_depth(loop_depth);
duke@435 692 cur->set_loop_index(min_loop_idx);
duke@435 693
duke@435 694 // append all unvisited successors to work list
duke@435 695 for (i = cur->number_of_sux() - 1; i >= 0; i--) {
duke@435 696 _work_list.append(cur->sux_at(i));
duke@435 697 }
duke@435 698 for (i = cur->number_of_exception_handlers() - 1; i >= 0; i--) {
duke@435 699 _work_list.append(cur->exception_handler_at(i));
duke@435 700 }
duke@435 701 }
duke@435 702 } while (!_work_list.is_empty());
duke@435 703 }
duke@435 704
duke@435 705
duke@435 706 BlockBegin* ComputeLinearScanOrder::common_dominator(BlockBegin* a, BlockBegin* b) {
duke@435 707 assert(a != NULL && b != NULL, "must have input blocks");
duke@435 708
duke@435 709 _dominator_blocks.clear();
duke@435 710 while (a != NULL) {
duke@435 711 _dominator_blocks.set_bit(a->block_id());
duke@435 712 assert(a->dominator() != NULL || a == _linear_scan_order->at(0), "dominator must be initialized");
duke@435 713 a = a->dominator();
duke@435 714 }
duke@435 715 while (b != NULL && !_dominator_blocks.at(b->block_id())) {
duke@435 716 assert(b->dominator() != NULL || b == _linear_scan_order->at(0), "dominator must be initialized");
duke@435 717 b = b->dominator();
duke@435 718 }
duke@435 719
duke@435 720 assert(b != NULL, "could not find dominator");
duke@435 721 return b;
duke@435 722 }
duke@435 723
duke@435 724 void ComputeLinearScanOrder::compute_dominator(BlockBegin* cur, BlockBegin* parent) {
duke@435 725 if (cur->dominator() == NULL) {
duke@435 726 TRACE_LINEAR_SCAN(4, tty->print_cr("DOM: initializing dominator of B%d to B%d", cur->block_id(), parent->block_id()));
duke@435 727 cur->set_dominator(parent);
duke@435 728
duke@435 729 } else if (!(cur->is_set(BlockBegin::linear_scan_loop_header_flag) && parent->is_set(BlockBegin::linear_scan_loop_end_flag))) {
duke@435 730 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()));
duke@435 731 assert(cur->number_of_preds() > 1, "");
duke@435 732 cur->set_dominator(common_dominator(cur->dominator(), parent));
duke@435 733 }
duke@435 734 }
duke@435 735
duke@435 736
duke@435 737 int ComputeLinearScanOrder::compute_weight(BlockBegin* cur) {
duke@435 738 BlockBegin* single_sux = NULL;
duke@435 739 if (cur->number_of_sux() == 1) {
duke@435 740 single_sux = cur->sux_at(0);
duke@435 741 }
duke@435 742
duke@435 743 // limit loop-depth to 15 bit (only for security reason, it will never be so big)
duke@435 744 int weight = (cur->loop_depth() & 0x7FFF) << 16;
duke@435 745
duke@435 746 // general macro for short definition of weight flags
duke@435 747 // the first instance of INC_WEIGHT_IF has the highest priority
duke@435 748 int cur_bit = 15;
duke@435 749 #define INC_WEIGHT_IF(condition) if ((condition)) { weight |= (1 << cur_bit); } cur_bit--;
duke@435 750
duke@435 751 // this is necessery for the (very rare) case that two successing blocks have
duke@435 752 // the same loop depth, but a different loop index (can happen for endless loops
duke@435 753 // with exception handlers)
duke@435 754 INC_WEIGHT_IF(!cur->is_set(BlockBegin::linear_scan_loop_header_flag));
duke@435 755
duke@435 756 // loop end blocks (blocks that end with a backward branch) are added
duke@435 757 // after all other blocks of the loop.
duke@435 758 INC_WEIGHT_IF(!cur->is_set(BlockBegin::linear_scan_loop_end_flag));
duke@435 759
duke@435 760 // critical edge split blocks are prefered because than they have a bigger
duke@435 761 // proability to be completely empty
duke@435 762 INC_WEIGHT_IF(cur->is_set(BlockBegin::critical_edge_split_flag));
duke@435 763
duke@435 764 // exceptions should not be thrown in normal control flow, so these blocks
duke@435 765 // are added as late as possible
duke@435 766 INC_WEIGHT_IF(cur->end()->as_Throw() == NULL && (single_sux == NULL || single_sux->end()->as_Throw() == NULL));
duke@435 767 INC_WEIGHT_IF(cur->end()->as_Return() == NULL && (single_sux == NULL || single_sux->end()->as_Return() == NULL));
duke@435 768
duke@435 769 // exceptions handlers are added as late as possible
duke@435 770 INC_WEIGHT_IF(!cur->is_set(BlockBegin::exception_entry_flag));
duke@435 771
duke@435 772 // guarantee that weight is > 0
duke@435 773 weight |= 1;
duke@435 774
duke@435 775 #undef INC_WEIGHT_IF
duke@435 776 assert(cur_bit >= 0, "too many flags");
duke@435 777 assert(weight > 0, "weight cannot become negative");
duke@435 778
duke@435 779 return weight;
duke@435 780 }
duke@435 781
duke@435 782 bool ComputeLinearScanOrder::ready_for_processing(BlockBegin* cur) {
duke@435 783 // Discount the edge just traveled.
duke@435 784 // When the number drops to zero, all forward branches were processed
duke@435 785 if (dec_forward_branches(cur) != 0) {
duke@435 786 return false;
duke@435 787 }
duke@435 788
duke@435 789 assert(_linear_scan_order->index_of(cur) == -1, "block already processed (block can be ready only once)");
duke@435 790 assert(_work_list.index_of(cur) == -1, "block already in work-list (block can be ready only once)");
duke@435 791 return true;
duke@435 792 }
duke@435 793
duke@435 794 void ComputeLinearScanOrder::sort_into_work_list(BlockBegin* cur) {
duke@435 795 assert(_work_list.index_of(cur) == -1, "block already in work list");
duke@435 796
duke@435 797 int cur_weight = compute_weight(cur);
duke@435 798
duke@435 799 // the linear_scan_number is used to cache the weight of a block
duke@435 800 cur->set_linear_scan_number(cur_weight);
duke@435 801
duke@435 802 #ifndef PRODUCT
duke@435 803 if (StressLinearScan) {
duke@435 804 _work_list.insert_before(0, cur);
duke@435 805 return;
duke@435 806 }
duke@435 807 #endif
duke@435 808
duke@435 809 _work_list.append(NULL); // provide space for new element
duke@435 810
duke@435 811 int insert_idx = _work_list.length() - 1;
duke@435 812 while (insert_idx > 0 && _work_list.at(insert_idx - 1)->linear_scan_number() > cur_weight) {
duke@435 813 _work_list.at_put(insert_idx, _work_list.at(insert_idx - 1));
duke@435 814 insert_idx--;
duke@435 815 }
duke@435 816 _work_list.at_put(insert_idx, cur);
duke@435 817
duke@435 818 TRACE_LINEAR_SCAN(3, tty->print_cr("Sorted B%d into worklist. new worklist:", cur->block_id()));
duke@435 819 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()));
duke@435 820
duke@435 821 #ifdef ASSERT
duke@435 822 for (int i = 0; i < _work_list.length(); i++) {
duke@435 823 assert(_work_list.at(i)->linear_scan_number() > 0, "weight not set");
duke@435 824 assert(i == 0 || _work_list.at(i - 1)->linear_scan_number() <= _work_list.at(i)->linear_scan_number(), "incorrect order in worklist");
duke@435 825 }
duke@435 826 #endif
duke@435 827 }
duke@435 828
duke@435 829 void ComputeLinearScanOrder::append_block(BlockBegin* cur) {
duke@435 830 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()));
duke@435 831 assert(_linear_scan_order->index_of(cur) == -1, "cannot add the same block twice");
duke@435 832
duke@435 833 // currently, the linear scan order and code emit order are equal.
duke@435 834 // therefore the linear_scan_number and the weight of a block must also
duke@435 835 // be equal.
duke@435 836 cur->set_linear_scan_number(_linear_scan_order->length());
duke@435 837 _linear_scan_order->append(cur);
duke@435 838 }
duke@435 839
duke@435 840 void ComputeLinearScanOrder::compute_order(BlockBegin* start_block) {
duke@435 841 TRACE_LINEAR_SCAN(3, "----- computing final block order");
duke@435 842
duke@435 843 // the start block is always the first block in the linear scan order
duke@435 844 _linear_scan_order = new BlockList(_num_blocks);
duke@435 845 append_block(start_block);
duke@435 846
duke@435 847 assert(start_block->end()->as_Base() != NULL, "start block must end with Base-instruction");
duke@435 848 BlockBegin* std_entry = ((Base*)start_block->end())->std_entry();
duke@435 849 BlockBegin* osr_entry = ((Base*)start_block->end())->osr_entry();
duke@435 850
duke@435 851 BlockBegin* sux_of_osr_entry = NULL;
duke@435 852 if (osr_entry != NULL) {
duke@435 853 // special handling for osr entry:
duke@435 854 // ignore the edge between the osr entry and its successor for processing
duke@435 855 // the osr entry block is added manually below
duke@435 856 assert(osr_entry->number_of_sux() == 1, "osr entry must have exactly one successor");
duke@435 857 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");
duke@435 858
duke@435 859 sux_of_osr_entry = osr_entry->sux_at(0);
duke@435 860 dec_forward_branches(sux_of_osr_entry);
duke@435 861
duke@435 862 compute_dominator(osr_entry, start_block);
duke@435 863 _iterative_dominators = true;
duke@435 864 }
duke@435 865 compute_dominator(std_entry, start_block);
duke@435 866
duke@435 867 // start processing with standard entry block
duke@435 868 assert(_work_list.is_empty(), "list must be empty before processing");
duke@435 869
duke@435 870 if (ready_for_processing(std_entry)) {
duke@435 871 sort_into_work_list(std_entry);
duke@435 872 } else {
duke@435 873 assert(false, "the std_entry must be ready for processing (otherwise, the method has no start block)");
duke@435 874 }
duke@435 875
duke@435 876 do {
duke@435 877 BlockBegin* cur = _work_list.pop();
duke@435 878
duke@435 879 if (cur == sux_of_osr_entry) {
duke@435 880 // the osr entry block is ignored in normal processing, it is never added to the
duke@435 881 // work list. Instead, it is added as late as possible manually here.
duke@435 882 append_block(osr_entry);
duke@435 883 compute_dominator(cur, osr_entry);
duke@435 884 }
duke@435 885 append_block(cur);
duke@435 886
duke@435 887 int i;
duke@435 888 int num_sux = cur->number_of_sux();
duke@435 889 // changed loop order to get "intuitive" order of if- and else-blocks
duke@435 890 for (i = 0; i < num_sux; i++) {
duke@435 891 BlockBegin* sux = cur->sux_at(i);
duke@435 892 compute_dominator(sux, cur);
duke@435 893 if (ready_for_processing(sux)) {
duke@435 894 sort_into_work_list(sux);
duke@435 895 }
duke@435 896 }
duke@435 897 num_sux = cur->number_of_exception_handlers();
duke@435 898 for (i = 0; i < num_sux; i++) {
duke@435 899 BlockBegin* sux = cur->exception_handler_at(i);
duke@435 900 compute_dominator(sux, cur);
duke@435 901 if (ready_for_processing(sux)) {
duke@435 902 sort_into_work_list(sux);
duke@435 903 }
duke@435 904 }
duke@435 905 } while (_work_list.length() > 0);
duke@435 906 }
duke@435 907
duke@435 908
duke@435 909 bool ComputeLinearScanOrder::compute_dominators_iter() {
duke@435 910 bool changed = false;
duke@435 911 int num_blocks = _linear_scan_order->length();
duke@435 912
duke@435 913 assert(_linear_scan_order->at(0)->dominator() == NULL, "must not have dominator");
duke@435 914 assert(_linear_scan_order->at(0)->number_of_preds() == 0, "must not have predecessors");
duke@435 915 for (int i = 1; i < num_blocks; i++) {
duke@435 916 BlockBegin* block = _linear_scan_order->at(i);
duke@435 917
duke@435 918 BlockBegin* dominator = block->pred_at(0);
duke@435 919 int num_preds = block->number_of_preds();
duke@435 920 for (int i = 1; i < num_preds; i++) {
duke@435 921 dominator = common_dominator(dominator, block->pred_at(i));
duke@435 922 }
duke@435 923
duke@435 924 if (dominator != block->dominator()) {
duke@435 925 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()));
duke@435 926
duke@435 927 block->set_dominator(dominator);
duke@435 928 changed = true;
duke@435 929 }
duke@435 930 }
duke@435 931 return changed;
duke@435 932 }
duke@435 933
duke@435 934 void ComputeLinearScanOrder::compute_dominators() {
duke@435 935 TRACE_LINEAR_SCAN(3, tty->print_cr("----- computing dominators (iterative computation reqired: %d)", _iterative_dominators));
duke@435 936
duke@435 937 // iterative computation of dominators is only required for methods with non-natural loops
duke@435 938 // and OSR-methods. For all other methods, the dominators computed when generating the
duke@435 939 // linear scan block order are correct.
duke@435 940 if (_iterative_dominators) {
duke@435 941 do {
duke@435 942 TRACE_LINEAR_SCAN(1, tty->print_cr("DOM: next iteration of fix-point calculation"));
duke@435 943 } while (compute_dominators_iter());
duke@435 944 }
duke@435 945
duke@435 946 // check that dominators are correct
duke@435 947 assert(!compute_dominators_iter(), "fix point not reached");
duke@435 948 }
duke@435 949
duke@435 950
duke@435 951 #ifndef PRODUCT
duke@435 952 void ComputeLinearScanOrder::print_blocks() {
duke@435 953 if (TraceLinearScanLevel >= 2) {
duke@435 954 tty->print_cr("----- loop information:");
duke@435 955 for (int block_idx = 0; block_idx < _linear_scan_order->length(); block_idx++) {
duke@435 956 BlockBegin* cur = _linear_scan_order->at(block_idx);
duke@435 957
duke@435 958 tty->print("%4d: B%2d: ", cur->linear_scan_number(), cur->block_id());
duke@435 959 for (int loop_idx = 0; loop_idx < _num_loops; loop_idx++) {
duke@435 960 tty->print ("%d ", is_block_in_loop(loop_idx, cur));
duke@435 961 }
duke@435 962 tty->print_cr(" -> loop_index: %2d, loop_depth: %2d", cur->loop_index(), cur->loop_depth());
duke@435 963 }
duke@435 964 }
duke@435 965
duke@435 966 if (TraceLinearScanLevel >= 1) {
duke@435 967 tty->print_cr("----- linear-scan block order:");
duke@435 968 for (int block_idx = 0; block_idx < _linear_scan_order->length(); block_idx++) {
duke@435 969 BlockBegin* cur = _linear_scan_order->at(block_idx);
duke@435 970 tty->print("%4d: B%2d loop: %2d depth: %2d", cur->linear_scan_number(), cur->block_id(), cur->loop_index(), cur->loop_depth());
duke@435 971
duke@435 972 tty->print(cur->is_set(BlockBegin::exception_entry_flag) ? " ex" : " ");
duke@435 973 tty->print(cur->is_set(BlockBegin::critical_edge_split_flag) ? " ce" : " ");
duke@435 974 tty->print(cur->is_set(BlockBegin::linear_scan_loop_header_flag) ? " lh" : " ");
duke@435 975 tty->print(cur->is_set(BlockBegin::linear_scan_loop_end_flag) ? " le" : " ");
duke@435 976
duke@435 977 if (cur->dominator() != NULL) {
duke@435 978 tty->print(" dom: B%d ", cur->dominator()->block_id());
duke@435 979 } else {
duke@435 980 tty->print(" dom: NULL ");
duke@435 981 }
duke@435 982
duke@435 983 if (cur->number_of_preds() > 0) {
duke@435 984 tty->print(" preds: ");
duke@435 985 for (int j = 0; j < cur->number_of_preds(); j++) {
duke@435 986 BlockBegin* pred = cur->pred_at(j);
duke@435 987 tty->print("B%d ", pred->block_id());
duke@435 988 }
duke@435 989 }
duke@435 990 if (cur->number_of_sux() > 0) {
duke@435 991 tty->print(" sux: ");
duke@435 992 for (int j = 0; j < cur->number_of_sux(); j++) {
duke@435 993 BlockBegin* sux = cur->sux_at(j);
duke@435 994 tty->print("B%d ", sux->block_id());
duke@435 995 }
duke@435 996 }
duke@435 997 if (cur->number_of_exception_handlers() > 0) {
duke@435 998 tty->print(" ex: ");
duke@435 999 for (int j = 0; j < cur->number_of_exception_handlers(); j++) {
duke@435 1000 BlockBegin* ex = cur->exception_handler_at(j);
duke@435 1001 tty->print("B%d ", ex->block_id());
duke@435 1002 }
duke@435 1003 }
duke@435 1004 tty->cr();
duke@435 1005 }
duke@435 1006 }
duke@435 1007 }
duke@435 1008 #endif
duke@435 1009
duke@435 1010 #ifdef ASSERT
duke@435 1011 void ComputeLinearScanOrder::verify() {
duke@435 1012 assert(_linear_scan_order->length() == _num_blocks, "wrong number of blocks in list");
duke@435 1013
duke@435 1014 if (StressLinearScan) {
duke@435 1015 // blocks are scrambled when StressLinearScan is used
duke@435 1016 return;
duke@435 1017 }
duke@435 1018
duke@435 1019 // check that all successors of a block have a higher linear-scan-number
duke@435 1020 // and that all predecessors of a block have a lower linear-scan-number
duke@435 1021 // (only backward branches of loops are ignored)
duke@435 1022 int i;
duke@435 1023 for (i = 0; i < _linear_scan_order->length(); i++) {
duke@435 1024 BlockBegin* cur = _linear_scan_order->at(i);
duke@435 1025
duke@435 1026 assert(cur->linear_scan_number() == i, "incorrect linear_scan_number");
duke@435 1027 assert(cur->linear_scan_number() >= 0 && cur->linear_scan_number() == _linear_scan_order->index_of(cur), "incorrect linear_scan_number");
duke@435 1028
duke@435 1029 int j;
duke@435 1030 for (j = cur->number_of_sux() - 1; j >= 0; j--) {
duke@435 1031 BlockBegin* sux = cur->sux_at(j);
duke@435 1032
duke@435 1033 assert(sux->linear_scan_number() >= 0 && sux->linear_scan_number() == _linear_scan_order->index_of(sux), "incorrect linear_scan_number");
duke@435 1034 if (!cur->is_set(BlockBegin::linear_scan_loop_end_flag)) {
duke@435 1035 assert(cur->linear_scan_number() < sux->linear_scan_number(), "invalid order");
duke@435 1036 }
duke@435 1037 if (cur->loop_depth() == sux->loop_depth()) {
duke@435 1038 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");
duke@435 1039 }
duke@435 1040 }
duke@435 1041
duke@435 1042 for (j = cur->number_of_preds() - 1; j >= 0; j--) {
duke@435 1043 BlockBegin* pred = cur->pred_at(j);
duke@435 1044
duke@435 1045 assert(pred->linear_scan_number() >= 0 && pred->linear_scan_number() == _linear_scan_order->index_of(pred), "incorrect linear_scan_number");
duke@435 1046 if (!cur->is_set(BlockBegin::linear_scan_loop_header_flag)) {
duke@435 1047 assert(cur->linear_scan_number() > pred->linear_scan_number(), "invalid order");
duke@435 1048 }
duke@435 1049 if (cur->loop_depth() == pred->loop_depth()) {
duke@435 1050 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");
duke@435 1051 }
duke@435 1052
duke@435 1053 assert(cur->dominator()->linear_scan_number() <= cur->pred_at(j)->linear_scan_number(), "dominator must be before predecessors");
duke@435 1054 }
duke@435 1055
duke@435 1056 // check dominator
duke@435 1057 if (i == 0) {
duke@435 1058 assert(cur->dominator() == NULL, "first block has no dominator");
duke@435 1059 } else {
duke@435 1060 assert(cur->dominator() != NULL, "all but first block must have dominator");
duke@435 1061 }
duke@435 1062 assert(cur->number_of_preds() != 1 || cur->dominator() == cur->pred_at(0), "Single predecessor must also be dominator");
duke@435 1063 }
duke@435 1064
duke@435 1065 // check that all loops are continuous
duke@435 1066 for (int loop_idx = 0; loop_idx < _num_loops; loop_idx++) {
duke@435 1067 int block_idx = 0;
duke@435 1068 assert(!is_block_in_loop(loop_idx, _linear_scan_order->at(block_idx)), "the first block must not be present in any loop");
duke@435 1069
duke@435 1070 // skip blocks before the loop
duke@435 1071 while (block_idx < _num_blocks && !is_block_in_loop(loop_idx, _linear_scan_order->at(block_idx))) {
duke@435 1072 block_idx++;
duke@435 1073 }
duke@435 1074 // skip blocks of loop
duke@435 1075 while (block_idx < _num_blocks && is_block_in_loop(loop_idx, _linear_scan_order->at(block_idx))) {
duke@435 1076 block_idx++;
duke@435 1077 }
duke@435 1078 // after the first non-loop block, there must not be another loop-block
duke@435 1079 while (block_idx < _num_blocks) {
duke@435 1080 assert(!is_block_in_loop(loop_idx, _linear_scan_order->at(block_idx)), "loop not continuous in linear-scan order");
duke@435 1081 block_idx++;
duke@435 1082 }
duke@435 1083 }
duke@435 1084 }
duke@435 1085 #endif
duke@435 1086
duke@435 1087
duke@435 1088 void IR::compute_code() {
duke@435 1089 assert(is_valid(), "IR must be valid");
duke@435 1090
iveresov@2138 1091 ComputeLinearScanOrder compute_order(compilation(), start());
duke@435 1092 _num_loops = compute_order.num_loops();
duke@435 1093 _code = compute_order.linear_scan_order();
duke@435 1094 }
duke@435 1095
duke@435 1096
duke@435 1097 void IR::compute_use_counts() {
duke@435 1098 // make sure all values coming out of this block get evaluated.
duke@435 1099 int num_blocks = _code->length();
duke@435 1100 for (int i = 0; i < num_blocks; i++) {
duke@435 1101 _code->at(i)->end()->state()->pin_stack_for_linear_scan();
duke@435 1102 }
duke@435 1103
duke@435 1104 // compute use counts
duke@435 1105 UseCountComputer::compute(_code);
duke@435 1106 }
duke@435 1107
duke@435 1108
duke@435 1109 void IR::iterate_preorder(BlockClosure* closure) {
duke@435 1110 assert(is_valid(), "IR must be valid");
duke@435 1111 start()->iterate_preorder(closure);
duke@435 1112 }
duke@435 1113
duke@435 1114
duke@435 1115 void IR::iterate_postorder(BlockClosure* closure) {
duke@435 1116 assert(is_valid(), "IR must be valid");
duke@435 1117 start()->iterate_postorder(closure);
duke@435 1118 }
duke@435 1119
duke@435 1120 void IR::iterate_linear_scan_order(BlockClosure* closure) {
duke@435 1121 linear_scan_order()->iterate_forward(closure);
duke@435 1122 }
duke@435 1123
duke@435 1124
duke@435 1125 #ifndef PRODUCT
duke@435 1126 class BlockPrinter: public BlockClosure {
duke@435 1127 private:
duke@435 1128 InstructionPrinter* _ip;
duke@435 1129 bool _cfg_only;
duke@435 1130 bool _live_only;
duke@435 1131
duke@435 1132 public:
duke@435 1133 BlockPrinter(InstructionPrinter* ip, bool cfg_only, bool live_only = false) {
duke@435 1134 _ip = ip;
duke@435 1135 _cfg_only = cfg_only;
duke@435 1136 _live_only = live_only;
duke@435 1137 }
duke@435 1138
duke@435 1139 virtual void block_do(BlockBegin* block) {
duke@435 1140 if (_cfg_only) {
duke@435 1141 _ip->print_instr(block); tty->cr();
duke@435 1142 } else {
duke@435 1143 block->print_block(*_ip, _live_only);
duke@435 1144 }
duke@435 1145 }
duke@435 1146 };
duke@435 1147
duke@435 1148
duke@435 1149 void IR::print(BlockBegin* start, bool cfg_only, bool live_only) {
duke@435 1150 ttyLocker ttyl;
duke@435 1151 InstructionPrinter ip(!cfg_only);
duke@435 1152 BlockPrinter bp(&ip, cfg_only, live_only);
duke@435 1153 start->iterate_preorder(&bp);
duke@435 1154 tty->cr();
duke@435 1155 }
duke@435 1156
duke@435 1157 void IR::print(bool cfg_only, bool live_only) {
duke@435 1158 if (is_valid()) {
duke@435 1159 print(start(), cfg_only, live_only);
duke@435 1160 } else {
duke@435 1161 tty->print_cr("invalid IR");
duke@435 1162 }
duke@435 1163 }
duke@435 1164
duke@435 1165
duke@435 1166 define_array(BlockListArray, BlockList*)
duke@435 1167 define_stack(BlockListList, BlockListArray)
duke@435 1168
duke@435 1169 class PredecessorValidator : public BlockClosure {
duke@435 1170 private:
duke@435 1171 BlockListList* _predecessors;
duke@435 1172 BlockList* _blocks;
duke@435 1173
duke@435 1174 static int cmp(BlockBegin** a, BlockBegin** b) {
duke@435 1175 return (*a)->block_id() - (*b)->block_id();
duke@435 1176 }
duke@435 1177
duke@435 1178 public:
duke@435 1179 PredecessorValidator(IR* hir) {
duke@435 1180 ResourceMark rm;
duke@435 1181 _predecessors = new BlockListList(BlockBegin::number_of_blocks(), NULL);
duke@435 1182 _blocks = new BlockList();
duke@435 1183
duke@435 1184 int i;
duke@435 1185 hir->start()->iterate_preorder(this);
duke@435 1186 if (hir->code() != NULL) {
duke@435 1187 assert(hir->code()->length() == _blocks->length(), "must match");
duke@435 1188 for (i = 0; i < _blocks->length(); i++) {
duke@435 1189 assert(hir->code()->contains(_blocks->at(i)), "should be in both lists");
duke@435 1190 }
duke@435 1191 }
duke@435 1192
duke@435 1193 for (i = 0; i < _blocks->length(); i++) {
duke@435 1194 BlockBegin* block = _blocks->at(i);
duke@435 1195 BlockList* preds = _predecessors->at(block->block_id());
duke@435 1196 if (preds == NULL) {
duke@435 1197 assert(block->number_of_preds() == 0, "should be the same");
duke@435 1198 continue;
duke@435 1199 }
duke@435 1200
duke@435 1201 // clone the pred list so we can mutate it
duke@435 1202 BlockList* pred_copy = new BlockList();
duke@435 1203 int j;
duke@435 1204 for (j = 0; j < block->number_of_preds(); j++) {
duke@435 1205 pred_copy->append(block->pred_at(j));
duke@435 1206 }
duke@435 1207 // sort them in the same order
duke@435 1208 preds->sort(cmp);
duke@435 1209 pred_copy->sort(cmp);
duke@435 1210 int length = MIN2(preds->length(), block->number_of_preds());
duke@435 1211 for (j = 0; j < block->number_of_preds(); j++) {
duke@435 1212 assert(preds->at(j) == pred_copy->at(j), "must match");
duke@435 1213 }
duke@435 1214
duke@435 1215 assert(preds->length() == block->number_of_preds(), "should be the same");
duke@435 1216 }
duke@435 1217 }
duke@435 1218
duke@435 1219 virtual void block_do(BlockBegin* block) {
duke@435 1220 _blocks->append(block);
duke@435 1221 BlockEnd* be = block->end();
duke@435 1222 int n = be->number_of_sux();
duke@435 1223 int i;
duke@435 1224 for (i = 0; i < n; i++) {
duke@435 1225 BlockBegin* sux = be->sux_at(i);
duke@435 1226 assert(!sux->is_set(BlockBegin::exception_entry_flag), "must not be xhandler");
duke@435 1227
duke@435 1228 BlockList* preds = _predecessors->at_grow(sux->block_id(), NULL);
duke@435 1229 if (preds == NULL) {
duke@435 1230 preds = new BlockList();
duke@435 1231 _predecessors->at_put(sux->block_id(), preds);
duke@435 1232 }
duke@435 1233 preds->append(block);
duke@435 1234 }
duke@435 1235
duke@435 1236 n = block->number_of_exception_handlers();
duke@435 1237 for (i = 0; i < n; i++) {
duke@435 1238 BlockBegin* sux = block->exception_handler_at(i);
duke@435 1239 assert(sux->is_set(BlockBegin::exception_entry_flag), "must be xhandler");
duke@435 1240
duke@435 1241 BlockList* preds = _predecessors->at_grow(sux->block_id(), NULL);
duke@435 1242 if (preds == NULL) {
duke@435 1243 preds = new BlockList();
duke@435 1244 _predecessors->at_put(sux->block_id(), preds);
duke@435 1245 }
duke@435 1246 preds->append(block);
duke@435 1247 }
duke@435 1248 }
duke@435 1249 };
duke@435 1250
duke@435 1251 void IR::verify() {
duke@435 1252 #ifdef ASSERT
duke@435 1253 PredecessorValidator pv(this);
duke@435 1254 #endif
duke@435 1255 }
duke@435 1256
duke@435 1257 #endif // PRODUCT
duke@435 1258
iveresov@1939 1259 void SubstitutionResolver::visit(Value* v) {
duke@435 1260 Value v0 = *v;
duke@435 1261 if (v0) {
duke@435 1262 Value vs = v0->subst();
duke@435 1263 if (vs != v0) {
duke@435 1264 *v = v0->subst();
duke@435 1265 }
duke@435 1266 }
duke@435 1267 }
duke@435 1268
duke@435 1269 #ifdef ASSERT
iveresov@1939 1270 class SubstitutionChecker: public ValueVisitor {
iveresov@1939 1271 void visit(Value* v) {
iveresov@1939 1272 Value v0 = *v;
iveresov@1939 1273 if (v0) {
iveresov@1939 1274 Value vs = v0->subst();
iveresov@1939 1275 assert(vs == v0, "missed substitution");
iveresov@1939 1276 }
duke@435 1277 }
iveresov@1939 1278 };
duke@435 1279 #endif
duke@435 1280
duke@435 1281
duke@435 1282 void SubstitutionResolver::block_do(BlockBegin* block) {
duke@435 1283 Instruction* last = NULL;
duke@435 1284 for (Instruction* n = block; n != NULL;) {
iveresov@1939 1285 n->values_do(this);
duke@435 1286 // need to remove this instruction from the instruction stream
duke@435 1287 if (n->subst() != n) {
duke@435 1288 assert(last != NULL, "must have last");
roland@2174 1289 last->set_next(n->next());
duke@435 1290 } else {
duke@435 1291 last = n;
duke@435 1292 }
duke@435 1293 n = last->next();
duke@435 1294 }
duke@435 1295
duke@435 1296 #ifdef ASSERT
iveresov@1939 1297 SubstitutionChecker check_substitute;
iveresov@1939 1298 if (block->state()) block->state()->values_do(&check_substitute);
iveresov@1939 1299 block->block_values_do(&check_substitute);
iveresov@1939 1300 if (block->end() && block->end()->state()) block->end()->state()->values_do(&check_substitute);
duke@435 1301 #endif
duke@435 1302 }

mercurial