src/share/vm/opto/compile.cpp

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

author
johnc
date
Thu, 07 Apr 2011 09:53:20 -0700
changeset 2781
e1162778c1c8
parent 2780
e6beb62de02d
child 2784
92add02409c9
permissions
-rw-r--r--

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

duke@435 1 /*
never@2658 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #include "precompiled.hpp"
stefank@2314 26 #include "asm/assembler.hpp"
stefank@2314 27 #include "classfile/systemDictionary.hpp"
stefank@2314 28 #include "code/exceptionHandlerTable.hpp"
stefank@2314 29 #include "code/nmethod.hpp"
stefank@2314 30 #include "compiler/compileLog.hpp"
stefank@2314 31 #include "compiler/oopMap.hpp"
stefank@2314 32 #include "opto/addnode.hpp"
stefank@2314 33 #include "opto/block.hpp"
stefank@2314 34 #include "opto/c2compiler.hpp"
stefank@2314 35 #include "opto/callGenerator.hpp"
stefank@2314 36 #include "opto/callnode.hpp"
stefank@2314 37 #include "opto/cfgnode.hpp"
stefank@2314 38 #include "opto/chaitin.hpp"
stefank@2314 39 #include "opto/compile.hpp"
stefank@2314 40 #include "opto/connode.hpp"
stefank@2314 41 #include "opto/divnode.hpp"
stefank@2314 42 #include "opto/escape.hpp"
stefank@2314 43 #include "opto/idealGraphPrinter.hpp"
stefank@2314 44 #include "opto/loopnode.hpp"
stefank@2314 45 #include "opto/machnode.hpp"
stefank@2314 46 #include "opto/macro.hpp"
stefank@2314 47 #include "opto/matcher.hpp"
stefank@2314 48 #include "opto/memnode.hpp"
stefank@2314 49 #include "opto/mulnode.hpp"
stefank@2314 50 #include "opto/node.hpp"
stefank@2314 51 #include "opto/opcodes.hpp"
stefank@2314 52 #include "opto/output.hpp"
stefank@2314 53 #include "opto/parse.hpp"
stefank@2314 54 #include "opto/phaseX.hpp"
stefank@2314 55 #include "opto/rootnode.hpp"
stefank@2314 56 #include "opto/runtime.hpp"
stefank@2314 57 #include "opto/stringopts.hpp"
stefank@2314 58 #include "opto/type.hpp"
stefank@2314 59 #include "opto/vectornode.hpp"
stefank@2314 60 #include "runtime/arguments.hpp"
stefank@2314 61 #include "runtime/signature.hpp"
stefank@2314 62 #include "runtime/stubRoutines.hpp"
stefank@2314 63 #include "runtime/timer.hpp"
stefank@2314 64 #include "utilities/copy.hpp"
stefank@2314 65 #ifdef TARGET_ARCH_MODEL_x86_32
stefank@2314 66 # include "adfiles/ad_x86_32.hpp"
stefank@2314 67 #endif
stefank@2314 68 #ifdef TARGET_ARCH_MODEL_x86_64
stefank@2314 69 # include "adfiles/ad_x86_64.hpp"
stefank@2314 70 #endif
stefank@2314 71 #ifdef TARGET_ARCH_MODEL_sparc
stefank@2314 72 # include "adfiles/ad_sparc.hpp"
stefank@2314 73 #endif
stefank@2314 74 #ifdef TARGET_ARCH_MODEL_zero
stefank@2314 75 # include "adfiles/ad_zero.hpp"
stefank@2314 76 #endif
bobv@2508 77 #ifdef TARGET_ARCH_MODEL_arm
bobv@2508 78 # include "adfiles/ad_arm.hpp"
bobv@2508 79 #endif
bobv@2508 80 #ifdef TARGET_ARCH_MODEL_ppc
bobv@2508 81 # include "adfiles/ad_ppc.hpp"
bobv@2508 82 #endif
duke@435 83
twisti@2350 84
twisti@2350 85 // -------------------- Compile::mach_constant_base_node -----------------------
twisti@2350 86 // Constant table base node singleton.
twisti@2350 87 MachConstantBaseNode* Compile::mach_constant_base_node() {
twisti@2350 88 if (_mach_constant_base_node == NULL) {
twisti@2350 89 _mach_constant_base_node = new (C) MachConstantBaseNode();
twisti@2350 90 _mach_constant_base_node->add_req(C->root());
twisti@2350 91 }
twisti@2350 92 return _mach_constant_base_node;
twisti@2350 93 }
twisti@2350 94
twisti@2350 95
duke@435 96 /// Support for intrinsics.
duke@435 97
duke@435 98 // Return the index at which m must be inserted (or already exists).
duke@435 99 // The sort order is by the address of the ciMethod, with is_virtual as minor key.
duke@435 100 int Compile::intrinsic_insertion_index(ciMethod* m, bool is_virtual) {
duke@435 101 #ifdef ASSERT
duke@435 102 for (int i = 1; i < _intrinsics->length(); i++) {
duke@435 103 CallGenerator* cg1 = _intrinsics->at(i-1);
duke@435 104 CallGenerator* cg2 = _intrinsics->at(i);
duke@435 105 assert(cg1->method() != cg2->method()
duke@435 106 ? cg1->method() < cg2->method()
duke@435 107 : cg1->is_virtual() < cg2->is_virtual(),
duke@435 108 "compiler intrinsics list must stay sorted");
duke@435 109 }
duke@435 110 #endif
duke@435 111 // Binary search sorted list, in decreasing intervals [lo, hi].
duke@435 112 int lo = 0, hi = _intrinsics->length()-1;
duke@435 113 while (lo <= hi) {
duke@435 114 int mid = (uint)(hi + lo) / 2;
duke@435 115 ciMethod* mid_m = _intrinsics->at(mid)->method();
duke@435 116 if (m < mid_m) {
duke@435 117 hi = mid-1;
duke@435 118 } else if (m > mid_m) {
duke@435 119 lo = mid+1;
duke@435 120 } else {
duke@435 121 // look at minor sort key
duke@435 122 bool mid_virt = _intrinsics->at(mid)->is_virtual();
duke@435 123 if (is_virtual < mid_virt) {
duke@435 124 hi = mid-1;
duke@435 125 } else if (is_virtual > mid_virt) {
duke@435 126 lo = mid+1;
duke@435 127 } else {
duke@435 128 return mid; // exact match
duke@435 129 }
duke@435 130 }
duke@435 131 }
duke@435 132 return lo; // inexact match
duke@435 133 }
duke@435 134
duke@435 135 void Compile::register_intrinsic(CallGenerator* cg) {
duke@435 136 if (_intrinsics == NULL) {
duke@435 137 _intrinsics = new GrowableArray<CallGenerator*>(60);
duke@435 138 }
duke@435 139 // This code is stolen from ciObjectFactory::insert.
duke@435 140 // Really, GrowableArray should have methods for
duke@435 141 // insert_at, remove_at, and binary_search.
duke@435 142 int len = _intrinsics->length();
duke@435 143 int index = intrinsic_insertion_index(cg->method(), cg->is_virtual());
duke@435 144 if (index == len) {
duke@435 145 _intrinsics->append(cg);
duke@435 146 } else {
duke@435 147 #ifdef ASSERT
duke@435 148 CallGenerator* oldcg = _intrinsics->at(index);
duke@435 149 assert(oldcg->method() != cg->method() || oldcg->is_virtual() != cg->is_virtual(), "don't register twice");
duke@435 150 #endif
duke@435 151 _intrinsics->append(_intrinsics->at(len-1));
duke@435 152 int pos;
duke@435 153 for (pos = len-2; pos >= index; pos--) {
duke@435 154 _intrinsics->at_put(pos+1,_intrinsics->at(pos));
duke@435 155 }
duke@435 156 _intrinsics->at_put(index, cg);
duke@435 157 }
duke@435 158 assert(find_intrinsic(cg->method(), cg->is_virtual()) == cg, "registration worked");
duke@435 159 }
duke@435 160
duke@435 161 CallGenerator* Compile::find_intrinsic(ciMethod* m, bool is_virtual) {
duke@435 162 assert(m->is_loaded(), "don't try this on unloaded methods");
duke@435 163 if (_intrinsics != NULL) {
duke@435 164 int index = intrinsic_insertion_index(m, is_virtual);
duke@435 165 if (index < _intrinsics->length()
duke@435 166 && _intrinsics->at(index)->method() == m
duke@435 167 && _intrinsics->at(index)->is_virtual() == is_virtual) {
duke@435 168 return _intrinsics->at(index);
duke@435 169 }
duke@435 170 }
duke@435 171 // Lazily create intrinsics for intrinsic IDs well-known in the runtime.
jrose@1291 172 if (m->intrinsic_id() != vmIntrinsics::_none &&
jrose@1291 173 m->intrinsic_id() <= vmIntrinsics::LAST_COMPILER_INLINE) {
duke@435 174 CallGenerator* cg = make_vm_intrinsic(m, is_virtual);
duke@435 175 if (cg != NULL) {
duke@435 176 // Save it for next time:
duke@435 177 register_intrinsic(cg);
duke@435 178 return cg;
duke@435 179 } else {
duke@435 180 gather_intrinsic_statistics(m->intrinsic_id(), is_virtual, _intrinsic_disabled);
duke@435 181 }
duke@435 182 }
duke@435 183 return NULL;
duke@435 184 }
duke@435 185
duke@435 186 // Compile:: register_library_intrinsics and make_vm_intrinsic are defined
duke@435 187 // in library_call.cpp.
duke@435 188
duke@435 189
duke@435 190 #ifndef PRODUCT
duke@435 191 // statistics gathering...
duke@435 192
duke@435 193 juint Compile::_intrinsic_hist_count[vmIntrinsics::ID_LIMIT] = {0};
duke@435 194 jubyte Compile::_intrinsic_hist_flags[vmIntrinsics::ID_LIMIT] = {0};
duke@435 195
duke@435 196 bool Compile::gather_intrinsic_statistics(vmIntrinsics::ID id, bool is_virtual, int flags) {
duke@435 197 assert(id > vmIntrinsics::_none && id < vmIntrinsics::ID_LIMIT, "oob");
duke@435 198 int oflags = _intrinsic_hist_flags[id];
duke@435 199 assert(flags != 0, "what happened?");
duke@435 200 if (is_virtual) {
duke@435 201 flags |= _intrinsic_virtual;
duke@435 202 }
duke@435 203 bool changed = (flags != oflags);
duke@435 204 if ((flags & _intrinsic_worked) != 0) {
duke@435 205 juint count = (_intrinsic_hist_count[id] += 1);
duke@435 206 if (count == 1) {
duke@435 207 changed = true; // first time
duke@435 208 }
duke@435 209 // increment the overall count also:
duke@435 210 _intrinsic_hist_count[vmIntrinsics::_none] += 1;
duke@435 211 }
duke@435 212 if (changed) {
duke@435 213 if (((oflags ^ flags) & _intrinsic_virtual) != 0) {
duke@435 214 // Something changed about the intrinsic's virtuality.
duke@435 215 if ((flags & _intrinsic_virtual) != 0) {
duke@435 216 // This is the first use of this intrinsic as a virtual call.
duke@435 217 if (oflags != 0) {
duke@435 218 // We already saw it as a non-virtual, so note both cases.
duke@435 219 flags |= _intrinsic_both;
duke@435 220 }
duke@435 221 } else if ((oflags & _intrinsic_both) == 0) {
duke@435 222 // This is the first use of this intrinsic as a non-virtual
duke@435 223 flags |= _intrinsic_both;
duke@435 224 }
duke@435 225 }
duke@435 226 _intrinsic_hist_flags[id] = (jubyte) (oflags | flags);
duke@435 227 }
duke@435 228 // update the overall flags also:
duke@435 229 _intrinsic_hist_flags[vmIntrinsics::_none] |= (jubyte) flags;
duke@435 230 return changed;
duke@435 231 }
duke@435 232
duke@435 233 static char* format_flags(int flags, char* buf) {
duke@435 234 buf[0] = 0;
duke@435 235 if ((flags & Compile::_intrinsic_worked) != 0) strcat(buf, ",worked");
duke@435 236 if ((flags & Compile::_intrinsic_failed) != 0) strcat(buf, ",failed");
duke@435 237 if ((flags & Compile::_intrinsic_disabled) != 0) strcat(buf, ",disabled");
duke@435 238 if ((flags & Compile::_intrinsic_virtual) != 0) strcat(buf, ",virtual");
duke@435 239 if ((flags & Compile::_intrinsic_both) != 0) strcat(buf, ",nonvirtual");
duke@435 240 if (buf[0] == 0) strcat(buf, ",");
duke@435 241 assert(buf[0] == ',', "must be");
duke@435 242 return &buf[1];
duke@435 243 }
duke@435 244
duke@435 245 void Compile::print_intrinsic_statistics() {
duke@435 246 char flagsbuf[100];
duke@435 247 ttyLocker ttyl;
duke@435 248 if (xtty != NULL) xtty->head("statistics type='intrinsic'");
duke@435 249 tty->print_cr("Compiler intrinsic usage:");
duke@435 250 juint total = _intrinsic_hist_count[vmIntrinsics::_none];
duke@435 251 if (total == 0) total = 1; // avoid div0 in case of no successes
duke@435 252 #define PRINT_STAT_LINE(name, c, f) \
duke@435 253 tty->print_cr(" %4d (%4.1f%%) %s (%s)", (int)(c), ((c) * 100.0) / total, name, f);
duke@435 254 for (int index = 1 + (int)vmIntrinsics::_none; index < (int)vmIntrinsics::ID_LIMIT; index++) {
duke@435 255 vmIntrinsics::ID id = (vmIntrinsics::ID) index;
duke@435 256 int flags = _intrinsic_hist_flags[id];
duke@435 257 juint count = _intrinsic_hist_count[id];
duke@435 258 if ((flags | count) != 0) {
duke@435 259 PRINT_STAT_LINE(vmIntrinsics::name_at(id), count, format_flags(flags, flagsbuf));
duke@435 260 }
duke@435 261 }
duke@435 262 PRINT_STAT_LINE("total", total, format_flags(_intrinsic_hist_flags[vmIntrinsics::_none], flagsbuf));
duke@435 263 if (xtty != NULL) xtty->tail("statistics");
duke@435 264 }
duke@435 265
duke@435 266 void Compile::print_statistics() {
duke@435 267 { ttyLocker ttyl;
duke@435 268 if (xtty != NULL) xtty->head("statistics type='opto'");
duke@435 269 Parse::print_statistics();
duke@435 270 PhaseCCP::print_statistics();
duke@435 271 PhaseRegAlloc::print_statistics();
duke@435 272 Scheduling::print_statistics();
duke@435 273 PhasePeephole::print_statistics();
duke@435 274 PhaseIdealLoop::print_statistics();
duke@435 275 if (xtty != NULL) xtty->tail("statistics");
duke@435 276 }
duke@435 277 if (_intrinsic_hist_flags[vmIntrinsics::_none] != 0) {
duke@435 278 // put this under its own <statistics> element.
duke@435 279 print_intrinsic_statistics();
duke@435 280 }
duke@435 281 }
duke@435 282 #endif //PRODUCT
duke@435 283
duke@435 284 // Support for bundling info
duke@435 285 Bundle* Compile::node_bundling(const Node *n) {
duke@435 286 assert(valid_bundle_info(n), "oob");
duke@435 287 return &_node_bundling_base[n->_idx];
duke@435 288 }
duke@435 289
duke@435 290 bool Compile::valid_bundle_info(const Node *n) {
duke@435 291 return (_node_bundling_limit > n->_idx);
duke@435 292 }
duke@435 293
duke@435 294
never@1515 295 void Compile::gvn_replace_by(Node* n, Node* nn) {
never@1515 296 for (DUIterator_Last imin, i = n->last_outs(imin); i >= imin; ) {
never@1515 297 Node* use = n->last_out(i);
never@1515 298 bool is_in_table = initial_gvn()->hash_delete(use);
never@1515 299 uint uses_found = 0;
never@1515 300 for (uint j = 0; j < use->len(); j++) {
never@1515 301 if (use->in(j) == n) {
never@1515 302 if (j < use->req())
never@1515 303 use->set_req(j, nn);
never@1515 304 else
never@1515 305 use->set_prec(j, nn);
never@1515 306 uses_found++;
never@1515 307 }
never@1515 308 }
never@1515 309 if (is_in_table) {
never@1515 310 // reinsert into table
never@1515 311 initial_gvn()->hash_find_insert(use);
never@1515 312 }
never@1515 313 record_for_igvn(use);
never@1515 314 i -= uses_found; // we deleted 1 or more copies of this edge
never@1515 315 }
never@1515 316 }
never@1515 317
never@1515 318
never@1515 319
never@1515 320
duke@435 321 // Identify all nodes that are reachable from below, useful.
duke@435 322 // Use breadth-first pass that records state in a Unique_Node_List,
duke@435 323 // recursive traversal is slower.
duke@435 324 void Compile::identify_useful_nodes(Unique_Node_List &useful) {
duke@435 325 int estimated_worklist_size = unique();
duke@435 326 useful.map( estimated_worklist_size, NULL ); // preallocate space
duke@435 327
duke@435 328 // Initialize worklist
duke@435 329 if (root() != NULL) { useful.push(root()); }
duke@435 330 // If 'top' is cached, declare it useful to preserve cached node
duke@435 331 if( cached_top_node() ) { useful.push(cached_top_node()); }
duke@435 332
duke@435 333 // Push all useful nodes onto the list, breadthfirst
duke@435 334 for( uint next = 0; next < useful.size(); ++next ) {
duke@435 335 assert( next < unique(), "Unique useful nodes < total nodes");
duke@435 336 Node *n = useful.at(next);
duke@435 337 uint max = n->len();
duke@435 338 for( uint i = 0; i < max; ++i ) {
duke@435 339 Node *m = n->in(i);
duke@435 340 if( m == NULL ) continue;
duke@435 341 useful.push(m);
duke@435 342 }
duke@435 343 }
duke@435 344 }
duke@435 345
duke@435 346 // Disconnect all useless nodes by disconnecting those at the boundary.
duke@435 347 void Compile::remove_useless_nodes(Unique_Node_List &useful) {
duke@435 348 uint next = 0;
duke@435 349 while( next < useful.size() ) {
duke@435 350 Node *n = useful.at(next++);
duke@435 351 // Use raw traversal of out edges since this code removes out edges
duke@435 352 int max = n->outcnt();
duke@435 353 for (int j = 0; j < max; ++j ) {
duke@435 354 Node* child = n->raw_out(j);
duke@435 355 if( ! useful.member(child) ) {
duke@435 356 assert( !child->is_top() || child != top(),
duke@435 357 "If top is cached in Compile object it is in useful list");
duke@435 358 // Only need to remove this out-edge to the useless node
duke@435 359 n->raw_del_out(j);
duke@435 360 --j;
duke@435 361 --max;
duke@435 362 }
duke@435 363 }
duke@435 364 if (n->outcnt() == 1 && n->has_special_unique_user()) {
duke@435 365 record_for_igvn( n->unique_out() );
duke@435 366 }
duke@435 367 }
duke@435 368 debug_only(verify_graph_edges(true/*check for no_dead_code*/);)
duke@435 369 }
duke@435 370
duke@435 371 //------------------------------frame_size_in_words-----------------------------
duke@435 372 // frame_slots in units of words
duke@435 373 int Compile::frame_size_in_words() const {
duke@435 374 // shift is 0 in LP32 and 1 in LP64
duke@435 375 const int shift = (LogBytesPerWord - LogBytesPerInt);
duke@435 376 int words = _frame_slots >> shift;
duke@435 377 assert( words << shift == _frame_slots, "frame size must be properly aligned in LP64" );
duke@435 378 return words;
duke@435 379 }
duke@435 380
duke@435 381 // ============================================================================
duke@435 382 //------------------------------CompileWrapper---------------------------------
duke@435 383 class CompileWrapper : public StackObj {
duke@435 384 Compile *const _compile;
duke@435 385 public:
duke@435 386 CompileWrapper(Compile* compile);
duke@435 387
duke@435 388 ~CompileWrapper();
duke@435 389 };
duke@435 390
duke@435 391 CompileWrapper::CompileWrapper(Compile* compile) : _compile(compile) {
duke@435 392 // the Compile* pointer is stored in the current ciEnv:
duke@435 393 ciEnv* env = compile->env();
duke@435 394 assert(env == ciEnv::current(), "must already be a ciEnv active");
duke@435 395 assert(env->compiler_data() == NULL, "compile already active?");
duke@435 396 env->set_compiler_data(compile);
duke@435 397 assert(compile == Compile::current(), "sanity");
duke@435 398
duke@435 399 compile->set_type_dict(NULL);
duke@435 400 compile->set_type_hwm(NULL);
duke@435 401 compile->set_type_last_size(0);
duke@435 402 compile->set_last_tf(NULL, NULL);
duke@435 403 compile->set_indexSet_arena(NULL);
duke@435 404 compile->set_indexSet_free_block_list(NULL);
duke@435 405 compile->init_type_arena();
duke@435 406 Type::Initialize(compile);
duke@435 407 _compile->set_scratch_buffer_blob(NULL);
duke@435 408 _compile->begin_method();
duke@435 409 }
duke@435 410 CompileWrapper::~CompileWrapper() {
duke@435 411 _compile->end_method();
duke@435 412 if (_compile->scratch_buffer_blob() != NULL)
duke@435 413 BufferBlob::free(_compile->scratch_buffer_blob());
duke@435 414 _compile->env()->set_compiler_data(NULL);
duke@435 415 }
duke@435 416
duke@435 417
duke@435 418 //----------------------------print_compile_messages---------------------------
duke@435 419 void Compile::print_compile_messages() {
duke@435 420 #ifndef PRODUCT
duke@435 421 // Check if recompiling
duke@435 422 if (_subsume_loads == false && PrintOpto) {
duke@435 423 // Recompiling without allowing machine instructions to subsume loads
duke@435 424 tty->print_cr("*********************************************************");
duke@435 425 tty->print_cr("** Bailout: Recompile without subsuming loads **");
duke@435 426 tty->print_cr("*********************************************************");
duke@435 427 }
kvn@473 428 if (_do_escape_analysis != DoEscapeAnalysis && PrintOpto) {
kvn@473 429 // Recompiling without escape analysis
kvn@473 430 tty->print_cr("*********************************************************");
kvn@473 431 tty->print_cr("** Bailout: Recompile without escape analysis **");
kvn@473 432 tty->print_cr("*********************************************************");
kvn@473 433 }
duke@435 434 if (env()->break_at_compile()) {
twisti@1040 435 // Open the debugger when compiling this method.
duke@435 436 tty->print("### Breaking when compiling: ");
duke@435 437 method()->print_short_name();
duke@435 438 tty->cr();
duke@435 439 BREAKPOINT;
duke@435 440 }
duke@435 441
duke@435 442 if( PrintOpto ) {
duke@435 443 if (is_osr_compilation()) {
duke@435 444 tty->print("[OSR]%3d", _compile_id);
duke@435 445 } else {
duke@435 446 tty->print("%3d", _compile_id);
duke@435 447 }
duke@435 448 }
duke@435 449 #endif
duke@435 450 }
duke@435 451
duke@435 452
kvn@2414 453 //-----------------------init_scratch_buffer_blob------------------------------
kvn@2414 454 // Construct a temporary BufferBlob and cache it for this compile.
twisti@2350 455 void Compile::init_scratch_buffer_blob(int const_size) {
kvn@2414 456 // If there is already a scratch buffer blob allocated and the
kvn@2414 457 // constant section is big enough, use it. Otherwise free the
kvn@2414 458 // current and allocate a new one.
kvn@2414 459 BufferBlob* blob = scratch_buffer_blob();
kvn@2414 460 if ((blob != NULL) && (const_size <= _scratch_const_size)) {
kvn@2414 461 // Use the current blob.
kvn@2414 462 } else {
kvn@2414 463 if (blob != NULL) {
kvn@2414 464 BufferBlob::free(blob);
kvn@2414 465 }
duke@435 466
kvn@2414 467 ResourceMark rm;
kvn@2414 468 _scratch_const_size = const_size;
kvn@2414 469 int size = (MAX_inst_size + MAX_stubs_size + _scratch_const_size);
kvn@2414 470 blob = BufferBlob::create("Compile::scratch_buffer", size);
kvn@2414 471 // Record the buffer blob for next time.
kvn@2414 472 set_scratch_buffer_blob(blob);
kvn@2414 473 // Have we run out of code space?
kvn@2414 474 if (scratch_buffer_blob() == NULL) {
kvn@2414 475 // Let CompilerBroker disable further compilations.
kvn@2414 476 record_failure("Not enough space for scratch buffer in CodeCache");
kvn@2414 477 return;
kvn@2414 478 }
kvn@598 479 }
duke@435 480
duke@435 481 // Initialize the relocation buffers
twisti@2103 482 relocInfo* locs_buf = (relocInfo*) blob->content_end() - MAX_locs_size;
duke@435 483 set_scratch_locs_memory(locs_buf);
duke@435 484 }
duke@435 485
duke@435 486
duke@435 487 //-----------------------scratch_emit_size-------------------------------------
duke@435 488 // Helper function that computes size by emitting code
duke@435 489 uint Compile::scratch_emit_size(const Node* n) {
twisti@2350 490 // Start scratch_emit_size section.
twisti@2350 491 set_in_scratch_emit_size(true);
twisti@2350 492
duke@435 493 // Emit into a trash buffer and count bytes emitted.
duke@435 494 // This is a pretty expensive way to compute a size,
duke@435 495 // but it works well enough if seldom used.
duke@435 496 // All common fixed-size instructions are given a size
duke@435 497 // method by the AD file.
duke@435 498 // Note that the scratch buffer blob and locs memory are
duke@435 499 // allocated at the beginning of the compile task, and
duke@435 500 // may be shared by several calls to scratch_emit_size.
duke@435 501 // The allocation of the scratch buffer blob is particularly
duke@435 502 // expensive, since it has to grab the code cache lock.
duke@435 503 BufferBlob* blob = this->scratch_buffer_blob();
duke@435 504 assert(blob != NULL, "Initialize BufferBlob at start");
duke@435 505 assert(blob->size() > MAX_inst_size, "sanity");
duke@435 506 relocInfo* locs_buf = scratch_locs_memory();
twisti@2103 507 address blob_begin = blob->content_begin();
duke@435 508 address blob_end = (address)locs_buf;
twisti@2103 509 assert(blob->content_contains(blob_end), "sanity");
duke@435 510 CodeBuffer buf(blob_begin, blob_end - blob_begin);
twisti@2350 511 buf.initialize_consts_size(_scratch_const_size);
duke@435 512 buf.initialize_stubs_size(MAX_stubs_size);
duke@435 513 assert(locs_buf != NULL, "sanity");
twisti@2350 514 int lsize = MAX_locs_size / 3;
twisti@2350 515 buf.consts()->initialize_shared_locs(&locs_buf[lsize * 0], lsize);
twisti@2350 516 buf.insts()->initialize_shared_locs( &locs_buf[lsize * 1], lsize);
twisti@2350 517 buf.stubs()->initialize_shared_locs( &locs_buf[lsize * 2], lsize);
twisti@2350 518
twisti@2350 519 // Do the emission.
duke@435 520 n->emit(buf, this->regalloc());
twisti@2350 521
twisti@2350 522 // End scratch_emit_size section.
twisti@2350 523 set_in_scratch_emit_size(false);
twisti@2350 524
twisti@2103 525 return buf.insts_size();
duke@435 526 }
duke@435 527
duke@435 528
duke@435 529 // ============================================================================
duke@435 530 //------------------------------Compile standard-------------------------------
duke@435 531 debug_only( int Compile::_debug_idx = 100000; )
duke@435 532
duke@435 533 // Compile a method. entry_bci is -1 for normal compilations and indicates
duke@435 534 // the continuation bci for on stack replacement.
duke@435 535
duke@435 536
kvn@473 537 Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr_bci, bool subsume_loads, bool do_escape_analysis )
duke@435 538 : Phase(Compiler),
duke@435 539 _env(ci_env),
duke@435 540 _log(ci_env->log()),
duke@435 541 _compile_id(ci_env->compile_id()),
duke@435 542 _save_argument_registers(false),
duke@435 543 _stub_name(NULL),
duke@435 544 _stub_function(NULL),
duke@435 545 _stub_entry_point(NULL),
duke@435 546 _method(target),
duke@435 547 _entry_bci(osr_bci),
duke@435 548 _initial_gvn(NULL),
duke@435 549 _for_igvn(NULL),
duke@435 550 _warm_calls(NULL),
duke@435 551 _subsume_loads(subsume_loads),
kvn@473 552 _do_escape_analysis(do_escape_analysis),
duke@435 553 _failure_reason(NULL),
duke@435 554 _code_buffer("Compile::Fill_buffer"),
duke@435 555 _orig_pc_slot(0),
duke@435 556 _orig_pc_slot_offset_in_bytes(0),
twisti@1700 557 _has_method_handle_invokes(false),
twisti@2350 558 _mach_constant_base_node(NULL),
duke@435 559 _node_bundling_limit(0),
duke@435 560 _node_bundling_base(NULL),
kvn@1294 561 _java_calls(0),
kvn@1294 562 _inner_loops(0),
twisti@2350 563 _scratch_const_size(-1),
twisti@2350 564 _in_scratch_emit_size(false),
duke@435 565 #ifndef PRODUCT
duke@435 566 _trace_opto_output(TraceOptoOutput || method()->has_option("TraceOptoOutput")),
duke@435 567 _printer(IdealGraphPrinter::printer()),
duke@435 568 #endif
duke@435 569 _congraph(NULL) {
duke@435 570 C = this;
duke@435 571
duke@435 572 CompileWrapper cw(this);
duke@435 573 #ifndef PRODUCT
duke@435 574 if (TimeCompiler2) {
duke@435 575 tty->print(" ");
duke@435 576 target->holder()->name()->print();
duke@435 577 tty->print(".");
duke@435 578 target->print_short_name();
duke@435 579 tty->print(" ");
duke@435 580 }
duke@435 581 TraceTime t1("Total compilation time", &_t_totalCompilation, TimeCompiler, TimeCompiler2);
duke@435 582 TraceTime t2(NULL, &_t_methodCompilation, TimeCompiler, false);
jrose@535 583 bool print_opto_assembly = PrintOptoAssembly || _method->has_option("PrintOptoAssembly");
jrose@535 584 if (!print_opto_assembly) {
jrose@535 585 bool print_assembly = (PrintAssembly || _method->should_print_assembly());
jrose@535 586 if (print_assembly && !Disassembler::can_decode()) {
jrose@535 587 tty->print_cr("PrintAssembly request changed to PrintOptoAssembly");
jrose@535 588 print_opto_assembly = true;
jrose@535 589 }
jrose@535 590 }
jrose@535 591 set_print_assembly(print_opto_assembly);
never@802 592 set_parsed_irreducible_loop(false);
duke@435 593 #endif
duke@435 594
duke@435 595 if (ProfileTraps) {
duke@435 596 // Make sure the method being compiled gets its own MDO,
duke@435 597 // so we can at least track the decompile_count().
iveresov@2349 598 method()->ensure_method_data();
duke@435 599 }
duke@435 600
duke@435 601 Init(::AliasLevel);
duke@435 602
duke@435 603
duke@435 604 print_compile_messages();
duke@435 605
duke@435 606 if (UseOldInlining || PrintCompilation NOT_PRODUCT( || PrintOpto) )
duke@435 607 _ilt = InlineTree::build_inline_tree_root();
duke@435 608 else
duke@435 609 _ilt = NULL;
duke@435 610
duke@435 611 // Even if NO memory addresses are used, MergeMem nodes must have at least 1 slice
duke@435 612 assert(num_alias_types() >= AliasIdxRaw, "");
duke@435 613
duke@435 614 #define MINIMUM_NODE_HASH 1023
duke@435 615 // Node list that Iterative GVN will start with
duke@435 616 Unique_Node_List for_igvn(comp_arena());
duke@435 617 set_for_igvn(&for_igvn);
duke@435 618
duke@435 619 // GVN that will be run immediately on new nodes
duke@435 620 uint estimated_size = method()->code_size()*4+64;
duke@435 621 estimated_size = (estimated_size < MINIMUM_NODE_HASH ? MINIMUM_NODE_HASH : estimated_size);
duke@435 622 PhaseGVN gvn(node_arena(), estimated_size);
duke@435 623 set_initial_gvn(&gvn);
duke@435 624
duke@435 625 { // Scope for timing the parser
duke@435 626 TracePhase t3("parse", &_t_parser, true);
duke@435 627
duke@435 628 // Put top into the hash table ASAP.
duke@435 629 initial_gvn()->transform_no_reclaim(top());
duke@435 630
duke@435 631 // Set up tf(), start(), and find a CallGenerator.
johnc@2781 632 CallGenerator* cg = NULL;
duke@435 633 if (is_osr_compilation()) {
duke@435 634 const TypeTuple *domain = StartOSRNode::osr_domain();
duke@435 635 const TypeTuple *range = TypeTuple::make_range(method()->signature());
duke@435 636 init_tf(TypeFunc::make(domain, range));
duke@435 637 StartNode* s = new (this, 2) StartOSRNode(root(), domain);
duke@435 638 initial_gvn()->set_type_bottom(s);
duke@435 639 init_start(s);
duke@435 640 cg = CallGenerator::for_osr(method(), entry_bci());
duke@435 641 } else {
duke@435 642 // Normal case.
duke@435 643 init_tf(TypeFunc::make(method()));
duke@435 644 StartNode* s = new (this, 2) StartNode(root(), tf()->domain());
duke@435 645 initial_gvn()->set_type_bottom(s);
duke@435 646 init_start(s);
johnc@2781 647 if (method()->intrinsic_id() == vmIntrinsics::_Reference_get && UseG1GC) {
johnc@2781 648 // With java.lang.ref.reference.get() we must go through the
johnc@2781 649 // intrinsic when G1 is enabled - even when get() is the root
johnc@2781 650 // method of the compile - so that, if necessary, the value in
johnc@2781 651 // the referent field of the reference object gets recorded by
johnc@2781 652 // the pre-barrier code.
johnc@2781 653 // Specifically, if G1 is enabled, the value in the referent
johnc@2781 654 // field is recorded by the G1 SATB pre barrier. This will
johnc@2781 655 // result in the referent being marked live and the reference
johnc@2781 656 // object removed from the list of discovered references during
johnc@2781 657 // reference processing.
johnc@2781 658 cg = find_intrinsic(method(), false);
johnc@2781 659 }
johnc@2781 660 if (cg == NULL) {
johnc@2781 661 float past_uses = method()->interpreter_invocation_count();
johnc@2781 662 float expected_uses = past_uses;
johnc@2781 663 cg = CallGenerator::for_inline(method(), expected_uses);
johnc@2781 664 }
duke@435 665 }
duke@435 666 if (failing()) return;
duke@435 667 if (cg == NULL) {
duke@435 668 record_method_not_compilable_all_tiers("cannot parse method");
duke@435 669 return;
duke@435 670 }
duke@435 671 JVMState* jvms = build_start_state(start(), tf());
duke@435 672 if ((jvms = cg->generate(jvms)) == NULL) {
duke@435 673 record_method_not_compilable("method parse failed");
duke@435 674 return;
duke@435 675 }
duke@435 676 GraphKit kit(jvms);
duke@435 677
duke@435 678 if (!kit.stopped()) {
duke@435 679 // Accept return values, and transfer control we know not where.
duke@435 680 // This is done by a special, unique ReturnNode bound to root.
duke@435 681 return_values(kit.jvms());
duke@435 682 }
duke@435 683
duke@435 684 if (kit.has_exceptions()) {
duke@435 685 // Any exceptions that escape from this call must be rethrown
duke@435 686 // to whatever caller is dynamically above us on the stack.
duke@435 687 // This is done by a special, unique RethrowNode bound to root.
duke@435 688 rethrow_exceptions(kit.transfer_exceptions_into_jvms());
duke@435 689 }
duke@435 690
never@1515 691 if (!failing() && has_stringbuilder()) {
never@1515 692 {
never@1515 693 // remove useless nodes to make the usage analysis simpler
never@1515 694 ResourceMark rm;
never@1515 695 PhaseRemoveUseless pru(initial_gvn(), &for_igvn);
never@1515 696 }
never@1515 697
never@1515 698 {
never@1515 699 ResourceMark rm;
never@1515 700 print_method("Before StringOpts", 3);
never@1515 701 PhaseStringOpts pso(initial_gvn(), &for_igvn);
never@1515 702 print_method("After StringOpts", 3);
never@1515 703 }
never@1515 704
never@1515 705 // now inline anything that we skipped the first time around
never@1515 706 while (_late_inlines.length() > 0) {
never@1515 707 CallGenerator* cg = _late_inlines.pop();
never@1515 708 cg->do_late_inline();
never@1515 709 }
never@1515 710 }
never@1515 711 assert(_late_inlines.length() == 0, "should have been processed");
never@1515 712
never@852 713 print_method("Before RemoveUseless", 3);
never@802 714
duke@435 715 // Remove clutter produced by parsing.
duke@435 716 if (!failing()) {
duke@435 717 ResourceMark rm;
duke@435 718 PhaseRemoveUseless pru(initial_gvn(), &for_igvn);
duke@435 719 }
duke@435 720 }
duke@435 721
duke@435 722 // Note: Large methods are capped off in do_one_bytecode().
duke@435 723 if (failing()) return;
duke@435 724
duke@435 725 // After parsing, node notes are no longer automagic.
duke@435 726 // They must be propagated by register_new_node_with_optimizer(),
duke@435 727 // clone(), or the like.
duke@435 728 set_default_node_notes(NULL);
duke@435 729
duke@435 730 for (;;) {
duke@435 731 int successes = Inline_Warm();
duke@435 732 if (failing()) return;
duke@435 733 if (successes == 0) break;
duke@435 734 }
duke@435 735
duke@435 736 // Drain the list.
duke@435 737 Finish_Warm();
duke@435 738 #ifndef PRODUCT
duke@435 739 if (_printer) {
duke@435 740 _printer->print_inlining(this);
duke@435 741 }
duke@435 742 #endif
duke@435 743
duke@435 744 if (failing()) return;
duke@435 745 NOT_PRODUCT( verify_graph_edges(); )
duke@435 746
duke@435 747 // Now optimize
duke@435 748 Optimize();
duke@435 749 if (failing()) return;
duke@435 750 NOT_PRODUCT( verify_graph_edges(); )
duke@435 751
duke@435 752 #ifndef PRODUCT
duke@435 753 if (PrintIdeal) {
duke@435 754 ttyLocker ttyl; // keep the following output all in one block
duke@435 755 // This output goes directly to the tty, not the compiler log.
duke@435 756 // To enable tools to match it up with the compilation activity,
duke@435 757 // be sure to tag this tty output with the compile ID.
duke@435 758 if (xtty != NULL) {
duke@435 759 xtty->head("ideal compile_id='%d'%s", compile_id(),
duke@435 760 is_osr_compilation() ? " compile_kind='osr'" :
duke@435 761 "");
duke@435 762 }
duke@435 763 root()->dump(9999);
duke@435 764 if (xtty != NULL) {
duke@435 765 xtty->tail("ideal");
duke@435 766 }
duke@435 767 }
duke@435 768 #endif
duke@435 769
duke@435 770 // Now that we know the size of all the monitors we can add a fixed slot
duke@435 771 // for the original deopt pc.
duke@435 772
duke@435 773 _orig_pc_slot = fixed_slots();
duke@435 774 int next_slot = _orig_pc_slot + (sizeof(address) / VMRegImpl::stack_slot_size);
duke@435 775 set_fixed_slots(next_slot);
duke@435 776
duke@435 777 // Now generate code
duke@435 778 Code_Gen();
duke@435 779 if (failing()) return;
duke@435 780
duke@435 781 // Check if we want to skip execution of all compiled code.
duke@435 782 {
duke@435 783 #ifndef PRODUCT
duke@435 784 if (OptoNoExecute) {
duke@435 785 record_method_not_compilable("+OptoNoExecute"); // Flag as failed
duke@435 786 return;
duke@435 787 }
duke@435 788 TracePhase t2("install_code", &_t_registerMethod, TimeCompiler);
duke@435 789 #endif
duke@435 790
duke@435 791 if (is_osr_compilation()) {
duke@435 792 _code_offsets.set_value(CodeOffsets::Verified_Entry, 0);
duke@435 793 _code_offsets.set_value(CodeOffsets::OSR_Entry, _first_block_size);
duke@435 794 } else {
duke@435 795 _code_offsets.set_value(CodeOffsets::Verified_Entry, _first_block_size);
duke@435 796 _code_offsets.set_value(CodeOffsets::OSR_Entry, 0);
duke@435 797 }
duke@435 798
duke@435 799 env()->register_method(_method, _entry_bci,
duke@435 800 &_code_offsets,
duke@435 801 _orig_pc_slot_offset_in_bytes,
duke@435 802 code_buffer(),
duke@435 803 frame_size_in_words(), _oop_map_set,
duke@435 804 &_handler_table, &_inc_table,
duke@435 805 compiler,
duke@435 806 env()->comp_level(),
duke@435 807 true, /*has_debug_info*/
duke@435 808 has_unsafe_access()
duke@435 809 );
duke@435 810 }
duke@435 811 }
duke@435 812
duke@435 813 //------------------------------Compile----------------------------------------
duke@435 814 // Compile a runtime stub
duke@435 815 Compile::Compile( ciEnv* ci_env,
duke@435 816 TypeFunc_generator generator,
duke@435 817 address stub_function,
duke@435 818 const char *stub_name,
duke@435 819 int is_fancy_jump,
duke@435 820 bool pass_tls,
duke@435 821 bool save_arg_registers,
duke@435 822 bool return_pc )
duke@435 823 : Phase(Compiler),
duke@435 824 _env(ci_env),
duke@435 825 _log(ci_env->log()),
duke@435 826 _compile_id(-1),
duke@435 827 _save_argument_registers(save_arg_registers),
duke@435 828 _method(NULL),
duke@435 829 _stub_name(stub_name),
duke@435 830 _stub_function(stub_function),
duke@435 831 _stub_entry_point(NULL),
duke@435 832 _entry_bci(InvocationEntryBci),
duke@435 833 _initial_gvn(NULL),
duke@435 834 _for_igvn(NULL),
duke@435 835 _warm_calls(NULL),
duke@435 836 _orig_pc_slot(0),
duke@435 837 _orig_pc_slot_offset_in_bytes(0),
duke@435 838 _subsume_loads(true),
kvn@473 839 _do_escape_analysis(false),
duke@435 840 _failure_reason(NULL),
duke@435 841 _code_buffer("Compile::Fill_buffer"),
twisti@1700 842 _has_method_handle_invokes(false),
twisti@2350 843 _mach_constant_base_node(NULL),
duke@435 844 _node_bundling_limit(0),
duke@435 845 _node_bundling_base(NULL),
kvn@1294 846 _java_calls(0),
kvn@1294 847 _inner_loops(0),
duke@435 848 #ifndef PRODUCT
duke@435 849 _trace_opto_output(TraceOptoOutput),
duke@435 850 _printer(NULL),
duke@435 851 #endif
duke@435 852 _congraph(NULL) {
duke@435 853 C = this;
duke@435 854
duke@435 855 #ifndef PRODUCT
duke@435 856 TraceTime t1(NULL, &_t_totalCompilation, TimeCompiler, false);
duke@435 857 TraceTime t2(NULL, &_t_stubCompilation, TimeCompiler, false);
duke@435 858 set_print_assembly(PrintFrameConverterAssembly);
never@802 859 set_parsed_irreducible_loop(false);
duke@435 860 #endif
duke@435 861 CompileWrapper cw(this);
duke@435 862 Init(/*AliasLevel=*/ 0);
duke@435 863 init_tf((*generator)());
duke@435 864
duke@435 865 {
duke@435 866 // The following is a dummy for the sake of GraphKit::gen_stub
duke@435 867 Unique_Node_List for_igvn(comp_arena());
duke@435 868 set_for_igvn(&for_igvn); // not used, but some GraphKit guys push on this
duke@435 869 PhaseGVN gvn(Thread::current()->resource_area(),255);
duke@435 870 set_initial_gvn(&gvn); // not significant, but GraphKit guys use it pervasively
duke@435 871 gvn.transform_no_reclaim(top());
duke@435 872
duke@435 873 GraphKit kit;
duke@435 874 kit.gen_stub(stub_function, stub_name, is_fancy_jump, pass_tls, return_pc);
duke@435 875 }
duke@435 876
duke@435 877 NOT_PRODUCT( verify_graph_edges(); )
duke@435 878 Code_Gen();
duke@435 879 if (failing()) return;
duke@435 880
duke@435 881
duke@435 882 // Entry point will be accessed using compile->stub_entry_point();
duke@435 883 if (code_buffer() == NULL) {
duke@435 884 Matcher::soft_match_failure();
duke@435 885 } else {
duke@435 886 if (PrintAssembly && (WizardMode || Verbose))
duke@435 887 tty->print_cr("### Stub::%s", stub_name);
duke@435 888
duke@435 889 if (!failing()) {
duke@435 890 assert(_fixed_slots == 0, "no fixed slots used for runtime stubs");
duke@435 891
duke@435 892 // Make the NMethod
duke@435 893 // For now we mark the frame as never safe for profile stackwalking
duke@435 894 RuntimeStub *rs = RuntimeStub::new_runtime_stub(stub_name,
duke@435 895 code_buffer(),
duke@435 896 CodeOffsets::frame_never_safe,
duke@435 897 // _code_offsets.value(CodeOffsets::Frame_Complete),
duke@435 898 frame_size_in_words(),
duke@435 899 _oop_map_set,
duke@435 900 save_arg_registers);
duke@435 901 assert(rs != NULL && rs->is_runtime_stub(), "sanity check");
duke@435 902
duke@435 903 _stub_entry_point = rs->entry_point();
duke@435 904 }
duke@435 905 }
duke@435 906 }
duke@435 907
duke@435 908 #ifndef PRODUCT
duke@435 909 void print_opto_verbose_signature( const TypeFunc *j_sig, const char *stub_name ) {
duke@435 910 if(PrintOpto && Verbose) {
duke@435 911 tty->print("%s ", stub_name); j_sig->print_flattened(); tty->cr();
duke@435 912 }
duke@435 913 }
duke@435 914 #endif
duke@435 915
duke@435 916 void Compile::print_codes() {
duke@435 917 }
duke@435 918
duke@435 919 //------------------------------Init-------------------------------------------
duke@435 920 // Prepare for a single compilation
duke@435 921 void Compile::Init(int aliaslevel) {
duke@435 922 _unique = 0;
duke@435 923 _regalloc = NULL;
duke@435 924
duke@435 925 _tf = NULL; // filled in later
duke@435 926 _top = NULL; // cached later
duke@435 927 _matcher = NULL; // filled in later
duke@435 928 _cfg = NULL; // filled in later
duke@435 929
duke@435 930 set_24_bit_selection_and_mode(Use24BitFP, false);
duke@435 931
duke@435 932 _node_note_array = NULL;
duke@435 933 _default_node_notes = NULL;
duke@435 934
duke@435 935 _immutable_memory = NULL; // filled in at first inquiry
duke@435 936
duke@435 937 // Globally visible Nodes
duke@435 938 // First set TOP to NULL to give safe behavior during creation of RootNode
duke@435 939 set_cached_top_node(NULL);
duke@435 940 set_root(new (this, 3) RootNode());
duke@435 941 // Now that you have a Root to point to, create the real TOP
duke@435 942 set_cached_top_node( new (this, 1) ConNode(Type::TOP) );
duke@435 943 set_recent_alloc(NULL, NULL);
duke@435 944
duke@435 945 // Create Debug Information Recorder to record scopes, oopmaps, etc.
duke@435 946 env()->set_oop_recorder(new OopRecorder(comp_arena()));
duke@435 947 env()->set_debug_info(new DebugInformationRecorder(env()->oop_recorder()));
duke@435 948 env()->set_dependencies(new Dependencies(env()));
duke@435 949
duke@435 950 _fixed_slots = 0;
duke@435 951 set_has_split_ifs(false);
duke@435 952 set_has_loops(has_method() && method()->has_loops()); // first approximation
never@1515 953 set_has_stringbuilder(false);
duke@435 954 _trap_can_recompile = false; // no traps emitted yet
duke@435 955 _major_progress = true; // start out assuming good things will happen
duke@435 956 set_has_unsafe_access(false);
duke@435 957 Copy::zero_to_bytes(_trap_hist, sizeof(_trap_hist));
duke@435 958 set_decompile_count(0);
duke@435 959
rasbold@853 960 set_do_freq_based_layout(BlockLayoutByFrequency || method_has_option("BlockLayoutByFrequency"));
iveresov@2138 961 set_num_loop_opts(LoopOptsCount);
iveresov@2138 962 set_do_inlining(Inline);
iveresov@2138 963 set_max_inline_size(MaxInlineSize);
iveresov@2138 964 set_freq_inline_size(FreqInlineSize);
iveresov@2138 965 set_do_scheduling(OptoScheduling);
iveresov@2138 966 set_do_count_invocations(false);
iveresov@2138 967 set_do_method_data_update(false);
duke@435 968
duke@435 969 if (debug_info()->recording_non_safepoints()) {
duke@435 970 set_node_note_array(new(comp_arena()) GrowableArray<Node_Notes*>
duke@435 971 (comp_arena(), 8, 0, NULL));
duke@435 972 set_default_node_notes(Node_Notes::make(this));
duke@435 973 }
duke@435 974
duke@435 975 // // -- Initialize types before each compile --
duke@435 976 // // Update cached type information
duke@435 977 // if( _method && _method->constants() )
duke@435 978 // Type::update_loaded_types(_method, _method->constants());
duke@435 979
duke@435 980 // Init alias_type map.
kvn@473 981 if (!_do_escape_analysis && aliaslevel == 3)
duke@435 982 aliaslevel = 2; // No unique types without escape analysis
duke@435 983 _AliasLevel = aliaslevel;
duke@435 984 const int grow_ats = 16;
duke@435 985 _max_alias_types = grow_ats;
duke@435 986 _alias_types = NEW_ARENA_ARRAY(comp_arena(), AliasType*, grow_ats);
duke@435 987 AliasType* ats = NEW_ARENA_ARRAY(comp_arena(), AliasType, grow_ats);
duke@435 988 Copy::zero_to_bytes(ats, sizeof(AliasType)*grow_ats);
duke@435 989 {
duke@435 990 for (int i = 0; i < grow_ats; i++) _alias_types[i] = &ats[i];
duke@435 991 }
duke@435 992 // Initialize the first few types.
duke@435 993 _alias_types[AliasIdxTop]->Init(AliasIdxTop, NULL);
duke@435 994 _alias_types[AliasIdxBot]->Init(AliasIdxBot, TypePtr::BOTTOM);
duke@435 995 _alias_types[AliasIdxRaw]->Init(AliasIdxRaw, TypeRawPtr::BOTTOM);
duke@435 996 _num_alias_types = AliasIdxRaw+1;
duke@435 997 // Zero out the alias type cache.
duke@435 998 Copy::zero_to_bytes(_alias_cache, sizeof(_alias_cache));
duke@435 999 // A NULL adr_type hits in the cache right away. Preload the right answer.
duke@435 1000 probe_alias_cache(NULL)->_index = AliasIdxTop;
duke@435 1001
duke@435 1002 _intrinsics = NULL;
kvn@2040 1003 _macro_nodes = new(comp_arena()) GrowableArray<Node*>(comp_arena(), 8, 0, NULL);
kvn@2040 1004 _predicate_opaqs = new(comp_arena()) GrowableArray<Node*>(comp_arena(), 8, 0, NULL);
duke@435 1005 register_library_intrinsics();
duke@435 1006 }
duke@435 1007
duke@435 1008 //---------------------------init_start----------------------------------------
duke@435 1009 // Install the StartNode on this compile object.
duke@435 1010 void Compile::init_start(StartNode* s) {
duke@435 1011 if (failing())
duke@435 1012 return; // already failing
duke@435 1013 assert(s == start(), "");
duke@435 1014 }
duke@435 1015
duke@435 1016 StartNode* Compile::start() const {
duke@435 1017 assert(!failing(), "");
duke@435 1018 for (DUIterator_Fast imax, i = root()->fast_outs(imax); i < imax; i++) {
duke@435 1019 Node* start = root()->fast_out(i);
duke@435 1020 if( start->is_Start() )
duke@435 1021 return start->as_Start();
duke@435 1022 }
duke@435 1023 ShouldNotReachHere();
duke@435 1024 return NULL;
duke@435 1025 }
duke@435 1026
duke@435 1027 //-------------------------------immutable_memory-------------------------------------
duke@435 1028 // Access immutable memory
duke@435 1029 Node* Compile::immutable_memory() {
duke@435 1030 if (_immutable_memory != NULL) {
duke@435 1031 return _immutable_memory;
duke@435 1032 }
duke@435 1033 StartNode* s = start();
duke@435 1034 for (DUIterator_Fast imax, i = s->fast_outs(imax); true; i++) {
duke@435 1035 Node *p = s->fast_out(i);
duke@435 1036 if (p != s && p->as_Proj()->_con == TypeFunc::Memory) {
duke@435 1037 _immutable_memory = p;
duke@435 1038 return _immutable_memory;
duke@435 1039 }
duke@435 1040 }
duke@435 1041 ShouldNotReachHere();
duke@435 1042 return NULL;
duke@435 1043 }
duke@435 1044
duke@435 1045 //----------------------set_cached_top_node------------------------------------
duke@435 1046 // Install the cached top node, and make sure Node::is_top works correctly.
duke@435 1047 void Compile::set_cached_top_node(Node* tn) {
duke@435 1048 if (tn != NULL) verify_top(tn);
duke@435 1049 Node* old_top = _top;
duke@435 1050 _top = tn;
duke@435 1051 // Calling Node::setup_is_top allows the nodes the chance to adjust
duke@435 1052 // their _out arrays.
duke@435 1053 if (_top != NULL) _top->setup_is_top();
duke@435 1054 if (old_top != NULL) old_top->setup_is_top();
duke@435 1055 assert(_top == NULL || top()->is_top(), "");
duke@435 1056 }
duke@435 1057
duke@435 1058 #ifndef PRODUCT
duke@435 1059 void Compile::verify_top(Node* tn) const {
duke@435 1060 if (tn != NULL) {
duke@435 1061 assert(tn->is_Con(), "top node must be a constant");
duke@435 1062 assert(((ConNode*)tn)->type() == Type::TOP, "top node must have correct type");
duke@435 1063 assert(tn->in(0) != NULL, "must have live top node");
duke@435 1064 }
duke@435 1065 }
duke@435 1066 #endif
duke@435 1067
duke@435 1068
duke@435 1069 ///-------------------Managing Per-Node Debug & Profile Info-------------------
duke@435 1070
duke@435 1071 void Compile::grow_node_notes(GrowableArray<Node_Notes*>* arr, int grow_by) {
duke@435 1072 guarantee(arr != NULL, "");
duke@435 1073 int num_blocks = arr->length();
duke@435 1074 if (grow_by < num_blocks) grow_by = num_blocks;
duke@435 1075 int num_notes = grow_by * _node_notes_block_size;
duke@435 1076 Node_Notes* notes = NEW_ARENA_ARRAY(node_arena(), Node_Notes, num_notes);
duke@435 1077 Copy::zero_to_bytes(notes, num_notes * sizeof(Node_Notes));
duke@435 1078 while (num_notes > 0) {
duke@435 1079 arr->append(notes);
duke@435 1080 notes += _node_notes_block_size;
duke@435 1081 num_notes -= _node_notes_block_size;
duke@435 1082 }
duke@435 1083 assert(num_notes == 0, "exact multiple, please");
duke@435 1084 }
duke@435 1085
duke@435 1086 bool Compile::copy_node_notes_to(Node* dest, Node* source) {
duke@435 1087 if (source == NULL || dest == NULL) return false;
duke@435 1088
duke@435 1089 if (dest->is_Con())
duke@435 1090 return false; // Do not push debug info onto constants.
duke@435 1091
duke@435 1092 #ifdef ASSERT
duke@435 1093 // Leave a bread crumb trail pointing to the original node:
duke@435 1094 if (dest != NULL && dest != source && dest->debug_orig() == NULL) {
duke@435 1095 dest->set_debug_orig(source);
duke@435 1096 }
duke@435 1097 #endif
duke@435 1098
duke@435 1099 if (node_note_array() == NULL)
duke@435 1100 return false; // Not collecting any notes now.
duke@435 1101
duke@435 1102 // This is a copy onto a pre-existing node, which may already have notes.
duke@435 1103 // If both nodes have notes, do not overwrite any pre-existing notes.
duke@435 1104 Node_Notes* source_notes = node_notes_at(source->_idx);
duke@435 1105 if (source_notes == NULL || source_notes->is_clear()) return false;
duke@435 1106 Node_Notes* dest_notes = node_notes_at(dest->_idx);
duke@435 1107 if (dest_notes == NULL || dest_notes->is_clear()) {
duke@435 1108 return set_node_notes_at(dest->_idx, source_notes);
duke@435 1109 }
duke@435 1110
duke@435 1111 Node_Notes merged_notes = (*source_notes);
duke@435 1112 // The order of operations here ensures that dest notes will win...
duke@435 1113 merged_notes.update_from(dest_notes);
duke@435 1114 return set_node_notes_at(dest->_idx, &merged_notes);
duke@435 1115 }
duke@435 1116
duke@435 1117
duke@435 1118 //--------------------------allow_range_check_smearing-------------------------
duke@435 1119 // Gating condition for coalescing similar range checks.
duke@435 1120 // Sometimes we try 'speculatively' replacing a series of a range checks by a
duke@435 1121 // single covering check that is at least as strong as any of them.
duke@435 1122 // If the optimization succeeds, the simplified (strengthened) range check
duke@435 1123 // will always succeed. If it fails, we will deopt, and then give up
duke@435 1124 // on the optimization.
duke@435 1125 bool Compile::allow_range_check_smearing() const {
duke@435 1126 // If this method has already thrown a range-check,
duke@435 1127 // assume it was because we already tried range smearing
duke@435 1128 // and it failed.
duke@435 1129 uint already_trapped = trap_count(Deoptimization::Reason_range_check);
duke@435 1130 return !already_trapped;
duke@435 1131 }
duke@435 1132
duke@435 1133
duke@435 1134 //------------------------------flatten_alias_type-----------------------------
duke@435 1135 const TypePtr *Compile::flatten_alias_type( const TypePtr *tj ) const {
duke@435 1136 int offset = tj->offset();
duke@435 1137 TypePtr::PTR ptr = tj->ptr();
duke@435 1138
kvn@682 1139 // Known instance (scalarizable allocation) alias only with itself.
kvn@682 1140 bool is_known_inst = tj->isa_oopptr() != NULL &&
kvn@682 1141 tj->is_oopptr()->is_known_instance();
kvn@682 1142
duke@435 1143 // Process weird unsafe references.
duke@435 1144 if (offset == Type::OffsetBot && (tj->isa_instptr() /*|| tj->isa_klassptr()*/)) {
duke@435 1145 assert(InlineUnsafeOps, "indeterminate pointers come only from unsafe ops");
kvn@682 1146 assert(!is_known_inst, "scalarizable allocation should not have unsafe references");
duke@435 1147 tj = TypeOopPtr::BOTTOM;
duke@435 1148 ptr = tj->ptr();
duke@435 1149 offset = tj->offset();
duke@435 1150 }
duke@435 1151
duke@435 1152 // Array pointers need some flattening
duke@435 1153 const TypeAryPtr *ta = tj->isa_aryptr();
kvn@682 1154 if( ta && is_known_inst ) {
kvn@682 1155 if ( offset != Type::OffsetBot &&
kvn@682 1156 offset > arrayOopDesc::length_offset_in_bytes() ) {
kvn@682 1157 offset = Type::OffsetBot; // Flatten constant access into array body only
kvn@682 1158 tj = ta = TypeAryPtr::make(ptr, ta->ary(), ta->klass(), true, offset, ta->instance_id());
kvn@682 1159 }
kvn@682 1160 } else if( ta && _AliasLevel >= 2 ) {
duke@435 1161 // For arrays indexed by constant indices, we flatten the alias
duke@435 1162 // space to include all of the array body. Only the header, klass
duke@435 1163 // and array length can be accessed un-aliased.
duke@435 1164 if( offset != Type::OffsetBot ) {
duke@435 1165 if( ta->const_oop() ) { // methodDataOop or methodOop
duke@435 1166 offset = Type::OffsetBot; // Flatten constant access into array body
kvn@682 1167 tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),ta->ary(),ta->klass(),false,offset);
duke@435 1168 } else if( offset == arrayOopDesc::length_offset_in_bytes() ) {
duke@435 1169 // range is OK as-is.
duke@435 1170 tj = ta = TypeAryPtr::RANGE;
duke@435 1171 } else if( offset == oopDesc::klass_offset_in_bytes() ) {
duke@435 1172 tj = TypeInstPtr::KLASS; // all klass loads look alike
duke@435 1173 ta = TypeAryPtr::RANGE; // generic ignored junk
duke@435 1174 ptr = TypePtr::BotPTR;
duke@435 1175 } else if( offset == oopDesc::mark_offset_in_bytes() ) {
duke@435 1176 tj = TypeInstPtr::MARK;
duke@435 1177 ta = TypeAryPtr::RANGE; // generic ignored junk
duke@435 1178 ptr = TypePtr::BotPTR;
duke@435 1179 } else { // Random constant offset into array body
duke@435 1180 offset = Type::OffsetBot; // Flatten constant access into array body
kvn@682 1181 tj = ta = TypeAryPtr::make(ptr,ta->ary(),ta->klass(),false,offset);
duke@435 1182 }
duke@435 1183 }
duke@435 1184 // Arrays of fixed size alias with arrays of unknown size.
duke@435 1185 if (ta->size() != TypeInt::POS) {
duke@435 1186 const TypeAry *tary = TypeAry::make(ta->elem(), TypeInt::POS);
kvn@682 1187 tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,ta->klass(),false,offset);
duke@435 1188 }
duke@435 1189 // Arrays of known objects become arrays of unknown objects.
coleenp@548 1190 if (ta->elem()->isa_narrowoop() && ta->elem() != TypeNarrowOop::BOTTOM) {
coleenp@548 1191 const TypeAry *tary = TypeAry::make(TypeNarrowOop::BOTTOM, ta->size());
kvn@682 1192 tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,NULL,false,offset);
coleenp@548 1193 }
duke@435 1194 if (ta->elem()->isa_oopptr() && ta->elem() != TypeInstPtr::BOTTOM) {
duke@435 1195 const TypeAry *tary = TypeAry::make(TypeInstPtr::BOTTOM, ta->size());
kvn@682 1196 tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,NULL,false,offset);
duke@435 1197 }
duke@435 1198 // Arrays of bytes and of booleans both use 'bastore' and 'baload' so
duke@435 1199 // cannot be distinguished by bytecode alone.
duke@435 1200 if (ta->elem() == TypeInt::BOOL) {
duke@435 1201 const TypeAry *tary = TypeAry::make(TypeInt::BYTE, ta->size());
duke@435 1202 ciKlass* aklass = ciTypeArrayKlass::make(T_BYTE);
kvn@682 1203 tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,aklass,false,offset);
duke@435 1204 }
duke@435 1205 // During the 2nd round of IterGVN, NotNull castings are removed.
duke@435 1206 // Make sure the Bottom and NotNull variants alias the same.
duke@435 1207 // Also, make sure exact and non-exact variants alias the same.
duke@435 1208 if( ptr == TypePtr::NotNull || ta->klass_is_exact() ) {
duke@435 1209 if (ta->const_oop()) {
duke@435 1210 tj = ta = TypeAryPtr::make(TypePtr::Constant,ta->const_oop(),ta->ary(),ta->klass(),false,offset);
duke@435 1211 } else {
duke@435 1212 tj = ta = TypeAryPtr::make(TypePtr::BotPTR,ta->ary(),ta->klass(),false,offset);
duke@435 1213 }
duke@435 1214 }
duke@435 1215 }
duke@435 1216
duke@435 1217 // Oop pointers need some flattening
duke@435 1218 const TypeInstPtr *to = tj->isa_instptr();
duke@435 1219 if( to && _AliasLevel >= 2 && to != TypeOopPtr::BOTTOM ) {
never@2658 1220 ciInstanceKlass *k = to->klass()->as_instance_klass();
duke@435 1221 if( ptr == TypePtr::Constant ) {
never@2658 1222 if (to->klass() != ciEnv::current()->Class_klass() ||
never@2658 1223 offset < k->size_helper() * wordSize) {
never@2658 1224 // No constant oop pointers (such as Strings); they alias with
never@2658 1225 // unknown strings.
never@2658 1226 assert(!is_known_inst, "not scalarizable allocation");
never@2658 1227 tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset);
never@2658 1228 }
kvn@682 1229 } else if( is_known_inst ) {
kvn@598 1230 tj = to; // Keep NotNull and klass_is_exact for instance type
duke@435 1231 } else if( ptr == TypePtr::NotNull || to->klass_is_exact() ) {
duke@435 1232 // During the 2nd round of IterGVN, NotNull castings are removed.
duke@435 1233 // Make sure the Bottom and NotNull variants alias the same.
duke@435 1234 // Also, make sure exact and non-exact variants alias the same.
kvn@682 1235 tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset);
duke@435 1236 }
duke@435 1237 // Canonicalize the holder of this field
coleenp@548 1238 if (offset >= 0 && offset < instanceOopDesc::base_offset_in_bytes()) {
duke@435 1239 // First handle header references such as a LoadKlassNode, even if the
duke@435 1240 // object's klass is unloaded at compile time (4965979).
kvn@682 1241 if (!is_known_inst) { // Do it only for non-instance types
kvn@682 1242 tj = to = TypeInstPtr::make(TypePtr::BotPTR, env()->Object_klass(), false, NULL, offset);
kvn@682 1243 }
duke@435 1244 } else if (offset < 0 || offset >= k->size_helper() * wordSize) {
never@2658 1245 // Static fields are in the space above the normal instance
never@2658 1246 // fields in the java.lang.Class instance.
never@2658 1247 if (to->klass() != ciEnv::current()->Class_klass()) {
never@2658 1248 to = NULL;
never@2658 1249 tj = TypeOopPtr::BOTTOM;
never@2658 1250 offset = tj->offset();
never@2658 1251 }
duke@435 1252 } else {
duke@435 1253 ciInstanceKlass *canonical_holder = k->get_canonical_holder(offset);
duke@435 1254 if (!k->equals(canonical_holder) || tj->offset() != offset) {
kvn@682 1255 if( is_known_inst ) {
kvn@682 1256 tj = to = TypeInstPtr::make(to->ptr(), canonical_holder, true, NULL, offset, to->instance_id());
kvn@682 1257 } else {
kvn@682 1258 tj = to = TypeInstPtr::make(to->ptr(), canonical_holder, false, NULL, offset);
kvn@682 1259 }
duke@435 1260 }
duke@435 1261 }
duke@435 1262 }
duke@435 1263
duke@435 1264 // Klass pointers to object array klasses need some flattening
duke@435 1265 const TypeKlassPtr *tk = tj->isa_klassptr();
duke@435 1266 if( tk ) {
duke@435 1267 // If we are referencing a field within a Klass, we need
duke@435 1268 // to assume the worst case of an Object. Both exact and
duke@435 1269 // inexact types must flatten to the same alias class.
duke@435 1270 // Since the flattened result for a klass is defined to be
duke@435 1271 // precisely java.lang.Object, use a constant ptr.
duke@435 1272 if ( offset == Type::OffsetBot || (offset >= 0 && (size_t)offset < sizeof(Klass)) ) {
duke@435 1273
duke@435 1274 tj = tk = TypeKlassPtr::make(TypePtr::Constant,
duke@435 1275 TypeKlassPtr::OBJECT->klass(),
duke@435 1276 offset);
duke@435 1277 }
duke@435 1278
duke@435 1279 ciKlass* klass = tk->klass();
duke@435 1280 if( klass->is_obj_array_klass() ) {
duke@435 1281 ciKlass* k = TypeAryPtr::OOPS->klass();
duke@435 1282 if( !k || !k->is_loaded() ) // Only fails for some -Xcomp runs
duke@435 1283 k = TypeInstPtr::BOTTOM->klass();
duke@435 1284 tj = tk = TypeKlassPtr::make( TypePtr::NotNull, k, offset );
duke@435 1285 }
duke@435 1286
duke@435 1287 // Check for precise loads from the primary supertype array and force them
duke@435 1288 // to the supertype cache alias index. Check for generic array loads from
duke@435 1289 // the primary supertype array and also force them to the supertype cache
duke@435 1290 // alias index. Since the same load can reach both, we need to merge
duke@435 1291 // these 2 disparate memories into the same alias class. Since the
duke@435 1292 // primary supertype array is read-only, there's no chance of confusion
duke@435 1293 // where we bypass an array load and an array store.
duke@435 1294 uint off2 = offset - Klass::primary_supers_offset_in_bytes();
duke@435 1295 if( offset == Type::OffsetBot ||
duke@435 1296 off2 < Klass::primary_super_limit()*wordSize ) {
duke@435 1297 offset = sizeof(oopDesc) +Klass::secondary_super_cache_offset_in_bytes();
duke@435 1298 tj = tk = TypeKlassPtr::make( TypePtr::NotNull, tk->klass(), offset );
duke@435 1299 }
duke@435 1300 }
duke@435 1301
duke@435 1302 // Flatten all Raw pointers together.
duke@435 1303 if (tj->base() == Type::RawPtr)
duke@435 1304 tj = TypeRawPtr::BOTTOM;
duke@435 1305
duke@435 1306 if (tj->base() == Type::AnyPtr)
duke@435 1307 tj = TypePtr::BOTTOM; // An error, which the caller must check for.
duke@435 1308
duke@435 1309 // Flatten all to bottom for now
duke@435 1310 switch( _AliasLevel ) {
duke@435 1311 case 0:
duke@435 1312 tj = TypePtr::BOTTOM;
duke@435 1313 break;
duke@435 1314 case 1: // Flatten to: oop, static, field or array
duke@435 1315 switch (tj->base()) {
duke@435 1316 //case Type::AryPtr: tj = TypeAryPtr::RANGE; break;
duke@435 1317 case Type::RawPtr: tj = TypeRawPtr::BOTTOM; break;
duke@435 1318 case Type::AryPtr: // do not distinguish arrays at all
duke@435 1319 case Type::InstPtr: tj = TypeInstPtr::BOTTOM; break;
duke@435 1320 case Type::KlassPtr: tj = TypeKlassPtr::OBJECT; break;
duke@435 1321 case Type::AnyPtr: tj = TypePtr::BOTTOM; break; // caller checks it
duke@435 1322 default: ShouldNotReachHere();
duke@435 1323 }
duke@435 1324 break;
twisti@1040 1325 case 2: // No collapsing at level 2; keep all splits
twisti@1040 1326 case 3: // No collapsing at level 3; keep all splits
duke@435 1327 break;
duke@435 1328 default:
duke@435 1329 Unimplemented();
duke@435 1330 }
duke@435 1331
duke@435 1332 offset = tj->offset();
duke@435 1333 assert( offset != Type::OffsetTop, "Offset has fallen from constant" );
duke@435 1334
duke@435 1335 assert( (offset != Type::OffsetBot && tj->base() != Type::AryPtr) ||
duke@435 1336 (offset == Type::OffsetBot && tj->base() == Type::AryPtr) ||
duke@435 1337 (offset == Type::OffsetBot && tj == TypeOopPtr::BOTTOM) ||
duke@435 1338 (offset == Type::OffsetBot && tj == TypePtr::BOTTOM) ||
duke@435 1339 (offset == oopDesc::mark_offset_in_bytes() && tj->base() == Type::AryPtr) ||
duke@435 1340 (offset == oopDesc::klass_offset_in_bytes() && tj->base() == Type::AryPtr) ||
duke@435 1341 (offset == arrayOopDesc::length_offset_in_bytes() && tj->base() == Type::AryPtr) ,
duke@435 1342 "For oops, klasses, raw offset must be constant; for arrays the offset is never known" );
duke@435 1343 assert( tj->ptr() != TypePtr::TopPTR &&
duke@435 1344 tj->ptr() != TypePtr::AnyNull &&
duke@435 1345 tj->ptr() != TypePtr::Null, "No imprecise addresses" );
duke@435 1346 // assert( tj->ptr() != TypePtr::Constant ||
duke@435 1347 // tj->base() == Type::RawPtr ||
duke@435 1348 // tj->base() == Type::KlassPtr, "No constant oop addresses" );
duke@435 1349
duke@435 1350 return tj;
duke@435 1351 }
duke@435 1352
duke@435 1353 void Compile::AliasType::Init(int i, const TypePtr* at) {
duke@435 1354 _index = i;
duke@435 1355 _adr_type = at;
duke@435 1356 _field = NULL;
duke@435 1357 _is_rewritable = true; // default
duke@435 1358 const TypeOopPtr *atoop = (at != NULL) ? at->isa_oopptr() : NULL;
kvn@658 1359 if (atoop != NULL && atoop->is_known_instance()) {
kvn@658 1360 const TypeOopPtr *gt = atoop->cast_to_instance_id(TypeOopPtr::InstanceBot);
duke@435 1361 _general_index = Compile::current()->get_alias_index(gt);
duke@435 1362 } else {
duke@435 1363 _general_index = 0;
duke@435 1364 }
duke@435 1365 }
duke@435 1366
duke@435 1367 //---------------------------------print_on------------------------------------
duke@435 1368 #ifndef PRODUCT
duke@435 1369 void Compile::AliasType::print_on(outputStream* st) {
duke@435 1370 if (index() < 10)
duke@435 1371 st->print("@ <%d> ", index());
duke@435 1372 else st->print("@ <%d>", index());
duke@435 1373 st->print(is_rewritable() ? " " : " RO");
duke@435 1374 int offset = adr_type()->offset();
duke@435 1375 if (offset == Type::OffsetBot)
duke@435 1376 st->print(" +any");
duke@435 1377 else st->print(" +%-3d", offset);
duke@435 1378 st->print(" in ");
duke@435 1379 adr_type()->dump_on(st);
duke@435 1380 const TypeOopPtr* tjp = adr_type()->isa_oopptr();
duke@435 1381 if (field() != NULL && tjp) {
duke@435 1382 if (tjp->klass() != field()->holder() ||
duke@435 1383 tjp->offset() != field()->offset_in_bytes()) {
duke@435 1384 st->print(" != ");
duke@435 1385 field()->print();
duke@435 1386 st->print(" ***");
duke@435 1387 }
duke@435 1388 }
duke@435 1389 }
duke@435 1390
duke@435 1391 void print_alias_types() {
duke@435 1392 Compile* C = Compile::current();
duke@435 1393 tty->print_cr("--- Alias types, AliasIdxBot .. %d", C->num_alias_types()-1);
duke@435 1394 for (int idx = Compile::AliasIdxBot; idx < C->num_alias_types(); idx++) {
duke@435 1395 C->alias_type(idx)->print_on(tty);
duke@435 1396 tty->cr();
duke@435 1397 }
duke@435 1398 }
duke@435 1399 #endif
duke@435 1400
duke@435 1401
duke@435 1402 //----------------------------probe_alias_cache--------------------------------
duke@435 1403 Compile::AliasCacheEntry* Compile::probe_alias_cache(const TypePtr* adr_type) {
duke@435 1404 intptr_t key = (intptr_t) adr_type;
duke@435 1405 key ^= key >> logAliasCacheSize;
duke@435 1406 return &_alias_cache[key & right_n_bits(logAliasCacheSize)];
duke@435 1407 }
duke@435 1408
duke@435 1409
duke@435 1410 //-----------------------------grow_alias_types--------------------------------
duke@435 1411 void Compile::grow_alias_types() {
duke@435 1412 const int old_ats = _max_alias_types; // how many before?
duke@435 1413 const int new_ats = old_ats; // how many more?
duke@435 1414 const int grow_ats = old_ats+new_ats; // how many now?
duke@435 1415 _max_alias_types = grow_ats;
duke@435 1416 _alias_types = REALLOC_ARENA_ARRAY(comp_arena(), AliasType*, _alias_types, old_ats, grow_ats);
duke@435 1417 AliasType* ats = NEW_ARENA_ARRAY(comp_arena(), AliasType, new_ats);
duke@435 1418 Copy::zero_to_bytes(ats, sizeof(AliasType)*new_ats);
duke@435 1419 for (int i = 0; i < new_ats; i++) _alias_types[old_ats+i] = &ats[i];
duke@435 1420 }
duke@435 1421
duke@435 1422
duke@435 1423 //--------------------------------find_alias_type------------------------------
never@2658 1424 Compile::AliasType* Compile::find_alias_type(const TypePtr* adr_type, bool no_create, ciField* original_field) {
duke@435 1425 if (_AliasLevel == 0)
duke@435 1426 return alias_type(AliasIdxBot);
duke@435 1427
duke@435 1428 AliasCacheEntry* ace = probe_alias_cache(adr_type);
duke@435 1429 if (ace->_adr_type == adr_type) {
duke@435 1430 return alias_type(ace->_index);
duke@435 1431 }
duke@435 1432
duke@435 1433 // Handle special cases.
duke@435 1434 if (adr_type == NULL) return alias_type(AliasIdxTop);
duke@435 1435 if (adr_type == TypePtr::BOTTOM) return alias_type(AliasIdxBot);
duke@435 1436
duke@435 1437 // Do it the slow way.
duke@435 1438 const TypePtr* flat = flatten_alias_type(adr_type);
duke@435 1439
duke@435 1440 #ifdef ASSERT
duke@435 1441 assert(flat == flatten_alias_type(flat), "idempotent");
duke@435 1442 assert(flat != TypePtr::BOTTOM, "cannot alias-analyze an untyped ptr");
duke@435 1443 if (flat->isa_oopptr() && !flat->isa_klassptr()) {
duke@435 1444 const TypeOopPtr* foop = flat->is_oopptr();
kvn@682 1445 // Scalarizable allocations have exact klass always.
kvn@682 1446 bool exact = !foop->klass_is_exact() || foop->is_known_instance();
kvn@682 1447 const TypePtr* xoop = foop->cast_to_exactness(exact)->is_ptr();
duke@435 1448 assert(foop == flatten_alias_type(xoop), "exactness must not affect alias type");
duke@435 1449 }
duke@435 1450 assert(flat == flatten_alias_type(flat), "exact bit doesn't matter");
duke@435 1451 #endif
duke@435 1452
duke@435 1453 int idx = AliasIdxTop;
duke@435 1454 for (int i = 0; i < num_alias_types(); i++) {
duke@435 1455 if (alias_type(i)->adr_type() == flat) {
duke@435 1456 idx = i;
duke@435 1457 break;
duke@435 1458 }
duke@435 1459 }
duke@435 1460
duke@435 1461 if (idx == AliasIdxTop) {
duke@435 1462 if (no_create) return NULL;
duke@435 1463 // Grow the array if necessary.
duke@435 1464 if (_num_alias_types == _max_alias_types) grow_alias_types();
duke@435 1465 // Add a new alias type.
duke@435 1466 idx = _num_alias_types++;
duke@435 1467 _alias_types[idx]->Init(idx, flat);
duke@435 1468 if (flat == TypeInstPtr::KLASS) alias_type(idx)->set_rewritable(false);
duke@435 1469 if (flat == TypeAryPtr::RANGE) alias_type(idx)->set_rewritable(false);
duke@435 1470 if (flat->isa_instptr()) {
duke@435 1471 if (flat->offset() == java_lang_Class::klass_offset_in_bytes()
duke@435 1472 && flat->is_instptr()->klass() == env()->Class_klass())
duke@435 1473 alias_type(idx)->set_rewritable(false);
duke@435 1474 }
duke@435 1475 if (flat->isa_klassptr()) {
duke@435 1476 if (flat->offset() == Klass::super_check_offset_offset_in_bytes() + (int)sizeof(oopDesc))
duke@435 1477 alias_type(idx)->set_rewritable(false);
duke@435 1478 if (flat->offset() == Klass::modifier_flags_offset_in_bytes() + (int)sizeof(oopDesc))
duke@435 1479 alias_type(idx)->set_rewritable(false);
duke@435 1480 if (flat->offset() == Klass::access_flags_offset_in_bytes() + (int)sizeof(oopDesc))
duke@435 1481 alias_type(idx)->set_rewritable(false);
duke@435 1482 if (flat->offset() == Klass::java_mirror_offset_in_bytes() + (int)sizeof(oopDesc))
duke@435 1483 alias_type(idx)->set_rewritable(false);
duke@435 1484 }
duke@435 1485 // %%% (We would like to finalize JavaThread::threadObj_offset(),
duke@435 1486 // but the base pointer type is not distinctive enough to identify
duke@435 1487 // references into JavaThread.)
duke@435 1488
never@2658 1489 // Check for final fields.
duke@435 1490 const TypeInstPtr* tinst = flat->isa_instptr();
coleenp@548 1491 if (tinst && tinst->offset() >= instanceOopDesc::base_offset_in_bytes()) {
never@2658 1492 ciField* field;
never@2658 1493 if (tinst->const_oop() != NULL &&
never@2658 1494 tinst->klass() == ciEnv::current()->Class_klass() &&
never@2658 1495 tinst->offset() >= (tinst->klass()->as_instance_klass()->size_helper() * wordSize)) {
never@2658 1496 // static field
never@2658 1497 ciInstanceKlass* k = tinst->const_oop()->as_instance()->java_lang_Class_klass()->as_instance_klass();
never@2658 1498 field = k->get_field_by_offset(tinst->offset(), true);
never@2658 1499 } else {
never@2658 1500 ciInstanceKlass *k = tinst->klass()->as_instance_klass();
never@2658 1501 field = k->get_field_by_offset(tinst->offset(), false);
never@2658 1502 }
never@2658 1503 assert(field == NULL ||
never@2658 1504 original_field == NULL ||
never@2658 1505 (field->holder() == original_field->holder() &&
never@2658 1506 field->offset() == original_field->offset() &&
never@2658 1507 field->is_static() == original_field->is_static()), "wrong field?");
duke@435 1508 // Set field() and is_rewritable() attributes.
duke@435 1509 if (field != NULL) alias_type(idx)->set_field(field);
duke@435 1510 }
duke@435 1511 }
duke@435 1512
duke@435 1513 // Fill the cache for next time.
duke@435 1514 ace->_adr_type = adr_type;
duke@435 1515 ace->_index = idx;
duke@435 1516 assert(alias_type(adr_type) == alias_type(idx), "type must be installed");
duke@435 1517
duke@435 1518 // Might as well try to fill the cache for the flattened version, too.
duke@435 1519 AliasCacheEntry* face = probe_alias_cache(flat);
duke@435 1520 if (face->_adr_type == NULL) {
duke@435 1521 face->_adr_type = flat;
duke@435 1522 face->_index = idx;
duke@435 1523 assert(alias_type(flat) == alias_type(idx), "flat type must work too");
duke@435 1524 }
duke@435 1525
duke@435 1526 return alias_type(idx);
duke@435 1527 }
duke@435 1528
duke@435 1529
duke@435 1530 Compile::AliasType* Compile::alias_type(ciField* field) {
duke@435 1531 const TypeOopPtr* t;
duke@435 1532 if (field->is_static())
never@2658 1533 t = TypeInstPtr::make(field->holder()->java_mirror());
duke@435 1534 else
duke@435 1535 t = TypeOopPtr::make_from_klass_raw(field->holder());
never@2658 1536 AliasType* atp = alias_type(t->add_offset(field->offset_in_bytes()), field);
duke@435 1537 assert(field->is_final() == !atp->is_rewritable(), "must get the rewritable bits correct");
duke@435 1538 return atp;
duke@435 1539 }
duke@435 1540
duke@435 1541
duke@435 1542 //------------------------------have_alias_type--------------------------------
duke@435 1543 bool Compile::have_alias_type(const TypePtr* adr_type) {
duke@435 1544 AliasCacheEntry* ace = probe_alias_cache(adr_type);
duke@435 1545 if (ace->_adr_type == adr_type) {
duke@435 1546 return true;
duke@435 1547 }
duke@435 1548
duke@435 1549 // Handle special cases.
duke@435 1550 if (adr_type == NULL) return true;
duke@435 1551 if (adr_type == TypePtr::BOTTOM) return true;
duke@435 1552
never@2658 1553 return find_alias_type(adr_type, true, NULL) != NULL;
duke@435 1554 }
duke@435 1555
duke@435 1556 //-----------------------------must_alias--------------------------------------
duke@435 1557 // True if all values of the given address type are in the given alias category.
duke@435 1558 bool Compile::must_alias(const TypePtr* adr_type, int alias_idx) {
duke@435 1559 if (alias_idx == AliasIdxBot) return true; // the universal category
duke@435 1560 if (adr_type == NULL) return true; // NULL serves as TypePtr::TOP
duke@435 1561 if (alias_idx == AliasIdxTop) return false; // the empty category
duke@435 1562 if (adr_type->base() == Type::AnyPtr) return false; // TypePtr::BOTTOM or its twins
duke@435 1563
duke@435 1564 // the only remaining possible overlap is identity
duke@435 1565 int adr_idx = get_alias_index(adr_type);
duke@435 1566 assert(adr_idx != AliasIdxBot && adr_idx != AliasIdxTop, "");
duke@435 1567 assert(adr_idx == alias_idx ||
duke@435 1568 (alias_type(alias_idx)->adr_type() != TypeOopPtr::BOTTOM
duke@435 1569 && adr_type != TypeOopPtr::BOTTOM),
duke@435 1570 "should not be testing for overlap with an unsafe pointer");
duke@435 1571 return adr_idx == alias_idx;
duke@435 1572 }
duke@435 1573
duke@435 1574 //------------------------------can_alias--------------------------------------
duke@435 1575 // True if any values of the given address type are in the given alias category.
duke@435 1576 bool Compile::can_alias(const TypePtr* adr_type, int alias_idx) {
duke@435 1577 if (alias_idx == AliasIdxTop) return false; // the empty category
duke@435 1578 if (adr_type == NULL) return false; // NULL serves as TypePtr::TOP
duke@435 1579 if (alias_idx == AliasIdxBot) return true; // the universal category
duke@435 1580 if (adr_type->base() == Type::AnyPtr) return true; // TypePtr::BOTTOM or its twins
duke@435 1581
duke@435 1582 // the only remaining possible overlap is identity
duke@435 1583 int adr_idx = get_alias_index(adr_type);
duke@435 1584 assert(adr_idx != AliasIdxBot && adr_idx != AliasIdxTop, "");
duke@435 1585 return adr_idx == alias_idx;
duke@435 1586 }
duke@435 1587
duke@435 1588
duke@435 1589
duke@435 1590 //---------------------------pop_warm_call-------------------------------------
duke@435 1591 WarmCallInfo* Compile::pop_warm_call() {
duke@435 1592 WarmCallInfo* wci = _warm_calls;
duke@435 1593 if (wci != NULL) _warm_calls = wci->remove_from(wci);
duke@435 1594 return wci;
duke@435 1595 }
duke@435 1596
duke@435 1597 //----------------------------Inline_Warm--------------------------------------
duke@435 1598 int Compile::Inline_Warm() {
duke@435 1599 // If there is room, try to inline some more warm call sites.
duke@435 1600 // %%% Do a graph index compaction pass when we think we're out of space?
duke@435 1601 if (!InlineWarmCalls) return 0;
duke@435 1602
duke@435 1603 int calls_made_hot = 0;
duke@435 1604 int room_to_grow = NodeCountInliningCutoff - unique();
duke@435 1605 int amount_to_grow = MIN2(room_to_grow, (int)NodeCountInliningStep);
duke@435 1606 int amount_grown = 0;
duke@435 1607 WarmCallInfo* call;
duke@435 1608 while (amount_to_grow > 0 && (call = pop_warm_call()) != NULL) {
duke@435 1609 int est_size = (int)call->size();
duke@435 1610 if (est_size > (room_to_grow - amount_grown)) {
duke@435 1611 // This one won't fit anyway. Get rid of it.
duke@435 1612 call->make_cold();
duke@435 1613 continue;
duke@435 1614 }
duke@435 1615 call->make_hot();
duke@435 1616 calls_made_hot++;
duke@435 1617 amount_grown += est_size;
duke@435 1618 amount_to_grow -= est_size;
duke@435 1619 }
duke@435 1620
duke@435 1621 if (calls_made_hot > 0) set_major_progress();
duke@435 1622 return calls_made_hot;
duke@435 1623 }
duke@435 1624
duke@435 1625
duke@435 1626 //----------------------------Finish_Warm--------------------------------------
duke@435 1627 void Compile::Finish_Warm() {
duke@435 1628 if (!InlineWarmCalls) return;
duke@435 1629 if (failing()) return;
duke@435 1630 if (warm_calls() == NULL) return;
duke@435 1631
duke@435 1632 // Clean up loose ends, if we are out of space for inlining.
duke@435 1633 WarmCallInfo* call;
duke@435 1634 while ((call = pop_warm_call()) != NULL) {
duke@435 1635 call->make_cold();
duke@435 1636 }
duke@435 1637 }
duke@435 1638
cfang@1607 1639 //---------------------cleanup_loop_predicates-----------------------
cfang@1607 1640 // Remove the opaque nodes that protect the predicates so that all unused
cfang@1607 1641 // checks and uncommon_traps will be eliminated from the ideal graph
cfang@1607 1642 void Compile::cleanup_loop_predicates(PhaseIterGVN &igvn) {
cfang@1607 1643 if (predicate_count()==0) return;
cfang@1607 1644 for (int i = predicate_count(); i > 0; i--) {
cfang@1607 1645 Node * n = predicate_opaque1_node(i-1);
cfang@1607 1646 assert(n->Opcode() == Op_Opaque1, "must be");
cfang@1607 1647 igvn.replace_node(n, n->in(1));
cfang@1607 1648 }
cfang@1607 1649 assert(predicate_count()==0, "should be clean!");
cfang@1607 1650 igvn.optimize();
cfang@1607 1651 }
duke@435 1652
duke@435 1653 //------------------------------Optimize---------------------------------------
duke@435 1654 // Given a graph, optimize it.
duke@435 1655 void Compile::Optimize() {
duke@435 1656 TracePhase t1("optimizer", &_t_optimizer, true);
duke@435 1657
duke@435 1658 #ifndef PRODUCT
duke@435 1659 if (env()->break_at_compile()) {
duke@435 1660 BREAKPOINT;
duke@435 1661 }
duke@435 1662
duke@435 1663 #endif
duke@435 1664
duke@435 1665 ResourceMark rm;
duke@435 1666 int loop_opts_cnt;
duke@435 1667
duke@435 1668 NOT_PRODUCT( verify_graph_edges(); )
duke@435 1669
never@657 1670 print_method("After Parsing");
duke@435 1671
duke@435 1672 {
duke@435 1673 // Iterative Global Value Numbering, including ideal transforms
duke@435 1674 // Initialize IterGVN with types and values from parse-time GVN
duke@435 1675 PhaseIterGVN igvn(initial_gvn());
duke@435 1676 {
duke@435 1677 NOT_PRODUCT( TracePhase t2("iterGVN", &_t_iterGVN, TimeCompiler); )
duke@435 1678 igvn.optimize();
duke@435 1679 }
duke@435 1680
duke@435 1681 print_method("Iter GVN 1", 2);
duke@435 1682
duke@435 1683 if (failing()) return;
duke@435 1684
kvn@1989 1685 // Perform escape analysis
kvn@1989 1686 if (_do_escape_analysis && ConnectionGraph::has_candidates(this)) {
kvn@1989 1687 TracePhase t2("escapeAnalysis", &_t_escapeAnalysis, true);
kvn@1989 1688 ConnectionGraph::do_analysis(this, &igvn);
kvn@1989 1689
kvn@1989 1690 if (failing()) return;
kvn@1989 1691
kvn@1989 1692 igvn.optimize();
kvn@1989 1693 print_method("Iter GVN 3", 2);
kvn@1989 1694
kvn@1989 1695 if (failing()) return;
kvn@1989 1696
kvn@1989 1697 }
kvn@1989 1698
duke@435 1699 // Loop transforms on the ideal graph. Range Check Elimination,
duke@435 1700 // peeling, unrolling, etc.
duke@435 1701
duke@435 1702 // Set loop opts counter
duke@435 1703 loop_opts_cnt = num_loop_opts();
duke@435 1704 if((loop_opts_cnt > 0) && (has_loops() || has_split_ifs())) {
duke@435 1705 {
duke@435 1706 TracePhase t2("idealLoop", &_t_idealLoop, true);
cfang@1607 1707 PhaseIdealLoop ideal_loop( igvn, true, UseLoopPredicate);
duke@435 1708 loop_opts_cnt--;
duke@435 1709 if (major_progress()) print_method("PhaseIdealLoop 1", 2);
duke@435 1710 if (failing()) return;
duke@435 1711 }
duke@435 1712 // Loop opts pass if partial peeling occurred in previous pass
duke@435 1713 if(PartialPeelLoop && major_progress() && (loop_opts_cnt > 0)) {
duke@435 1714 TracePhase t3("idealLoop", &_t_idealLoop, true);
cfang@1607 1715 PhaseIdealLoop ideal_loop( igvn, false, UseLoopPredicate);
duke@435 1716 loop_opts_cnt--;
duke@435 1717 if (major_progress()) print_method("PhaseIdealLoop 2", 2);
duke@435 1718 if (failing()) return;
duke@435 1719 }
duke@435 1720 // Loop opts pass for loop-unrolling before CCP
duke@435 1721 if(major_progress() && (loop_opts_cnt > 0)) {
duke@435 1722 TracePhase t4("idealLoop", &_t_idealLoop, true);
cfang@1607 1723 PhaseIdealLoop ideal_loop( igvn, false, UseLoopPredicate);
duke@435 1724 loop_opts_cnt--;
duke@435 1725 if (major_progress()) print_method("PhaseIdealLoop 3", 2);
duke@435 1726 }
never@1356 1727 if (!failing()) {
never@1356 1728 // Verify that last round of loop opts produced a valid graph
never@1356 1729 NOT_PRODUCT( TracePhase t2("idealLoopVerify", &_t_idealLoopVerify, TimeCompiler); )
never@1356 1730 PhaseIdealLoop::verify(igvn);
never@1356 1731 }
duke@435 1732 }
duke@435 1733 if (failing()) return;
duke@435 1734
duke@435 1735 // Conditional Constant Propagation;
duke@435 1736 PhaseCCP ccp( &igvn );
duke@435 1737 assert( true, "Break here to ccp.dump_nodes_and_types(_root,999,1)");
duke@435 1738 {
duke@435 1739 TracePhase t2("ccp", &_t_ccp, true);
duke@435 1740 ccp.do_transform();
duke@435 1741 }
duke@435 1742 print_method("PhaseCPP 1", 2);
duke@435 1743
duke@435 1744 assert( true, "Break here to ccp.dump_old2new_map()");
duke@435 1745
duke@435 1746 // Iterative Global Value Numbering, including ideal transforms
duke@435 1747 {
duke@435 1748 NOT_PRODUCT( TracePhase t2("iterGVN2", &_t_iterGVN2, TimeCompiler); )
duke@435 1749 igvn = ccp;
duke@435 1750 igvn.optimize();
duke@435 1751 }
duke@435 1752
duke@435 1753 print_method("Iter GVN 2", 2);
duke@435 1754
duke@435 1755 if (failing()) return;
duke@435 1756
duke@435 1757 // Loop transforms on the ideal graph. Range Check Elimination,
duke@435 1758 // peeling, unrolling, etc.
duke@435 1759 if(loop_opts_cnt > 0) {
duke@435 1760 debug_only( int cnt = 0; );
cfang@1607 1761 bool loop_predication = UseLoopPredicate;
duke@435 1762 while(major_progress() && (loop_opts_cnt > 0)) {
duke@435 1763 TracePhase t2("idealLoop", &_t_idealLoop, true);
duke@435 1764 assert( cnt++ < 40, "infinite cycle in loop optimization" );
cfang@1607 1765 PhaseIdealLoop ideal_loop( igvn, true, loop_predication);
duke@435 1766 loop_opts_cnt--;
duke@435 1767 if (major_progress()) print_method("PhaseIdealLoop iterations", 2);
duke@435 1768 if (failing()) return;
cfang@1607 1769 // Perform loop predication optimization during first iteration after CCP.
cfang@1607 1770 // After that switch it off and cleanup unused loop predicates.
cfang@1607 1771 if (loop_predication) {
cfang@1607 1772 loop_predication = false;
cfang@1607 1773 cleanup_loop_predicates(igvn);
cfang@1607 1774 if (failing()) return;
cfang@1607 1775 }
duke@435 1776 }
duke@435 1777 }
never@1356 1778
never@1356 1779 {
never@1356 1780 // Verify that all previous optimizations produced a valid graph
never@1356 1781 // at least to this point, even if no loop optimizations were done.
never@1356 1782 NOT_PRODUCT( TracePhase t2("idealLoopVerify", &_t_idealLoopVerify, TimeCompiler); )
never@1356 1783 PhaseIdealLoop::verify(igvn);
never@1356 1784 }
never@1356 1785
duke@435 1786 {
duke@435 1787 NOT_PRODUCT( TracePhase t2("macroExpand", &_t_macroExpand, TimeCompiler); )
duke@435 1788 PhaseMacroExpand mex(igvn);
duke@435 1789 if (mex.expand_macro_nodes()) {
duke@435 1790 assert(failing(), "must bail out w/ explicit message");
duke@435 1791 return;
duke@435 1792 }
duke@435 1793 }
duke@435 1794
duke@435 1795 } // (End scope of igvn; run destructor if necessary for asserts.)
duke@435 1796
duke@435 1797 // A method with only infinite loops has no edges entering loops from root
duke@435 1798 {
duke@435 1799 NOT_PRODUCT( TracePhase t2("graphReshape", &_t_graphReshaping, TimeCompiler); )
duke@435 1800 if (final_graph_reshaping()) {
duke@435 1801 assert(failing(), "must bail out w/ explicit message");
duke@435 1802 return;
duke@435 1803 }
duke@435 1804 }
duke@435 1805
duke@435 1806 print_method("Optimize finished", 2);
duke@435 1807 }
duke@435 1808
duke@435 1809
duke@435 1810 //------------------------------Code_Gen---------------------------------------
duke@435 1811 // Given a graph, generate code for it
duke@435 1812 void Compile::Code_Gen() {
duke@435 1813 if (failing()) return;
duke@435 1814
duke@435 1815 // Perform instruction selection. You might think we could reclaim Matcher
duke@435 1816 // memory PDQ, but actually the Matcher is used in generating spill code.
duke@435 1817 // Internals of the Matcher (including some VectorSets) must remain live
duke@435 1818 // for awhile - thus I cannot reclaim Matcher memory lest a VectorSet usage
duke@435 1819 // set a bit in reclaimed memory.
duke@435 1820
duke@435 1821 // In debug mode can dump m._nodes.dump() for mapping of ideal to machine
duke@435 1822 // nodes. Mapping is only valid at the root of each matched subtree.
duke@435 1823 NOT_PRODUCT( verify_graph_edges(); )
duke@435 1824
duke@435 1825 Node_List proj_list;
duke@435 1826 Matcher m(proj_list);
duke@435 1827 _matcher = &m;
duke@435 1828 {
duke@435 1829 TracePhase t2("matcher", &_t_matcher, true);
duke@435 1830 m.match();
duke@435 1831 }
duke@435 1832 // In debug mode can dump m._nodes.dump() for mapping of ideal to machine
duke@435 1833 // nodes. Mapping is only valid at the root of each matched subtree.
duke@435 1834 NOT_PRODUCT( verify_graph_edges(); )
duke@435 1835
duke@435 1836 // If you have too many nodes, or if matching has failed, bail out
duke@435 1837 check_node_count(0, "out of nodes matching instructions");
duke@435 1838 if (failing()) return;
duke@435 1839
duke@435 1840 // Build a proper-looking CFG
duke@435 1841 PhaseCFG cfg(node_arena(), root(), m);
duke@435 1842 _cfg = &cfg;
duke@435 1843 {
duke@435 1844 NOT_PRODUCT( TracePhase t2("scheduler", &_t_scheduler, TimeCompiler); )
duke@435 1845 cfg.Dominators();
duke@435 1846 if (failing()) return;
duke@435 1847
duke@435 1848 NOT_PRODUCT( verify_graph_edges(); )
duke@435 1849
duke@435 1850 cfg.Estimate_Block_Frequency();
duke@435 1851 cfg.GlobalCodeMotion(m,unique(),proj_list);
duke@435 1852
duke@435 1853 print_method("Global code motion", 2);
duke@435 1854
duke@435 1855 if (failing()) return;
duke@435 1856 NOT_PRODUCT( verify_graph_edges(); )
duke@435 1857
duke@435 1858 debug_only( cfg.verify(); )
duke@435 1859 }
duke@435 1860 NOT_PRODUCT( verify_graph_edges(); )
duke@435 1861
duke@435 1862 PhaseChaitin regalloc(unique(),cfg,m);
duke@435 1863 _regalloc = &regalloc;
duke@435 1864 {
duke@435 1865 TracePhase t2("regalloc", &_t_registerAllocation, true);
duke@435 1866 // Perform any platform dependent preallocation actions. This is used,
duke@435 1867 // for example, to avoid taking an implicit null pointer exception
duke@435 1868 // using the frame pointer on win95.
duke@435 1869 _regalloc->pd_preallocate_hook();
duke@435 1870
duke@435 1871 // Perform register allocation. After Chaitin, use-def chains are
duke@435 1872 // no longer accurate (at spill code) and so must be ignored.
duke@435 1873 // Node->LRG->reg mappings are still accurate.
duke@435 1874 _regalloc->Register_Allocate();
duke@435 1875
duke@435 1876 // Bail out if the allocator builds too many nodes
duke@435 1877 if (failing()) return;
duke@435 1878 }
duke@435 1879
duke@435 1880 // Prior to register allocation we kept empty basic blocks in case the
duke@435 1881 // the allocator needed a place to spill. After register allocation we
duke@435 1882 // are not adding any new instructions. If any basic block is empty, we
duke@435 1883 // can now safely remove it.
duke@435 1884 {
rasbold@853 1885 NOT_PRODUCT( TracePhase t2("blockOrdering", &_t_blockOrdering, TimeCompiler); )
rasbold@853 1886 cfg.remove_empty();
rasbold@853 1887 if (do_freq_based_layout()) {
rasbold@853 1888 PhaseBlockLayout layout(cfg);
rasbold@853 1889 } else {
rasbold@853 1890 cfg.set_loop_alignment();
rasbold@853 1891 }
rasbold@853 1892 cfg.fixup_flow();
duke@435 1893 }
duke@435 1894
duke@435 1895 // Perform any platform dependent postallocation verifications.
duke@435 1896 debug_only( _regalloc->pd_postallocate_verify_hook(); )
duke@435 1897
duke@435 1898 // Apply peephole optimizations
duke@435 1899 if( OptoPeephole ) {
duke@435 1900 NOT_PRODUCT( TracePhase t2("peephole", &_t_peephole, TimeCompiler); )
duke@435 1901 PhasePeephole peep( _regalloc, cfg);
duke@435 1902 peep.do_transform();
duke@435 1903 }
duke@435 1904
duke@435 1905 // Convert Nodes to instruction bits in a buffer
duke@435 1906 {
duke@435 1907 // %%%% workspace merge brought two timers together for one job
duke@435 1908 TracePhase t2a("output", &_t_output, true);
duke@435 1909 NOT_PRODUCT( TraceTime t2b(NULL, &_t_codeGeneration, TimeCompiler, false); )
duke@435 1910 Output();
duke@435 1911 }
duke@435 1912
never@657 1913 print_method("Final Code");
duke@435 1914
duke@435 1915 // He's dead, Jim.
duke@435 1916 _cfg = (PhaseCFG*)0xdeadbeef;
duke@435 1917 _regalloc = (PhaseChaitin*)0xdeadbeef;
duke@435 1918 }
duke@435 1919
duke@435 1920
duke@435 1921 //------------------------------dump_asm---------------------------------------
duke@435 1922 // Dump formatted assembly
duke@435 1923 #ifndef PRODUCT
duke@435 1924 void Compile::dump_asm(int *pcs, uint pc_limit) {
duke@435 1925 bool cut_short = false;
duke@435 1926 tty->print_cr("#");
duke@435 1927 tty->print("# "); _tf->dump(); tty->cr();
duke@435 1928 tty->print_cr("#");
duke@435 1929
duke@435 1930 // For all blocks
duke@435 1931 int pc = 0x0; // Program counter
duke@435 1932 char starts_bundle = ' ';
duke@435 1933 _regalloc->dump_frame();
duke@435 1934
duke@435 1935 Node *n = NULL;
duke@435 1936 for( uint i=0; i<_cfg->_num_blocks; i++ ) {
duke@435 1937 if (VMThread::should_terminate()) { cut_short = true; break; }
duke@435 1938 Block *b = _cfg->_blocks[i];
duke@435 1939 if (b->is_connector() && !Verbose) continue;
duke@435 1940 n = b->_nodes[0];
duke@435 1941 if (pcs && n->_idx < pc_limit)
duke@435 1942 tty->print("%3.3x ", pcs[n->_idx]);
duke@435 1943 else
duke@435 1944 tty->print(" ");
duke@435 1945 b->dump_head( &_cfg->_bbs );
duke@435 1946 if (b->is_connector()) {
duke@435 1947 tty->print_cr(" # Empty connector block");
duke@435 1948 } else if (b->num_preds() == 2 && b->pred(1)->is_CatchProj() && b->pred(1)->as_CatchProj()->_con == CatchProjNode::fall_through_index) {
duke@435 1949 tty->print_cr(" # Block is sole successor of call");
duke@435 1950 }
duke@435 1951
duke@435 1952 // For all instructions
duke@435 1953 Node *delay = NULL;
duke@435 1954 for( uint j = 0; j<b->_nodes.size(); j++ ) {
duke@435 1955 if (VMThread::should_terminate()) { cut_short = true; break; }
duke@435 1956 n = b->_nodes[j];
duke@435 1957 if (valid_bundle_info(n)) {
duke@435 1958 Bundle *bundle = node_bundling(n);
duke@435 1959 if (bundle->used_in_unconditional_delay()) {
duke@435 1960 delay = n;
duke@435 1961 continue;
duke@435 1962 }
duke@435 1963 if (bundle->starts_bundle())
duke@435 1964 starts_bundle = '+';
duke@435 1965 }
duke@435 1966
coleenp@548 1967 if (WizardMode) n->dump();
coleenp@548 1968
duke@435 1969 if( !n->is_Region() && // Dont print in the Assembly
duke@435 1970 !n->is_Phi() && // a few noisely useless nodes
duke@435 1971 !n->is_Proj() &&
duke@435 1972 !n->is_MachTemp() &&
kvn@1535 1973 !n->is_SafePointScalarObject() &&
duke@435 1974 !n->is_Catch() && // Would be nice to print exception table targets
duke@435 1975 !n->is_MergeMem() && // Not very interesting
duke@435 1976 !n->is_top() && // Debug info table constants
duke@435 1977 !(n->is_Con() && !n->is_Mach())// Debug info table constants
duke@435 1978 ) {
duke@435 1979 if (pcs && n->_idx < pc_limit)
duke@435 1980 tty->print("%3.3x", pcs[n->_idx]);
duke@435 1981 else
duke@435 1982 tty->print(" ");
duke@435 1983 tty->print(" %c ", starts_bundle);
duke@435 1984 starts_bundle = ' ';
duke@435 1985 tty->print("\t");
duke@435 1986 n->format(_regalloc, tty);
duke@435 1987 tty->cr();
duke@435 1988 }
duke@435 1989
duke@435 1990 // If we have an instruction with a delay slot, and have seen a delay,
duke@435 1991 // then back up and print it
duke@435 1992 if (valid_bundle_info(n) && node_bundling(n)->use_unconditional_delay()) {
duke@435 1993 assert(delay != NULL, "no unconditional delay instruction");
coleenp@548 1994 if (WizardMode) delay->dump();
coleenp@548 1995
duke@435 1996 if (node_bundling(delay)->starts_bundle())
duke@435 1997 starts_bundle = '+';
duke@435 1998 if (pcs && n->_idx < pc_limit)
duke@435 1999 tty->print("%3.3x", pcs[n->_idx]);
duke@435 2000 else
duke@435 2001 tty->print(" ");
duke@435 2002 tty->print(" %c ", starts_bundle);
duke@435 2003 starts_bundle = ' ';
duke@435 2004 tty->print("\t");
duke@435 2005 delay->format(_regalloc, tty);
duke@435 2006 tty->print_cr("");
duke@435 2007 delay = NULL;
duke@435 2008 }
duke@435 2009
duke@435 2010 // Dump the exception table as well
duke@435 2011 if( n->is_Catch() && (Verbose || WizardMode) ) {
duke@435 2012 // Print the exception table for this offset
duke@435 2013 _handler_table.print_subtable_for(pc);
duke@435 2014 }
duke@435 2015 }
duke@435 2016
duke@435 2017 if (pcs && n->_idx < pc_limit)
duke@435 2018 tty->print_cr("%3.3x", pcs[n->_idx]);
duke@435 2019 else
duke@435 2020 tty->print_cr("");
duke@435 2021
duke@435 2022 assert(cut_short || delay == NULL, "no unconditional delay branch");
duke@435 2023
duke@435 2024 } // End of per-block dump
duke@435 2025 tty->print_cr("");
duke@435 2026
duke@435 2027 if (cut_short) tty->print_cr("*** disassembly is cut short ***");
duke@435 2028 }
duke@435 2029 #endif
duke@435 2030
duke@435 2031 //------------------------------Final_Reshape_Counts---------------------------
duke@435 2032 // This class defines counters to help identify when a method
duke@435 2033 // may/must be executed using hardware with only 24-bit precision.
duke@435 2034 struct Final_Reshape_Counts : public StackObj {
duke@435 2035 int _call_count; // count non-inlined 'common' calls
duke@435 2036 int _float_count; // count float ops requiring 24-bit precision
duke@435 2037 int _double_count; // count double ops requiring more precision
duke@435 2038 int _java_call_count; // count non-inlined 'java' calls
kvn@1294 2039 int _inner_loop_count; // count loops which need alignment
duke@435 2040 VectorSet _visited; // Visitation flags
duke@435 2041 Node_List _tests; // Set of IfNodes & PCTableNodes
duke@435 2042
duke@435 2043 Final_Reshape_Counts() :
kvn@1294 2044 _call_count(0), _float_count(0), _double_count(0),
kvn@1294 2045 _java_call_count(0), _inner_loop_count(0),
duke@435 2046 _visited( Thread::current()->resource_area() ) { }
duke@435 2047
duke@435 2048 void inc_call_count () { _call_count ++; }
duke@435 2049 void inc_float_count () { _float_count ++; }
duke@435 2050 void inc_double_count() { _double_count++; }
duke@435 2051 void inc_java_call_count() { _java_call_count++; }
kvn@1294 2052 void inc_inner_loop_count() { _inner_loop_count++; }
duke@435 2053
duke@435 2054 int get_call_count () const { return _call_count ; }
duke@435 2055 int get_float_count () const { return _float_count ; }
duke@435 2056 int get_double_count() const { return _double_count; }
duke@435 2057 int get_java_call_count() const { return _java_call_count; }
kvn@1294 2058 int get_inner_loop_count() const { return _inner_loop_count; }
duke@435 2059 };
duke@435 2060
duke@435 2061 static bool oop_offset_is_sane(const TypeInstPtr* tp) {
duke@435 2062 ciInstanceKlass *k = tp->klass()->as_instance_klass();
duke@435 2063 // Make sure the offset goes inside the instance layout.
coleenp@548 2064 return k->contains_field_offset(tp->offset());
duke@435 2065 // Note that OffsetBot and OffsetTop are very negative.
duke@435 2066 }
duke@435 2067
never@2780 2068 // Eliminate trivially redundant StoreCMs and accumulate their
never@2780 2069 // precedence edges.
never@2780 2070 static void eliminate_redundant_card_marks(Node* n) {
never@2780 2071 assert(n->Opcode() == Op_StoreCM, "expected StoreCM");
never@2780 2072 if (n->in(MemNode::Address)->outcnt() > 1) {
never@2780 2073 // There are multiple users of the same address so it might be
never@2780 2074 // possible to eliminate some of the StoreCMs
never@2780 2075 Node* mem = n->in(MemNode::Memory);
never@2780 2076 Node* adr = n->in(MemNode::Address);
never@2780 2077 Node* val = n->in(MemNode::ValueIn);
never@2780 2078 Node* prev = n;
never@2780 2079 bool done = false;
never@2780 2080 // Walk the chain of StoreCMs eliminating ones that match. As
never@2780 2081 // long as it's a chain of single users then the optimization is
never@2780 2082 // safe. Eliminating partially redundant StoreCMs would require
never@2780 2083 // cloning copies down the other paths.
never@2780 2084 while (mem->Opcode() == Op_StoreCM && mem->outcnt() == 1 && !done) {
never@2780 2085 if (adr == mem->in(MemNode::Address) &&
never@2780 2086 val == mem->in(MemNode::ValueIn)) {
never@2780 2087 // redundant StoreCM
never@2780 2088 if (mem->req() > MemNode::OopStore) {
never@2780 2089 // Hasn't been processed by this code yet.
never@2780 2090 n->add_prec(mem->in(MemNode::OopStore));
never@2780 2091 } else {
never@2780 2092 // Already converted to precedence edge
never@2780 2093 for (uint i = mem->req(); i < mem->len(); i++) {
never@2780 2094 // Accumulate any precedence edges
never@2780 2095 if (mem->in(i) != NULL) {
never@2780 2096 n->add_prec(mem->in(i));
never@2780 2097 }
never@2780 2098 }
never@2780 2099 // Everything above this point has been processed.
never@2780 2100 done = true;
never@2780 2101 }
never@2780 2102 // Eliminate the previous StoreCM
never@2780 2103 prev->set_req(MemNode::Memory, mem->in(MemNode::Memory));
never@2780 2104 assert(mem->outcnt() == 0, "should be dead");
never@2780 2105 mem->disconnect_inputs(NULL);
never@2780 2106 } else {
never@2780 2107 prev = mem;
never@2780 2108 }
never@2780 2109 mem = prev->in(MemNode::Memory);
never@2780 2110 }
never@2780 2111 }
never@2780 2112 }
never@2780 2113
duke@435 2114 //------------------------------final_graph_reshaping_impl----------------------
duke@435 2115 // Implement items 1-5 from final_graph_reshaping below.
kvn@1294 2116 static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc ) {
duke@435 2117
kvn@603 2118 if ( n->outcnt() == 0 ) return; // dead node
duke@435 2119 uint nop = n->Opcode();
duke@435 2120
duke@435 2121 // Check for 2-input instruction with "last use" on right input.
duke@435 2122 // Swap to left input. Implements item (2).
duke@435 2123 if( n->req() == 3 && // two-input instruction
duke@435 2124 n->in(1)->outcnt() > 1 && // left use is NOT a last use
duke@435 2125 (!n->in(1)->is_Phi() || n->in(1)->in(2) != n) && // it is not data loop
duke@435 2126 n->in(2)->outcnt() == 1 &&// right use IS a last use
duke@435 2127 !n->in(2)->is_Con() ) { // right use is not a constant
duke@435 2128 // Check for commutative opcode
duke@435 2129 switch( nop ) {
duke@435 2130 case Op_AddI: case Op_AddF: case Op_AddD: case Op_AddL:
duke@435 2131 case Op_MaxI: case Op_MinI:
duke@435 2132 case Op_MulI: case Op_MulF: case Op_MulD: case Op_MulL:
duke@435 2133 case Op_AndL: case Op_XorL: case Op_OrL:
duke@435 2134 case Op_AndI: case Op_XorI: case Op_OrI: {
duke@435 2135 // Move "last use" input to left by swapping inputs
duke@435 2136 n->swap_edges(1, 2);
duke@435 2137 break;
duke@435 2138 }
duke@435 2139 default:
duke@435 2140 break;
duke@435 2141 }
duke@435 2142 }
duke@435 2143
kvn@1964 2144 #ifdef ASSERT
kvn@1964 2145 if( n->is_Mem() ) {
kvn@1964 2146 Compile* C = Compile::current();
kvn@1964 2147 int alias_idx = C->get_alias_index(n->as_Mem()->adr_type());
kvn@1964 2148 assert( n->in(0) != NULL || alias_idx != Compile::AliasIdxRaw ||
kvn@1964 2149 // oop will be recorded in oop map if load crosses safepoint
kvn@1964 2150 n->is_Load() && (n->as_Load()->bottom_type()->isa_oopptr() ||
kvn@1964 2151 LoadNode::is_immutable_value(n->in(MemNode::Address))),
kvn@1964 2152 "raw memory operations should have control edge");
kvn@1964 2153 }
kvn@1964 2154 #endif
duke@435 2155 // Count FPU ops and common calls, implements item (3)
duke@435 2156 switch( nop ) {
duke@435 2157 // Count all float operations that may use FPU
duke@435 2158 case Op_AddF:
duke@435 2159 case Op_SubF:
duke@435 2160 case Op_MulF:
duke@435 2161 case Op_DivF:
duke@435 2162 case Op_NegF:
duke@435 2163 case Op_ModF:
duke@435 2164 case Op_ConvI2F:
duke@435 2165 case Op_ConF:
duke@435 2166 case Op_CmpF:
duke@435 2167 case Op_CmpF3:
duke@435 2168 // case Op_ConvL2F: // longs are split into 32-bit halves
kvn@1294 2169 frc.inc_float_count();
duke@435 2170 break;
duke@435 2171
duke@435 2172 case Op_ConvF2D:
duke@435 2173 case Op_ConvD2F:
kvn@1294 2174 frc.inc_float_count();
kvn@1294 2175 frc.inc_double_count();
duke@435 2176 break;
duke@435 2177
duke@435 2178 // Count all double operations that may use FPU
duke@435 2179 case Op_AddD:
duke@435 2180 case Op_SubD:
duke@435 2181 case Op_MulD:
duke@435 2182 case Op_DivD:
duke@435 2183 case Op_NegD:
duke@435 2184 case Op_ModD:
duke@435 2185 case Op_ConvI2D:
duke@435 2186 case Op_ConvD2I:
duke@435 2187 // case Op_ConvL2D: // handled by leaf call
duke@435 2188 // case Op_ConvD2L: // handled by leaf call
duke@435 2189 case Op_ConD:
duke@435 2190 case Op_CmpD:
duke@435 2191 case Op_CmpD3:
kvn@1294 2192 frc.inc_double_count();
duke@435 2193 break;
duke@435 2194 case Op_Opaque1: // Remove Opaque Nodes before matching
duke@435 2195 case Op_Opaque2: // Remove Opaque Nodes before matching
kvn@603 2196 n->subsume_by(n->in(1));
duke@435 2197 break;
duke@435 2198 case Op_CallStaticJava:
duke@435 2199 case Op_CallJava:
duke@435 2200 case Op_CallDynamicJava:
kvn@1294 2201 frc.inc_java_call_count(); // Count java call site;
duke@435 2202 case Op_CallRuntime:
duke@435 2203 case Op_CallLeaf:
duke@435 2204 case Op_CallLeafNoFP: {
duke@435 2205 assert( n->is_Call(), "" );
duke@435 2206 CallNode *call = n->as_Call();
duke@435 2207 // Count call sites where the FP mode bit would have to be flipped.
duke@435 2208 // Do not count uncommon runtime calls:
duke@435 2209 // uncommon_trap, _complete_monitor_locking, _complete_monitor_unlocking,
duke@435 2210 // _new_Java, _new_typeArray, _new_objArray, _rethrow_Java, ...
duke@435 2211 if( !call->is_CallStaticJava() || !call->as_CallStaticJava()->_name ) {
kvn@1294 2212 frc.inc_call_count(); // Count the call site
duke@435 2213 } else { // See if uncommon argument is shared
duke@435 2214 Node *n = call->in(TypeFunc::Parms);
duke@435 2215 int nop = n->Opcode();
duke@435 2216 // Clone shared simple arguments to uncommon calls, item (1).
duke@435 2217 if( n->outcnt() > 1 &&
duke@435 2218 !n->is_Proj() &&
duke@435 2219 nop != Op_CreateEx &&
duke@435 2220 nop != Op_CheckCastPP &&
kvn@766 2221 nop != Op_DecodeN &&
duke@435 2222 !n->is_Mem() ) {
duke@435 2223 Node *x = n->clone();
duke@435 2224 call->set_req( TypeFunc::Parms, x );
duke@435 2225 }
duke@435 2226 }
duke@435 2227 break;
duke@435 2228 }
duke@435 2229
duke@435 2230 case Op_StoreD:
duke@435 2231 case Op_LoadD:
duke@435 2232 case Op_LoadD_unaligned:
kvn@1294 2233 frc.inc_double_count();
duke@435 2234 goto handle_mem;
duke@435 2235 case Op_StoreF:
duke@435 2236 case Op_LoadF:
kvn@1294 2237 frc.inc_float_count();
duke@435 2238 goto handle_mem;
duke@435 2239
never@2780 2240 case Op_StoreCM:
never@2780 2241 {
never@2780 2242 // Convert OopStore dependence into precedence edge
never@2780 2243 Node* prec = n->in(MemNode::OopStore);
never@2780 2244 n->del_req(MemNode::OopStore);
never@2780 2245 n->add_prec(prec);
never@2780 2246 eliminate_redundant_card_marks(n);
never@2780 2247 }
never@2780 2248
never@2780 2249 // fall through
never@2780 2250
duke@435 2251 case Op_StoreB:
duke@435 2252 case Op_StoreC:
duke@435 2253 case Op_StorePConditional:
duke@435 2254 case Op_StoreI:
duke@435 2255 case Op_StoreL:
kvn@855 2256 case Op_StoreIConditional:
duke@435 2257 case Op_StoreLConditional:
duke@435 2258 case Op_CompareAndSwapI:
duke@435 2259 case Op_CompareAndSwapL:
duke@435 2260 case Op_CompareAndSwapP:
coleenp@548 2261 case Op_CompareAndSwapN:
duke@435 2262 case Op_StoreP:
coleenp@548 2263 case Op_StoreN:
duke@435 2264 case Op_LoadB:
twisti@1059 2265 case Op_LoadUB:
twisti@993 2266 case Op_LoadUS:
duke@435 2267 case Op_LoadI:
twisti@1059 2268 case Op_LoadUI2L:
duke@435 2269 case Op_LoadKlass:
kvn@599 2270 case Op_LoadNKlass:
duke@435 2271 case Op_LoadL:
duke@435 2272 case Op_LoadL_unaligned:
duke@435 2273 case Op_LoadPLocked:
duke@435 2274 case Op_LoadLLocked:
duke@435 2275 case Op_LoadP:
coleenp@548 2276 case Op_LoadN:
duke@435 2277 case Op_LoadRange:
duke@435 2278 case Op_LoadS: {
duke@435 2279 handle_mem:
duke@435 2280 #ifdef ASSERT
duke@435 2281 if( VerifyOptoOopOffsets ) {
duke@435 2282 assert( n->is_Mem(), "" );
duke@435 2283 MemNode *mem = (MemNode*)n;
duke@435 2284 // Check to see if address types have grounded out somehow.
duke@435 2285 const TypeInstPtr *tp = mem->in(MemNode::Address)->bottom_type()->isa_instptr();
duke@435 2286 assert( !tp || oop_offset_is_sane(tp), "" );
duke@435 2287 }
duke@435 2288 #endif
duke@435 2289 break;
duke@435 2290 }
duke@435 2291
duke@435 2292 case Op_AddP: { // Assert sane base pointers
kvn@617 2293 Node *addp = n->in(AddPNode::Address);
duke@435 2294 assert( !addp->is_AddP() ||
duke@435 2295 addp->in(AddPNode::Base)->is_top() || // Top OK for allocation
duke@435 2296 addp->in(AddPNode::Base) == n->in(AddPNode::Base),
duke@435 2297 "Base pointers must match" );
kvn@617 2298 #ifdef _LP64
kvn@617 2299 if (UseCompressedOops &&
kvn@617 2300 addp->Opcode() == Op_ConP &&
kvn@617 2301 addp == n->in(AddPNode::Base) &&
kvn@617 2302 n->in(AddPNode::Offset)->is_Con()) {
kvn@617 2303 // Use addressing with narrow klass to load with offset on x86.
kvn@617 2304 // On sparc loading 32-bits constant and decoding it have less
kvn@617 2305 // instructions (4) then load 64-bits constant (7).
kvn@617 2306 // Do this transformation here since IGVN will convert ConN back to ConP.
kvn@617 2307 const Type* t = addp->bottom_type();
kvn@617 2308 if (t->isa_oopptr()) {
kvn@617 2309 Node* nn = NULL;
kvn@617 2310
kvn@617 2311 // Look for existing ConN node of the same exact type.
kvn@617 2312 Compile* C = Compile::current();
kvn@617 2313 Node* r = C->root();
kvn@617 2314 uint cnt = r->outcnt();
kvn@617 2315 for (uint i = 0; i < cnt; i++) {
kvn@617 2316 Node* m = r->raw_out(i);
kvn@617 2317 if (m!= NULL && m->Opcode() == Op_ConN &&
kvn@656 2318 m->bottom_type()->make_ptr() == t) {
kvn@617 2319 nn = m;
kvn@617 2320 break;
kvn@617 2321 }
kvn@617 2322 }
kvn@617 2323 if (nn != NULL) {
kvn@617 2324 // Decode a narrow oop to match address
kvn@617 2325 // [R12 + narrow_oop_reg<<3 + offset]
kvn@617 2326 nn = new (C, 2) DecodeNNode(nn, t);
kvn@617 2327 n->set_req(AddPNode::Base, nn);
kvn@617 2328 n->set_req(AddPNode::Address, nn);
kvn@617 2329 if (addp->outcnt() == 0) {
kvn@617 2330 addp->disconnect_inputs(NULL);
kvn@617 2331 }
kvn@617 2332 }
kvn@617 2333 }
kvn@617 2334 }
kvn@617 2335 #endif
duke@435 2336 break;
duke@435 2337 }
duke@435 2338
kvn@599 2339 #ifdef _LP64
kvn@803 2340 case Op_CastPP:
kvn@1930 2341 if (n->in(1)->is_DecodeN() && Matcher::gen_narrow_oop_implicit_null_checks()) {
kvn@803 2342 Compile* C = Compile::current();
kvn@803 2343 Node* in1 = n->in(1);
kvn@803 2344 const Type* t = n->bottom_type();
kvn@803 2345 Node* new_in1 = in1->clone();
kvn@803 2346 new_in1->as_DecodeN()->set_type(t);
kvn@803 2347
kvn@1930 2348 if (!Matcher::narrow_oop_use_complex_address()) {
kvn@803 2349 //
kvn@803 2350 // x86, ARM and friends can handle 2 adds in addressing mode
kvn@803 2351 // and Matcher can fold a DecodeN node into address by using
kvn@803 2352 // a narrow oop directly and do implicit NULL check in address:
kvn@803 2353 //
kvn@803 2354 // [R12 + narrow_oop_reg<<3 + offset]
kvn@803 2355 // NullCheck narrow_oop_reg
kvn@803 2356 //
kvn@803 2357 // On other platforms (Sparc) we have to keep new DecodeN node and
kvn@803 2358 // use it to do implicit NULL check in address:
kvn@803 2359 //
kvn@803 2360 // decode_not_null narrow_oop_reg, base_reg
kvn@803 2361 // [base_reg + offset]
kvn@803 2362 // NullCheck base_reg
kvn@803 2363 //
twisti@1040 2364 // Pin the new DecodeN node to non-null path on these platform (Sparc)
kvn@803 2365 // to keep the information to which NULL check the new DecodeN node
kvn@803 2366 // corresponds to use it as value in implicit_null_check().
kvn@803 2367 //
kvn@803 2368 new_in1->set_req(0, n->in(0));
kvn@803 2369 }
kvn@803 2370
kvn@803 2371 n->subsume_by(new_in1);
kvn@803 2372 if (in1->outcnt() == 0) {
kvn@803 2373 in1->disconnect_inputs(NULL);
kvn@803 2374 }
kvn@803 2375 }
kvn@803 2376 break;
kvn@803 2377
kvn@599 2378 case Op_CmpP:
kvn@603 2379 // Do this transformation here to preserve CmpPNode::sub() and
kvn@603 2380 // other TypePtr related Ideal optimizations (for example, ptr nullness).
kvn@766 2381 if (n->in(1)->is_DecodeN() || n->in(2)->is_DecodeN()) {
kvn@766 2382 Node* in1 = n->in(1);
kvn@766 2383 Node* in2 = n->in(2);
kvn@766 2384 if (!in1->is_DecodeN()) {
kvn@766 2385 in2 = in1;
kvn@766 2386 in1 = n->in(2);
kvn@766 2387 }
kvn@766 2388 assert(in1->is_DecodeN(), "sanity");
kvn@766 2389
kvn@599 2390 Compile* C = Compile::current();
kvn@766 2391 Node* new_in2 = NULL;
kvn@766 2392 if (in2->is_DecodeN()) {
kvn@766 2393 new_in2 = in2->in(1);
kvn@766 2394 } else if (in2->Opcode() == Op_ConP) {
kvn@766 2395 const Type* t = in2->bottom_type();
kvn@1930 2396 if (t == TypePtr::NULL_PTR) {
kvn@1930 2397 // Don't convert CmpP null check into CmpN if compressed
kvn@1930 2398 // oops implicit null check is not generated.
kvn@1930 2399 // This will allow to generate normal oop implicit null check.
kvn@1930 2400 if (Matcher::gen_narrow_oop_implicit_null_checks())
kvn@1930 2401 new_in2 = ConNode::make(C, TypeNarrowOop::NULL_PTR);
kvn@803 2402 //
kvn@803 2403 // This transformation together with CastPP transformation above
kvn@803 2404 // will generated code for implicit NULL checks for compressed oops.
kvn@803 2405 //
kvn@803 2406 // The original code after Optimize()
kvn@803 2407 //
kvn@803 2408 // LoadN memory, narrow_oop_reg
kvn@803 2409 // decode narrow_oop_reg, base_reg
kvn@803 2410 // CmpP base_reg, NULL
kvn@803 2411 // CastPP base_reg // NotNull
kvn@803 2412 // Load [base_reg + offset], val_reg
kvn@803 2413 //
kvn@803 2414 // after these transformations will be
kvn@803 2415 //
kvn@803 2416 // LoadN memory, narrow_oop_reg
kvn@803 2417 // CmpN narrow_oop_reg, NULL
kvn@803 2418 // decode_not_null narrow_oop_reg, base_reg
kvn@803 2419 // Load [base_reg + offset], val_reg
kvn@803 2420 //
kvn@803 2421 // and the uncommon path (== NULL) will use narrow_oop_reg directly
kvn@803 2422 // since narrow oops can be used in debug info now (see the code in
kvn@803 2423 // final_graph_reshaping_walk()).
kvn@803 2424 //
kvn@803 2425 // At the end the code will be matched to
kvn@803 2426 // on x86:
kvn@803 2427 //
kvn@803 2428 // Load_narrow_oop memory, narrow_oop_reg
kvn@803 2429 // Load [R12 + narrow_oop_reg<<3 + offset], val_reg
kvn@803 2430 // NullCheck narrow_oop_reg
kvn@803 2431 //
kvn@803 2432 // and on sparc:
kvn@803 2433 //
kvn@803 2434 // Load_narrow_oop memory, narrow_oop_reg
kvn@803 2435 // decode_not_null narrow_oop_reg, base_reg
kvn@803 2436 // Load [base_reg + offset], val_reg
kvn@803 2437 // NullCheck base_reg
kvn@803 2438 //
kvn@599 2439 } else if (t->isa_oopptr()) {
kvn@766 2440 new_in2 = ConNode::make(C, t->make_narrowoop());
kvn@599 2441 }
kvn@599 2442 }
kvn@766 2443 if (new_in2 != NULL) {
kvn@766 2444 Node* cmpN = new (C, 3) CmpNNode(in1->in(1), new_in2);
kvn@603 2445 n->subsume_by( cmpN );
kvn@766 2446 if (in1->outcnt() == 0) {
kvn@766 2447 in1->disconnect_inputs(NULL);
kvn@766 2448 }
kvn@766 2449 if (in2->outcnt() == 0) {
kvn@766 2450 in2->disconnect_inputs(NULL);
kvn@766 2451 }
kvn@599 2452 }
kvn@599 2453 }
kvn@728 2454 break;
kvn@803 2455
kvn@803 2456 case Op_DecodeN:
kvn@803 2457 assert(!n->in(1)->is_EncodeP(), "should be optimized out");
kvn@1930 2458 // DecodeN could be pinned when it can't be fold into
kvn@927 2459 // an address expression, see the code for Op_CastPP above.
kvn@1930 2460 assert(n->in(0) == NULL || !Matcher::narrow_oop_use_complex_address(), "no control");
kvn@803 2461 break;
kvn@803 2462
kvn@803 2463 case Op_EncodeP: {
kvn@803 2464 Node* in1 = n->in(1);
kvn@803 2465 if (in1->is_DecodeN()) {
kvn@803 2466 n->subsume_by(in1->in(1));
kvn@803 2467 } else if (in1->Opcode() == Op_ConP) {
kvn@803 2468 Compile* C = Compile::current();
kvn@803 2469 const Type* t = in1->bottom_type();
kvn@803 2470 if (t == TypePtr::NULL_PTR) {
kvn@803 2471 n->subsume_by(ConNode::make(C, TypeNarrowOop::NULL_PTR));
kvn@803 2472 } else if (t->isa_oopptr()) {
kvn@803 2473 n->subsume_by(ConNode::make(C, t->make_narrowoop()));
kvn@803 2474 }
kvn@803 2475 }
kvn@803 2476 if (in1->outcnt() == 0) {
kvn@803 2477 in1->disconnect_inputs(NULL);
kvn@803 2478 }
kvn@803 2479 break;
kvn@803 2480 }
kvn@803 2481
never@1515 2482 case Op_Proj: {
never@1515 2483 if (OptimizeStringConcat) {
never@1515 2484 ProjNode* p = n->as_Proj();
never@1515 2485 if (p->_is_io_use) {
never@1515 2486 // Separate projections were used for the exception path which
never@1515 2487 // are normally removed by a late inline. If it wasn't inlined
never@1515 2488 // then they will hang around and should just be replaced with
never@1515 2489 // the original one.
never@1515 2490 Node* proj = NULL;
never@1515 2491 // Replace with just one
never@1515 2492 for (SimpleDUIterator i(p->in(0)); i.has_next(); i.next()) {
never@1515 2493 Node *use = i.get();
never@1515 2494 if (use->is_Proj() && p != use && use->as_Proj()->_con == p->_con) {
never@1515 2495 proj = use;
never@1515 2496 break;
never@1515 2497 }
never@1515 2498 }
never@1515 2499 assert(p != NULL, "must be found");
never@1515 2500 p->subsume_by(proj);
never@1515 2501 }
never@1515 2502 }
never@1515 2503 break;
never@1515 2504 }
never@1515 2505
kvn@803 2506 case Op_Phi:
kvn@803 2507 if (n->as_Phi()->bottom_type()->isa_narrowoop()) {
kvn@803 2508 // The EncodeP optimization may create Phi with the same edges
kvn@803 2509 // for all paths. It is not handled well by Register Allocator.
kvn@803 2510 Node* unique_in = n->in(1);
kvn@803 2511 assert(unique_in != NULL, "");
kvn@803 2512 uint cnt = n->req();
kvn@803 2513 for (uint i = 2; i < cnt; i++) {
kvn@803 2514 Node* m = n->in(i);
kvn@803 2515 assert(m != NULL, "");
kvn@803 2516 if (unique_in != m)
kvn@803 2517 unique_in = NULL;
kvn@803 2518 }
kvn@803 2519 if (unique_in != NULL) {
kvn@803 2520 n->subsume_by(unique_in);
kvn@803 2521 }
kvn@803 2522 }
kvn@803 2523 break;
kvn@803 2524
kvn@599 2525 #endif
kvn@599 2526
duke@435 2527 case Op_ModI:
duke@435 2528 if (UseDivMod) {
duke@435 2529 // Check if a%b and a/b both exist
duke@435 2530 Node* d = n->find_similar(Op_DivI);
duke@435 2531 if (d) {
duke@435 2532 // Replace them with a fused divmod if supported
duke@435 2533 Compile* C = Compile::current();
duke@435 2534 if (Matcher::has_match_rule(Op_DivModI)) {
duke@435 2535 DivModINode* divmod = DivModINode::make(C, n);
kvn@603 2536 d->subsume_by(divmod->div_proj());
kvn@603 2537 n->subsume_by(divmod->mod_proj());
duke@435 2538 } else {
duke@435 2539 // replace a%b with a-((a/b)*b)
duke@435 2540 Node* mult = new (C, 3) MulINode(d, d->in(2));
duke@435 2541 Node* sub = new (C, 3) SubINode(d->in(1), mult);
kvn@603 2542 n->subsume_by( sub );
duke@435 2543 }
duke@435 2544 }
duke@435 2545 }
duke@435 2546 break;
duke@435 2547
duke@435 2548 case Op_ModL:
duke@435 2549 if (UseDivMod) {
duke@435 2550 // Check if a%b and a/b both exist
duke@435 2551 Node* d = n->find_similar(Op_DivL);
duke@435 2552 if (d) {
duke@435 2553 // Replace them with a fused divmod if supported
duke@435 2554 Compile* C = Compile::current();
duke@435 2555 if (Matcher::has_match_rule(Op_DivModL)) {
duke@435 2556 DivModLNode* divmod = DivModLNode::make(C, n);
kvn@603 2557 d->subsume_by(divmod->div_proj());
kvn@603 2558 n->subsume_by(divmod->mod_proj());
duke@435 2559 } else {
duke@435 2560 // replace a%b with a-((a/b)*b)
duke@435 2561 Node* mult = new (C, 3) MulLNode(d, d->in(2));
duke@435 2562 Node* sub = new (C, 3) SubLNode(d->in(1), mult);
kvn@603 2563 n->subsume_by( sub );
duke@435 2564 }
duke@435 2565 }
duke@435 2566 }
duke@435 2567 break;
duke@435 2568
duke@435 2569 case Op_Load16B:
duke@435 2570 case Op_Load8B:
duke@435 2571 case Op_Load4B:
duke@435 2572 case Op_Load8S:
duke@435 2573 case Op_Load4S:
duke@435 2574 case Op_Load2S:
duke@435 2575 case Op_Load8C:
duke@435 2576 case Op_Load4C:
duke@435 2577 case Op_Load2C:
duke@435 2578 case Op_Load4I:
duke@435 2579 case Op_Load2I:
duke@435 2580 case Op_Load2L:
duke@435 2581 case Op_Load4F:
duke@435 2582 case Op_Load2F:
duke@435 2583 case Op_Load2D:
duke@435 2584 case Op_Store16B:
duke@435 2585 case Op_Store8B:
duke@435 2586 case Op_Store4B:
duke@435 2587 case Op_Store8C:
duke@435 2588 case Op_Store4C:
duke@435 2589 case Op_Store2C:
duke@435 2590 case Op_Store4I:
duke@435 2591 case Op_Store2I:
duke@435 2592 case Op_Store2L:
duke@435 2593 case Op_Store4F:
duke@435 2594 case Op_Store2F:
duke@435 2595 case Op_Store2D:
duke@435 2596 break;
duke@435 2597
duke@435 2598 case Op_PackB:
duke@435 2599 case Op_PackS:
duke@435 2600 case Op_PackC:
duke@435 2601 case Op_PackI:
duke@435 2602 case Op_PackF:
duke@435 2603 case Op_PackL:
duke@435 2604 case Op_PackD:
duke@435 2605 if (n->req()-1 > 2) {
duke@435 2606 // Replace many operand PackNodes with a binary tree for matching
duke@435 2607 PackNode* p = (PackNode*) n;
duke@435 2608 Node* btp = p->binaryTreePack(Compile::current(), 1, n->req());
kvn@603 2609 n->subsume_by(btp);
duke@435 2610 }
duke@435 2611 break;
kvn@1294 2612 case Op_Loop:
kvn@1294 2613 case Op_CountedLoop:
kvn@1294 2614 if (n->as_Loop()->is_inner_loop()) {
kvn@1294 2615 frc.inc_inner_loop_count();
kvn@1294 2616 }
kvn@1294 2617 break;
duke@435 2618 default:
duke@435 2619 assert( !n->is_Call(), "" );
duke@435 2620 assert( !n->is_Mem(), "" );
duke@435 2621 break;
duke@435 2622 }
never@562 2623
never@562 2624 // Collect CFG split points
never@562 2625 if (n->is_MultiBranch())
kvn@1294 2626 frc._tests.push(n);
duke@435 2627 }
duke@435 2628
duke@435 2629 //------------------------------final_graph_reshaping_walk---------------------
duke@435 2630 // Replacing Opaque nodes with their input in final_graph_reshaping_impl(),
duke@435 2631 // requires that the walk visits a node's inputs before visiting the node.
kvn@1294 2632 static void final_graph_reshaping_walk( Node_Stack &nstack, Node *root, Final_Reshape_Counts &frc ) {
kvn@766 2633 ResourceArea *area = Thread::current()->resource_area();
kvn@766 2634 Unique_Node_List sfpt(area);
kvn@766 2635
kvn@1294 2636 frc._visited.set(root->_idx); // first, mark node as visited
duke@435 2637 uint cnt = root->req();
duke@435 2638 Node *n = root;
duke@435 2639 uint i = 0;
duke@435 2640 while (true) {
duke@435 2641 if (i < cnt) {
duke@435 2642 // Place all non-visited non-null inputs onto stack
duke@435 2643 Node* m = n->in(i);
duke@435 2644 ++i;
kvn@1294 2645 if (m != NULL && !frc._visited.test_set(m->_idx)) {
kvn@766 2646 if (m->is_SafePoint() && m->as_SafePoint()->jvms() != NULL)
kvn@766 2647 sfpt.push(m);
duke@435 2648 cnt = m->req();
duke@435 2649 nstack.push(n, i); // put on stack parent and next input's index
duke@435 2650 n = m;
duke@435 2651 i = 0;
duke@435 2652 }
duke@435 2653 } else {
duke@435 2654 // Now do post-visit work
kvn@1294 2655 final_graph_reshaping_impl( n, frc );
duke@435 2656 if (nstack.is_empty())
duke@435 2657 break; // finished
duke@435 2658 n = nstack.node(); // Get node from stack
duke@435 2659 cnt = n->req();
duke@435 2660 i = nstack.index();
duke@435 2661 nstack.pop(); // Shift to the next node on stack
duke@435 2662 }
duke@435 2663 }
kvn@766 2664
kvn@1930 2665 // Skip next transformation if compressed oops are not used.
kvn@1930 2666 if (!UseCompressedOops || !Matcher::gen_narrow_oop_implicit_null_checks())
kvn@1930 2667 return;
kvn@1930 2668
kvn@766 2669 // Go over safepoints nodes to skip DecodeN nodes for debug edges.
kvn@766 2670 // It could be done for an uncommon traps or any safepoints/calls
kvn@766 2671 // if the DecodeN node is referenced only in a debug info.
kvn@766 2672 while (sfpt.size() > 0) {
kvn@766 2673 n = sfpt.pop();
kvn@766 2674 JVMState *jvms = n->as_SafePoint()->jvms();
kvn@766 2675 assert(jvms != NULL, "sanity");
kvn@766 2676 int start = jvms->debug_start();
kvn@766 2677 int end = n->req();
kvn@766 2678 bool is_uncommon = (n->is_CallStaticJava() &&
kvn@766 2679 n->as_CallStaticJava()->uncommon_trap_request() != 0);
kvn@766 2680 for (int j = start; j < end; j++) {
kvn@766 2681 Node* in = n->in(j);
kvn@766 2682 if (in->is_DecodeN()) {
kvn@766 2683 bool safe_to_skip = true;
kvn@766 2684 if (!is_uncommon ) {
kvn@766 2685 // Is it safe to skip?
kvn@766 2686 for (uint i = 0; i < in->outcnt(); i++) {
kvn@766 2687 Node* u = in->raw_out(i);
kvn@766 2688 if (!u->is_SafePoint() ||
kvn@766 2689 u->is_Call() && u->as_Call()->has_non_debug_use(n)) {
kvn@766 2690 safe_to_skip = false;
kvn@766 2691 }
kvn@766 2692 }
kvn@766 2693 }
kvn@766 2694 if (safe_to_skip) {
kvn@766 2695 n->set_req(j, in->in(1));
kvn@766 2696 }
kvn@766 2697 if (in->outcnt() == 0) {
kvn@766 2698 in->disconnect_inputs(NULL);
kvn@766 2699 }
kvn@766 2700 }
kvn@766 2701 }
kvn@766 2702 }
duke@435 2703 }
duke@435 2704
duke@435 2705 //------------------------------final_graph_reshaping--------------------------
duke@435 2706 // Final Graph Reshaping.
duke@435 2707 //
duke@435 2708 // (1) Clone simple inputs to uncommon calls, so they can be scheduled late
duke@435 2709 // and not commoned up and forced early. Must come after regular
duke@435 2710 // optimizations to avoid GVN undoing the cloning. Clone constant
duke@435 2711 // inputs to Loop Phis; these will be split by the allocator anyways.
duke@435 2712 // Remove Opaque nodes.
duke@435 2713 // (2) Move last-uses by commutative operations to the left input to encourage
duke@435 2714 // Intel update-in-place two-address operations and better register usage
duke@435 2715 // on RISCs. Must come after regular optimizations to avoid GVN Ideal
duke@435 2716 // calls canonicalizing them back.
duke@435 2717 // (3) Count the number of double-precision FP ops, single-precision FP ops
duke@435 2718 // and call sites. On Intel, we can get correct rounding either by
duke@435 2719 // forcing singles to memory (requires extra stores and loads after each
duke@435 2720 // FP bytecode) or we can set a rounding mode bit (requires setting and
duke@435 2721 // clearing the mode bit around call sites). The mode bit is only used
duke@435 2722 // if the relative frequency of single FP ops to calls is low enough.
duke@435 2723 // This is a key transform for SPEC mpeg_audio.
duke@435 2724 // (4) Detect infinite loops; blobs of code reachable from above but not
duke@435 2725 // below. Several of the Code_Gen algorithms fail on such code shapes,
duke@435 2726 // so we simply bail out. Happens a lot in ZKM.jar, but also happens
duke@435 2727 // from time to time in other codes (such as -Xcomp finalizer loops, etc).
duke@435 2728 // Detection is by looking for IfNodes where only 1 projection is
duke@435 2729 // reachable from below or CatchNodes missing some targets.
duke@435 2730 // (5) Assert for insane oop offsets in debug mode.
duke@435 2731
duke@435 2732 bool Compile::final_graph_reshaping() {
duke@435 2733 // an infinite loop may have been eliminated by the optimizer,
duke@435 2734 // in which case the graph will be empty.
duke@435 2735 if (root()->req() == 1) {
duke@435 2736 record_method_not_compilable("trivial infinite loop");
duke@435 2737 return true;
duke@435 2738 }
duke@435 2739
kvn@1294 2740 Final_Reshape_Counts frc;
duke@435 2741
duke@435 2742 // Visit everybody reachable!
duke@435 2743 // Allocate stack of size C->unique()/2 to avoid frequent realloc
duke@435 2744 Node_Stack nstack(unique() >> 1);
kvn@1294 2745 final_graph_reshaping_walk(nstack, root(), frc);
duke@435 2746
duke@435 2747 // Check for unreachable (from below) code (i.e., infinite loops).
kvn@1294 2748 for( uint i = 0; i < frc._tests.size(); i++ ) {
kvn@1294 2749 MultiBranchNode *n = frc._tests[i]->as_MultiBranch();
never@562 2750 // Get number of CFG targets.
duke@435 2751 // Note that PCTables include exception targets after calls.
never@562 2752 uint required_outcnt = n->required_outcnt();
never@562 2753 if (n->outcnt() != required_outcnt) {
duke@435 2754 // Check for a few special cases. Rethrow Nodes never take the
duke@435 2755 // 'fall-thru' path, so expected kids is 1 less.
duke@435 2756 if (n->is_PCTable() && n->in(0) && n->in(0)->in(0)) {
duke@435 2757 if (n->in(0)->in(0)->is_Call()) {
duke@435 2758 CallNode *call = n->in(0)->in(0)->as_Call();
duke@435 2759 if (call->entry_point() == OptoRuntime::rethrow_stub()) {
never@562 2760 required_outcnt--; // Rethrow always has 1 less kid
duke@435 2761 } else if (call->req() > TypeFunc::Parms &&
duke@435 2762 call->is_CallDynamicJava()) {
duke@435 2763 // Check for null receiver. In such case, the optimizer has
duke@435 2764 // detected that the virtual call will always result in a null
duke@435 2765 // pointer exception. The fall-through projection of this CatchNode
duke@435 2766 // will not be populated.
duke@435 2767 Node *arg0 = call->in(TypeFunc::Parms);
duke@435 2768 if (arg0->is_Type() &&
duke@435 2769 arg0->as_Type()->type()->higher_equal(TypePtr::NULL_PTR)) {
never@562 2770 required_outcnt--;
duke@435 2771 }
duke@435 2772 } else if (call->entry_point() == OptoRuntime::new_array_Java() &&
duke@435 2773 call->req() > TypeFunc::Parms+1 &&
duke@435 2774 call->is_CallStaticJava()) {
duke@435 2775 // Check for negative array length. In such case, the optimizer has
duke@435 2776 // detected that the allocation attempt will always result in an
duke@435 2777 // exception. There is no fall-through projection of this CatchNode .
duke@435 2778 Node *arg1 = call->in(TypeFunc::Parms+1);
duke@435 2779 if (arg1->is_Type() &&
duke@435 2780 arg1->as_Type()->type()->join(TypeInt::POS)->empty()) {
never@562 2781 required_outcnt--;
duke@435 2782 }
duke@435 2783 }
duke@435 2784 }
duke@435 2785 }
never@562 2786 // Recheck with a better notion of 'required_outcnt'
never@562 2787 if (n->outcnt() != required_outcnt) {
duke@435 2788 record_method_not_compilable("malformed control flow");
duke@435 2789 return true; // Not all targets reachable!
duke@435 2790 }
duke@435 2791 }
duke@435 2792 // Check that I actually visited all kids. Unreached kids
duke@435 2793 // must be infinite loops.
duke@435 2794 for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++)
kvn@1294 2795 if (!frc._visited.test(n->fast_out(j)->_idx)) {
duke@435 2796 record_method_not_compilable("infinite loop");
duke@435 2797 return true; // Found unvisited kid; must be unreach
duke@435 2798 }
duke@435 2799 }
duke@435 2800
duke@435 2801 // If original bytecodes contained a mixture of floats and doubles
duke@435 2802 // check if the optimizer has made it homogenous, item (3).
never@1364 2803 if( Use24BitFPMode && Use24BitFP && UseSSE == 0 &&
kvn@1294 2804 frc.get_float_count() > 32 &&
kvn@1294 2805 frc.get_double_count() == 0 &&
kvn@1294 2806 (10 * frc.get_call_count() < frc.get_float_count()) ) {
duke@435 2807 set_24_bit_selection_and_mode( false, true );
duke@435 2808 }
duke@435 2809
kvn@1294 2810 set_java_calls(frc.get_java_call_count());
kvn@1294 2811 set_inner_loops(frc.get_inner_loop_count());
duke@435 2812
duke@435 2813 // No infinite loops, no reason to bail out.
duke@435 2814 return false;
duke@435 2815 }
duke@435 2816
duke@435 2817 //-----------------------------too_many_traps----------------------------------
duke@435 2818 // Report if there are too many traps at the current method and bci.
duke@435 2819 // Return true if there was a trap, and/or PerMethodTrapLimit is exceeded.
duke@435 2820 bool Compile::too_many_traps(ciMethod* method,
duke@435 2821 int bci,
duke@435 2822 Deoptimization::DeoptReason reason) {
duke@435 2823 ciMethodData* md = method->method_data();
duke@435 2824 if (md->is_empty()) {
duke@435 2825 // Assume the trap has not occurred, or that it occurred only
duke@435 2826 // because of a transient condition during start-up in the interpreter.
duke@435 2827 return false;
duke@435 2828 }
duke@435 2829 if (md->has_trap_at(bci, reason) != 0) {
duke@435 2830 // Assume PerBytecodeTrapLimit==0, for a more conservative heuristic.
duke@435 2831 // Also, if there are multiple reasons, or if there is no per-BCI record,
duke@435 2832 // assume the worst.
duke@435 2833 if (log())
duke@435 2834 log()->elem("observe trap='%s' count='%d'",
duke@435 2835 Deoptimization::trap_reason_name(reason),
duke@435 2836 md->trap_count(reason));
duke@435 2837 return true;
duke@435 2838 } else {
duke@435 2839 // Ignore method/bci and see if there have been too many globally.
duke@435 2840 return too_many_traps(reason, md);
duke@435 2841 }
duke@435 2842 }
duke@435 2843
duke@435 2844 // Less-accurate variant which does not require a method and bci.
duke@435 2845 bool Compile::too_many_traps(Deoptimization::DeoptReason reason,
duke@435 2846 ciMethodData* logmd) {
duke@435 2847 if (trap_count(reason) >= (uint)PerMethodTrapLimit) {
duke@435 2848 // Too many traps globally.
duke@435 2849 // Note that we use cumulative trap_count, not just md->trap_count.
duke@435 2850 if (log()) {
duke@435 2851 int mcount = (logmd == NULL)? -1: (int)logmd->trap_count(reason);
duke@435 2852 log()->elem("observe trap='%s' count='0' mcount='%d' ccount='%d'",
duke@435 2853 Deoptimization::trap_reason_name(reason),
duke@435 2854 mcount, trap_count(reason));
duke@435 2855 }
duke@435 2856 return true;
duke@435 2857 } else {
duke@435 2858 // The coast is clear.
duke@435 2859 return false;
duke@435 2860 }
duke@435 2861 }
duke@435 2862
duke@435 2863 //--------------------------too_many_recompiles--------------------------------
duke@435 2864 // Report if there are too many recompiles at the current method and bci.
duke@435 2865 // Consults PerBytecodeRecompilationCutoff and PerMethodRecompilationCutoff.
duke@435 2866 // Is not eager to return true, since this will cause the compiler to use
duke@435 2867 // Action_none for a trap point, to avoid too many recompilations.
duke@435 2868 bool Compile::too_many_recompiles(ciMethod* method,
duke@435 2869 int bci,
duke@435 2870 Deoptimization::DeoptReason reason) {
duke@435 2871 ciMethodData* md = method->method_data();
duke@435 2872 if (md->is_empty()) {
duke@435 2873 // Assume the trap has not occurred, or that it occurred only
duke@435 2874 // because of a transient condition during start-up in the interpreter.
duke@435 2875 return false;
duke@435 2876 }
duke@435 2877 // Pick a cutoff point well within PerBytecodeRecompilationCutoff.
duke@435 2878 uint bc_cutoff = (uint) PerBytecodeRecompilationCutoff / 8;
duke@435 2879 uint m_cutoff = (uint) PerMethodRecompilationCutoff / 2 + 1; // not zero
duke@435 2880 Deoptimization::DeoptReason per_bc_reason
duke@435 2881 = Deoptimization::reason_recorded_per_bytecode_if_any(reason);
duke@435 2882 if ((per_bc_reason == Deoptimization::Reason_none
duke@435 2883 || md->has_trap_at(bci, reason) != 0)
duke@435 2884 // The trap frequency measure we care about is the recompile count:
duke@435 2885 && md->trap_recompiled_at(bci)
duke@435 2886 && md->overflow_recompile_count() >= bc_cutoff) {
duke@435 2887 // Do not emit a trap here if it has already caused recompilations.
duke@435 2888 // Also, if there are multiple reasons, or if there is no per-BCI record,
duke@435 2889 // assume the worst.
duke@435 2890 if (log())
duke@435 2891 log()->elem("observe trap='%s recompiled' count='%d' recompiles2='%d'",
duke@435 2892 Deoptimization::trap_reason_name(reason),
duke@435 2893 md->trap_count(reason),
duke@435 2894 md->overflow_recompile_count());
duke@435 2895 return true;
duke@435 2896 } else if (trap_count(reason) != 0
duke@435 2897 && decompile_count() >= m_cutoff) {
duke@435 2898 // Too many recompiles globally, and we have seen this sort of trap.
duke@435 2899 // Use cumulative decompile_count, not just md->decompile_count.
duke@435 2900 if (log())
duke@435 2901 log()->elem("observe trap='%s' count='%d' mcount='%d' decompiles='%d' mdecompiles='%d'",
duke@435 2902 Deoptimization::trap_reason_name(reason),
duke@435 2903 md->trap_count(reason), trap_count(reason),
duke@435 2904 md->decompile_count(), decompile_count());
duke@435 2905 return true;
duke@435 2906 } else {
duke@435 2907 // The coast is clear.
duke@435 2908 return false;
duke@435 2909 }
duke@435 2910 }
duke@435 2911
duke@435 2912
duke@435 2913 #ifndef PRODUCT
duke@435 2914 //------------------------------verify_graph_edges---------------------------
duke@435 2915 // Walk the Graph and verify that there is a one-to-one correspondence
duke@435 2916 // between Use-Def edges and Def-Use edges in the graph.
duke@435 2917 void Compile::verify_graph_edges(bool no_dead_code) {
duke@435 2918 if (VerifyGraphEdges) {
duke@435 2919 ResourceArea *area = Thread::current()->resource_area();
duke@435 2920 Unique_Node_List visited(area);
duke@435 2921 // Call recursive graph walk to check edges
duke@435 2922 _root->verify_edges(visited);
duke@435 2923 if (no_dead_code) {
duke@435 2924 // Now make sure that no visited node is used by an unvisited node.
duke@435 2925 bool dead_nodes = 0;
duke@435 2926 Unique_Node_List checked(area);
duke@435 2927 while (visited.size() > 0) {
duke@435 2928 Node* n = visited.pop();
duke@435 2929 checked.push(n);
duke@435 2930 for (uint i = 0; i < n->outcnt(); i++) {
duke@435 2931 Node* use = n->raw_out(i);
duke@435 2932 if (checked.member(use)) continue; // already checked
duke@435 2933 if (visited.member(use)) continue; // already in the graph
duke@435 2934 if (use->is_Con()) continue; // a dead ConNode is OK
duke@435 2935 // At this point, we have found a dead node which is DU-reachable.
duke@435 2936 if (dead_nodes++ == 0)
duke@435 2937 tty->print_cr("*** Dead nodes reachable via DU edges:");
duke@435 2938 use->dump(2);
duke@435 2939 tty->print_cr("---");
duke@435 2940 checked.push(use); // No repeats; pretend it is now checked.
duke@435 2941 }
duke@435 2942 }
duke@435 2943 assert(dead_nodes == 0, "using nodes must be reachable from root");
duke@435 2944 }
duke@435 2945 }
duke@435 2946 }
duke@435 2947 #endif
duke@435 2948
duke@435 2949 // The Compile object keeps track of failure reasons separately from the ciEnv.
duke@435 2950 // This is required because there is not quite a 1-1 relation between the
duke@435 2951 // ciEnv and its compilation task and the Compile object. Note that one
duke@435 2952 // ciEnv might use two Compile objects, if C2Compiler::compile_method decides
duke@435 2953 // to backtrack and retry without subsuming loads. Other than this backtracking
duke@435 2954 // behavior, the Compile's failure reason is quietly copied up to the ciEnv
duke@435 2955 // by the logic in C2Compiler.
duke@435 2956 void Compile::record_failure(const char* reason) {
duke@435 2957 if (log() != NULL) {
duke@435 2958 log()->elem("failure reason='%s' phase='compile'", reason);
duke@435 2959 }
duke@435 2960 if (_failure_reason == NULL) {
duke@435 2961 // Record the first failure reason.
duke@435 2962 _failure_reason = reason;
duke@435 2963 }
never@657 2964 if (!C->failure_reason_is(C2Compiler::retry_no_subsuming_loads())) {
never@657 2965 C->print_method(_failure_reason);
never@657 2966 }
duke@435 2967 _root = NULL; // flush the graph, too
duke@435 2968 }
duke@435 2969
duke@435 2970 Compile::TracePhase::TracePhase(const char* name, elapsedTimer* accumulator, bool dolog)
duke@435 2971 : TraceTime(NULL, accumulator, false NOT_PRODUCT( || TimeCompiler ), false)
duke@435 2972 {
duke@435 2973 if (dolog) {
duke@435 2974 C = Compile::current();
duke@435 2975 _log = C->log();
duke@435 2976 } else {
duke@435 2977 C = NULL;
duke@435 2978 _log = NULL;
duke@435 2979 }
duke@435 2980 if (_log != NULL) {
duke@435 2981 _log->begin_head("phase name='%s' nodes='%d'", name, C->unique());
duke@435 2982 _log->stamp();
duke@435 2983 _log->end_head();
duke@435 2984 }
duke@435 2985 }
duke@435 2986
duke@435 2987 Compile::TracePhase::~TracePhase() {
duke@435 2988 if (_log != NULL) {
duke@435 2989 _log->done("phase nodes='%d'", C->unique());
duke@435 2990 }
duke@435 2991 }
twisti@2350 2992
twisti@2350 2993 //=============================================================================
twisti@2350 2994 // Two Constant's are equal when the type and the value are equal.
twisti@2350 2995 bool Compile::Constant::operator==(const Constant& other) {
twisti@2350 2996 if (type() != other.type() ) return false;
twisti@2350 2997 if (can_be_reused() != other.can_be_reused()) return false;
twisti@2350 2998 // For floating point values we compare the bit pattern.
twisti@2350 2999 switch (type()) {
twisti@2350 3000 case T_FLOAT: return (_value.i == other._value.i);
twisti@2350 3001 case T_LONG:
twisti@2350 3002 case T_DOUBLE: return (_value.j == other._value.j);
twisti@2350 3003 case T_OBJECT:
twisti@2350 3004 case T_ADDRESS: return (_value.l == other._value.l);
twisti@2350 3005 case T_VOID: return (_value.l == other._value.l); // jump-table entries
twisti@2350 3006 default: ShouldNotReachHere();
twisti@2350 3007 }
twisti@2350 3008 return false;
twisti@2350 3009 }
twisti@2350 3010
twisti@2350 3011 // Emit constants grouped in the following order:
twisti@2350 3012 static BasicType type_order[] = {
twisti@2350 3013 T_FLOAT, // 32-bit
twisti@2350 3014 T_OBJECT, // 32 or 64-bit
twisti@2350 3015 T_ADDRESS, // 32 or 64-bit
twisti@2350 3016 T_DOUBLE, // 64-bit
twisti@2350 3017 T_LONG, // 64-bit
twisti@2350 3018 T_VOID, // 32 or 64-bit (jump-tables are at the end of the constant table for code emission reasons)
twisti@2350 3019 T_ILLEGAL
twisti@2350 3020 };
twisti@2350 3021
twisti@2350 3022 static int type_to_size_in_bytes(BasicType t) {
twisti@2350 3023 switch (t) {
twisti@2350 3024 case T_LONG: return sizeof(jlong );
twisti@2350 3025 case T_FLOAT: return sizeof(jfloat );
twisti@2350 3026 case T_DOUBLE: return sizeof(jdouble);
twisti@2350 3027 // We use T_VOID as marker for jump-table entries (labels) which
twisti@2350 3028 // need an interal word relocation.
twisti@2350 3029 case T_VOID:
twisti@2350 3030 case T_ADDRESS:
twisti@2350 3031 case T_OBJECT: return sizeof(jobject);
twisti@2350 3032 }
twisti@2350 3033
twisti@2350 3034 ShouldNotReachHere();
twisti@2350 3035 return -1;
twisti@2350 3036 }
twisti@2350 3037
twisti@2350 3038 void Compile::ConstantTable::calculate_offsets_and_size() {
twisti@2350 3039 int size = 0;
twisti@2350 3040 for (int t = 0; type_order[t] != T_ILLEGAL; t++) {
twisti@2350 3041 BasicType type = type_order[t];
twisti@2350 3042
twisti@2350 3043 for (int i = 0; i < _constants.length(); i++) {
twisti@2350 3044 Constant con = _constants.at(i);
twisti@2350 3045 if (con.type() != type) continue; // Skip other types.
twisti@2350 3046
twisti@2350 3047 // Align size for type.
twisti@2350 3048 int typesize = type_to_size_in_bytes(con.type());
twisti@2350 3049 size = align_size_up(size, typesize);
twisti@2350 3050
twisti@2350 3051 // Set offset.
twisti@2350 3052 con.set_offset(size);
twisti@2350 3053 _constants.at_put(i, con);
twisti@2350 3054
twisti@2350 3055 // Add type size.
twisti@2350 3056 size = size + typesize;
twisti@2350 3057 }
twisti@2350 3058 }
twisti@2350 3059
twisti@2350 3060 // Align size up to the next section start (which is insts; see
twisti@2350 3061 // CodeBuffer::align_at_start).
twisti@2350 3062 assert(_size == -1, "already set?");
twisti@2350 3063 _size = align_size_up(size, CodeEntryAlignment);
twisti@2350 3064
twisti@2350 3065 if (Matcher::constant_table_absolute_addressing) {
twisti@2350 3066 set_table_base_offset(0); // No table base offset required
twisti@2350 3067 } else {
twisti@2350 3068 if (UseRDPCForConstantTableBase) {
twisti@2350 3069 // table base offset is set in MachConstantBaseNode::emit
twisti@2350 3070 } else {
twisti@2350 3071 // When RDPC is not used, the table base is set into the middle of
twisti@2350 3072 // the constant table.
twisti@2350 3073 int half_size = _size / 2;
twisti@2350 3074 assert(half_size * 2 == _size, "sanity");
twisti@2350 3075 set_table_base_offset(-half_size);
twisti@2350 3076 }
twisti@2350 3077 }
twisti@2350 3078 }
twisti@2350 3079
twisti@2350 3080 void Compile::ConstantTable::emit(CodeBuffer& cb) {
twisti@2350 3081 MacroAssembler _masm(&cb);
twisti@2350 3082 for (int t = 0; type_order[t] != T_ILLEGAL; t++) {
twisti@2350 3083 BasicType type = type_order[t];
twisti@2350 3084
twisti@2350 3085 for (int i = 0; i < _constants.length(); i++) {
twisti@2350 3086 Constant con = _constants.at(i);
twisti@2350 3087 if (con.type() != type) continue; // Skip other types.
twisti@2350 3088
twisti@2350 3089 address constant_addr;
twisti@2350 3090 switch (con.type()) {
twisti@2350 3091 case T_LONG: constant_addr = _masm.long_constant( con.get_jlong() ); break;
twisti@2350 3092 case T_FLOAT: constant_addr = _masm.float_constant( con.get_jfloat() ); break;
twisti@2350 3093 case T_DOUBLE: constant_addr = _masm.double_constant(con.get_jdouble()); break;
twisti@2350 3094 case T_OBJECT: {
twisti@2350 3095 jobject obj = con.get_jobject();
twisti@2350 3096 int oop_index = _masm.oop_recorder()->find_index(obj);
twisti@2350 3097 constant_addr = _masm.address_constant((address) obj, oop_Relocation::spec(oop_index));
twisti@2350 3098 break;
twisti@2350 3099 }
twisti@2350 3100 case T_ADDRESS: {
twisti@2350 3101 address addr = (address) con.get_jobject();
twisti@2350 3102 constant_addr = _masm.address_constant(addr);
twisti@2350 3103 break;
twisti@2350 3104 }
twisti@2350 3105 // We use T_VOID as marker for jump-table entries (labels) which
twisti@2350 3106 // need an interal word relocation.
twisti@2350 3107 case T_VOID: {
twisti@2350 3108 // Write a dummy word. The real value is filled in later
twisti@2350 3109 // in fill_jump_table_in_constant_table.
twisti@2350 3110 address addr = (address) con.get_jobject();
twisti@2350 3111 constant_addr = _masm.address_constant(addr);
twisti@2350 3112 break;
twisti@2350 3113 }
twisti@2350 3114 default: ShouldNotReachHere();
twisti@2350 3115 }
twisti@2350 3116 assert(constant_addr != NULL, "consts section too small");
twisti@2350 3117 assert((constant_addr - _masm.code()->consts()->start()) == con.offset(), err_msg("must be: %d == %d", constant_addr - _masm.code()->consts()->start(), con.offset()));
twisti@2350 3118 }
twisti@2350 3119 }
twisti@2350 3120 }
twisti@2350 3121
twisti@2350 3122 int Compile::ConstantTable::find_offset(Constant& con) const {
twisti@2350 3123 int idx = _constants.find(con);
twisti@2350 3124 assert(idx != -1, "constant must be in constant table");
twisti@2350 3125 int offset = _constants.at(idx).offset();
twisti@2350 3126 assert(offset != -1, "constant table not emitted yet?");
twisti@2350 3127 return offset;
twisti@2350 3128 }
twisti@2350 3129
twisti@2350 3130 void Compile::ConstantTable::add(Constant& con) {
twisti@2350 3131 if (con.can_be_reused()) {
twisti@2350 3132 int idx = _constants.find(con);
twisti@2350 3133 if (idx != -1 && _constants.at(idx).can_be_reused()) {
twisti@2350 3134 return;
twisti@2350 3135 }
twisti@2350 3136 }
twisti@2350 3137 (void) _constants.append(con);
twisti@2350 3138 }
twisti@2350 3139
twisti@2350 3140 Compile::Constant Compile::ConstantTable::add(BasicType type, jvalue value) {
twisti@2350 3141 Constant con(type, value);
twisti@2350 3142 add(con);
twisti@2350 3143 return con;
twisti@2350 3144 }
twisti@2350 3145
twisti@2350 3146 Compile::Constant Compile::ConstantTable::add(MachOper* oper) {
twisti@2350 3147 jvalue value;
twisti@2350 3148 BasicType type = oper->type()->basic_type();
twisti@2350 3149 switch (type) {
twisti@2350 3150 case T_LONG: value.j = oper->constantL(); break;
twisti@2350 3151 case T_FLOAT: value.f = oper->constantF(); break;
twisti@2350 3152 case T_DOUBLE: value.d = oper->constantD(); break;
twisti@2350 3153 case T_OBJECT:
twisti@2350 3154 case T_ADDRESS: value.l = (jobject) oper->constant(); break;
twisti@2350 3155 default: ShouldNotReachHere();
twisti@2350 3156 }
twisti@2350 3157 return add(type, value);
twisti@2350 3158 }
twisti@2350 3159
twisti@2350 3160 Compile::Constant Compile::ConstantTable::allocate_jump_table(MachConstantNode* n) {
twisti@2350 3161 jvalue value;
twisti@2350 3162 // We can use the node pointer here to identify the right jump-table
twisti@2350 3163 // as this method is called from Compile::Fill_buffer right before
twisti@2350 3164 // the MachNodes are emitted and the jump-table is filled (means the
twisti@2350 3165 // MachNode pointers do not change anymore).
twisti@2350 3166 value.l = (jobject) n;
twisti@2350 3167 Constant con(T_VOID, value, false); // Labels of a jump-table cannot be reused.
twisti@2350 3168 for (uint i = 0; i < n->outcnt(); i++) {
twisti@2350 3169 add(con);
twisti@2350 3170 }
twisti@2350 3171 return con;
twisti@2350 3172 }
twisti@2350 3173
twisti@2350 3174 void Compile::ConstantTable::fill_jump_table(CodeBuffer& cb, MachConstantNode* n, GrowableArray<Label*> labels) const {
twisti@2350 3175 // If called from Compile::scratch_emit_size do nothing.
twisti@2350 3176 if (Compile::current()->in_scratch_emit_size()) return;
twisti@2350 3177
twisti@2350 3178 assert(labels.is_nonempty(), "must be");
twisti@2350 3179 assert((uint) labels.length() == n->outcnt(), err_msg("must be equal: %d == %d", labels.length(), n->outcnt()));
twisti@2350 3180
twisti@2350 3181 // Since MachConstantNode::constant_offset() also contains
twisti@2350 3182 // table_base_offset() we need to subtract the table_base_offset()
twisti@2350 3183 // to get the plain offset into the constant table.
twisti@2350 3184 int offset = n->constant_offset() - table_base_offset();
twisti@2350 3185
twisti@2350 3186 MacroAssembler _masm(&cb);
twisti@2350 3187 address* jump_table_base = (address*) (_masm.code()->consts()->start() + offset);
twisti@2350 3188
twisti@2350 3189 for (int i = 0; i < labels.length(); i++) {
twisti@2350 3190 address* constant_addr = &jump_table_base[i];
twisti@2350 3191 assert(*constant_addr == (address) n, "all jump-table entries must contain node pointer");
twisti@2350 3192 *constant_addr = cb.consts()->target(*labels.at(i), (address) constant_addr);
twisti@2350 3193 cb.consts()->relocate((address) constant_addr, relocInfo::internal_word_type);
twisti@2350 3194 }
twisti@2350 3195 }

mercurial