src/share/vm/opto/library_call.cpp

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

author
johnc
date
Thu, 07 Apr 2011 09:53:20 -0700
changeset 2781
e1162778c1c8
parent 2667
0e3ed5a14f73
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 /*
kvn@2602 2 * Copyright (c) 1999, 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 "classfile/systemDictionary.hpp"
stefank@2314 27 #include "classfile/vmSymbols.hpp"
stefank@2314 28 #include "compiler/compileLog.hpp"
stefank@2314 29 #include "oops/objArrayKlass.hpp"
stefank@2314 30 #include "opto/addnode.hpp"
stefank@2314 31 #include "opto/callGenerator.hpp"
stefank@2314 32 #include "opto/cfgnode.hpp"
stefank@2314 33 #include "opto/idealKit.hpp"
stefank@2314 34 #include "opto/mulnode.hpp"
stefank@2314 35 #include "opto/parse.hpp"
stefank@2314 36 #include "opto/runtime.hpp"
stefank@2314 37 #include "opto/subnode.hpp"
stefank@2314 38 #include "prims/nativeLookup.hpp"
stefank@2314 39 #include "runtime/sharedRuntime.hpp"
duke@435 40
duke@435 41 class LibraryIntrinsic : public InlineCallGenerator {
duke@435 42 // Extend the set of intrinsics known to the runtime:
duke@435 43 public:
duke@435 44 private:
duke@435 45 bool _is_virtual;
duke@435 46 vmIntrinsics::ID _intrinsic_id;
duke@435 47
duke@435 48 public:
duke@435 49 LibraryIntrinsic(ciMethod* m, bool is_virtual, vmIntrinsics::ID id)
duke@435 50 : InlineCallGenerator(m),
duke@435 51 _is_virtual(is_virtual),
duke@435 52 _intrinsic_id(id)
duke@435 53 {
duke@435 54 }
duke@435 55 virtual bool is_intrinsic() const { return true; }
duke@435 56 virtual bool is_virtual() const { return _is_virtual; }
duke@435 57 virtual JVMState* generate(JVMState* jvms);
duke@435 58 vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; }
duke@435 59 };
duke@435 60
duke@435 61
duke@435 62 // Local helper class for LibraryIntrinsic:
duke@435 63 class LibraryCallKit : public GraphKit {
duke@435 64 private:
duke@435 65 LibraryIntrinsic* _intrinsic; // the library intrinsic being called
duke@435 66
duke@435 67 public:
duke@435 68 LibraryCallKit(JVMState* caller, LibraryIntrinsic* intrinsic)
duke@435 69 : GraphKit(caller),
duke@435 70 _intrinsic(intrinsic)
duke@435 71 {
duke@435 72 }
duke@435 73
duke@435 74 ciMethod* caller() const { return jvms()->method(); }
duke@435 75 int bci() const { return jvms()->bci(); }
duke@435 76 LibraryIntrinsic* intrinsic() const { return _intrinsic; }
duke@435 77 vmIntrinsics::ID intrinsic_id() const { return _intrinsic->intrinsic_id(); }
duke@435 78 ciMethod* callee() const { return _intrinsic->method(); }
duke@435 79 ciSignature* signature() const { return callee()->signature(); }
duke@435 80 int arg_size() const { return callee()->arg_size(); }
duke@435 81
duke@435 82 bool try_to_inline();
duke@435 83
duke@435 84 // Helper functions to inline natives
duke@435 85 void push_result(RegionNode* region, PhiNode* value);
duke@435 86 Node* generate_guard(Node* test, RegionNode* region, float true_prob);
duke@435 87 Node* generate_slow_guard(Node* test, RegionNode* region);
duke@435 88 Node* generate_fair_guard(Node* test, RegionNode* region);
duke@435 89 Node* generate_negative_guard(Node* index, RegionNode* region,
duke@435 90 // resulting CastII of index:
duke@435 91 Node* *pos_index = NULL);
duke@435 92 Node* generate_nonpositive_guard(Node* index, bool never_negative,
duke@435 93 // resulting CastII of index:
duke@435 94 Node* *pos_index = NULL);
duke@435 95 Node* generate_limit_guard(Node* offset, Node* subseq_length,
duke@435 96 Node* array_length,
duke@435 97 RegionNode* region);
duke@435 98 Node* generate_current_thread(Node* &tls_output);
duke@435 99 address basictype2arraycopy(BasicType t, Node *src_offset, Node *dest_offset,
iveresov@2606 100 bool disjoint_bases, const char* &name, bool dest_uninitialized);
duke@435 101 Node* load_mirror_from_klass(Node* klass);
duke@435 102 Node* load_klass_from_mirror_common(Node* mirror, bool never_see_null,
duke@435 103 int nargs,
duke@435 104 RegionNode* region, int null_path,
duke@435 105 int offset);
duke@435 106 Node* load_klass_from_mirror(Node* mirror, bool never_see_null, int nargs,
duke@435 107 RegionNode* region, int null_path) {
duke@435 108 int offset = java_lang_Class::klass_offset_in_bytes();
duke@435 109 return load_klass_from_mirror_common(mirror, never_see_null, nargs,
duke@435 110 region, null_path,
duke@435 111 offset);
duke@435 112 }
duke@435 113 Node* load_array_klass_from_mirror(Node* mirror, bool never_see_null,
duke@435 114 int nargs,
duke@435 115 RegionNode* region, int null_path) {
duke@435 116 int offset = java_lang_Class::array_klass_offset_in_bytes();
duke@435 117 return load_klass_from_mirror_common(mirror, never_see_null, nargs,
duke@435 118 region, null_path,
duke@435 119 offset);
duke@435 120 }
duke@435 121 Node* generate_access_flags_guard(Node* kls,
duke@435 122 int modifier_mask, int modifier_bits,
duke@435 123 RegionNode* region);
duke@435 124 Node* generate_interface_guard(Node* kls, RegionNode* region);
duke@435 125 Node* generate_array_guard(Node* kls, RegionNode* region) {
duke@435 126 return generate_array_guard_common(kls, region, false, false);
duke@435 127 }
duke@435 128 Node* generate_non_array_guard(Node* kls, RegionNode* region) {
duke@435 129 return generate_array_guard_common(kls, region, false, true);
duke@435 130 }
duke@435 131 Node* generate_objArray_guard(Node* kls, RegionNode* region) {
duke@435 132 return generate_array_guard_common(kls, region, true, false);
duke@435 133 }
duke@435 134 Node* generate_non_objArray_guard(Node* kls, RegionNode* region) {
duke@435 135 return generate_array_guard_common(kls, region, true, true);
duke@435 136 }
duke@435 137 Node* generate_array_guard_common(Node* kls, RegionNode* region,
duke@435 138 bool obj_array, bool not_array);
duke@435 139 Node* generate_virtual_guard(Node* obj_klass, RegionNode* slow_region);
duke@435 140 CallJavaNode* generate_method_call(vmIntrinsics::ID method_id,
duke@435 141 bool is_virtual = false, bool is_static = false);
duke@435 142 CallJavaNode* generate_method_call_static(vmIntrinsics::ID method_id) {
duke@435 143 return generate_method_call(method_id, false, true);
duke@435 144 }
duke@435 145 CallJavaNode* generate_method_call_virtual(vmIntrinsics::ID method_id) {
duke@435 146 return generate_method_call(method_id, true, false);
duke@435 147 }
duke@435 148
kvn@1421 149 Node* make_string_method_node(int opcode, Node* str1, Node* cnt1, Node* str2, Node* cnt2);
duke@435 150 bool inline_string_compareTo();
duke@435 151 bool inline_string_indexOf();
duke@435 152 Node* string_indexOf(Node* string_object, ciTypeArray* target_array, jint offset, jint cache_i, jint md2_i);
cfang@1116 153 bool inline_string_equals();
duke@435 154 Node* pop_math_arg();
duke@435 155 bool runtime_math(const TypeFunc* call_type, address funcAddr, const char* funcName);
duke@435 156 bool inline_math_native(vmIntrinsics::ID id);
duke@435 157 bool inline_trig(vmIntrinsics::ID id);
duke@435 158 bool inline_trans(vmIntrinsics::ID id);
duke@435 159 bool inline_abs(vmIntrinsics::ID id);
duke@435 160 bool inline_sqrt(vmIntrinsics::ID id);
duke@435 161 bool inline_pow(vmIntrinsics::ID id);
duke@435 162 bool inline_exp(vmIntrinsics::ID id);
duke@435 163 bool inline_min_max(vmIntrinsics::ID id);
duke@435 164 Node* generate_min_max(vmIntrinsics::ID id, Node* x, Node* y);
duke@435 165 // This returns Type::AnyPtr, RawPtr, or OopPtr.
duke@435 166 int classify_unsafe_addr(Node* &base, Node* &offset);
duke@435 167 Node* make_unsafe_address(Node* base, Node* offset);
johnc@2781 168 // Helper for inline_unsafe_access.
johnc@2781 169 // Generates the guards that check whether the result of
johnc@2781 170 // Unsafe.getObject should be recorded in an SATB log buffer.
johnc@2781 171 void insert_g1_pre_barrier(Node* base_oop, Node* offset, Node* pre_val);
duke@435 172 bool inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile);
duke@435 173 bool inline_unsafe_prefetch(bool is_native_ptr, bool is_store, bool is_static);
duke@435 174 bool inline_unsafe_allocate();
duke@435 175 bool inline_unsafe_copyMemory();
duke@435 176 bool inline_native_currentThread();
duke@435 177 bool inline_native_time_funcs(bool isNano);
duke@435 178 bool inline_native_isInterrupted();
duke@435 179 bool inline_native_Class_query(vmIntrinsics::ID id);
duke@435 180 bool inline_native_subtype_check();
duke@435 181
duke@435 182 bool inline_native_newArray();
duke@435 183 bool inline_native_getLength();
duke@435 184 bool inline_array_copyOf(bool is_copyOfRange);
rasbold@604 185 bool inline_array_equals();
kvn@1268 186 void copy_to_clone(Node* obj, Node* alloc_obj, Node* obj_size, bool is_array, bool card_mark);
duke@435 187 bool inline_native_clone(bool is_virtual);
duke@435 188 bool inline_native_Reflection_getCallerClass();
duke@435 189 bool inline_native_AtomicLong_get();
duke@435 190 bool inline_native_AtomicLong_attemptUpdate();
duke@435 191 bool is_method_invoke_or_aux_frame(JVMState* jvms);
duke@435 192 // Helper function for inlining native object hash method
duke@435 193 bool inline_native_hashcode(bool is_virtual, bool is_static);
duke@435 194 bool inline_native_getClass();
duke@435 195
duke@435 196 // Helper functions for inlining arraycopy
duke@435 197 bool inline_arraycopy();
duke@435 198 void generate_arraycopy(const TypePtr* adr_type,
duke@435 199 BasicType basic_elem_type,
duke@435 200 Node* src, Node* src_offset,
duke@435 201 Node* dest, Node* dest_offset,
duke@435 202 Node* copy_length,
duke@435 203 bool disjoint_bases = false,
duke@435 204 bool length_never_negative = false,
duke@435 205 RegionNode* slow_region = NULL);
duke@435 206 AllocateArrayNode* tightly_coupled_allocation(Node* ptr,
duke@435 207 RegionNode* slow_region);
duke@435 208 void generate_clear_array(const TypePtr* adr_type,
duke@435 209 Node* dest,
duke@435 210 BasicType basic_elem_type,
duke@435 211 Node* slice_off,
duke@435 212 Node* slice_len,
duke@435 213 Node* slice_end);
duke@435 214 bool generate_block_arraycopy(const TypePtr* adr_type,
duke@435 215 BasicType basic_elem_type,
duke@435 216 AllocateNode* alloc,
duke@435 217 Node* src, Node* src_offset,
duke@435 218 Node* dest, Node* dest_offset,
iveresov@2606 219 Node* dest_size, bool dest_uninitialized);
duke@435 220 void generate_slow_arraycopy(const TypePtr* adr_type,
duke@435 221 Node* src, Node* src_offset,
duke@435 222 Node* dest, Node* dest_offset,
iveresov@2606 223 Node* copy_length, bool dest_uninitialized);
duke@435 224 Node* generate_checkcast_arraycopy(const TypePtr* adr_type,
duke@435 225 Node* dest_elem_klass,
duke@435 226 Node* src, Node* src_offset,
duke@435 227 Node* dest, Node* dest_offset,
iveresov@2606 228 Node* copy_length, bool dest_uninitialized);
duke@435 229 Node* generate_generic_arraycopy(const TypePtr* adr_type,
duke@435 230 Node* src, Node* src_offset,
duke@435 231 Node* dest, Node* dest_offset,
iveresov@2606 232 Node* copy_length, bool dest_uninitialized);
duke@435 233 void generate_unchecked_arraycopy(const TypePtr* adr_type,
duke@435 234 BasicType basic_elem_type,
duke@435 235 bool disjoint_bases,
duke@435 236 Node* src, Node* src_offset,
duke@435 237 Node* dest, Node* dest_offset,
iveresov@2606 238 Node* copy_length, bool dest_uninitialized);
duke@435 239 bool inline_unsafe_CAS(BasicType type);
duke@435 240 bool inline_unsafe_ordered_store(BasicType type);
duke@435 241 bool inline_fp_conversions(vmIntrinsics::ID id);
twisti@1210 242 bool inline_numberOfLeadingZeros(vmIntrinsics::ID id);
twisti@1210 243 bool inline_numberOfTrailingZeros(vmIntrinsics::ID id);
twisti@1078 244 bool inline_bitCount(vmIntrinsics::ID id);
duke@435 245 bool inline_reverseBytes(vmIntrinsics::ID id);
johnc@2781 246
johnc@2781 247 bool inline_reference_get();
duke@435 248 };
duke@435 249
duke@435 250
duke@435 251 //---------------------------make_vm_intrinsic----------------------------
duke@435 252 CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
duke@435 253 vmIntrinsics::ID id = m->intrinsic_id();
duke@435 254 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
duke@435 255
duke@435 256 if (DisableIntrinsic[0] != '\0'
duke@435 257 && strstr(DisableIntrinsic, vmIntrinsics::name_at(id)) != NULL) {
duke@435 258 // disabled by a user request on the command line:
duke@435 259 // example: -XX:DisableIntrinsic=_hashCode,_getClass
duke@435 260 return NULL;
duke@435 261 }
duke@435 262
duke@435 263 if (!m->is_loaded()) {
duke@435 264 // do not attempt to inline unloaded methods
duke@435 265 return NULL;
duke@435 266 }
duke@435 267
duke@435 268 // Only a few intrinsics implement a virtual dispatch.
duke@435 269 // They are expensive calls which are also frequently overridden.
duke@435 270 if (is_virtual) {
duke@435 271 switch (id) {
duke@435 272 case vmIntrinsics::_hashCode:
duke@435 273 case vmIntrinsics::_clone:
duke@435 274 // OK, Object.hashCode and Object.clone intrinsics come in both flavors
duke@435 275 break;
duke@435 276 default:
duke@435 277 return NULL;
duke@435 278 }
duke@435 279 }
duke@435 280
duke@435 281 // -XX:-InlineNatives disables nearly all intrinsics:
duke@435 282 if (!InlineNatives) {
duke@435 283 switch (id) {
duke@435 284 case vmIntrinsics::_indexOf:
duke@435 285 case vmIntrinsics::_compareTo:
cfang@1116 286 case vmIntrinsics::_equals:
rasbold@604 287 case vmIntrinsics::_equalsC:
duke@435 288 break; // InlineNatives does not control String.compareTo
duke@435 289 default:
duke@435 290 return NULL;
duke@435 291 }
duke@435 292 }
duke@435 293
duke@435 294 switch (id) {
duke@435 295 case vmIntrinsics::_compareTo:
duke@435 296 if (!SpecialStringCompareTo) return NULL;
duke@435 297 break;
duke@435 298 case vmIntrinsics::_indexOf:
duke@435 299 if (!SpecialStringIndexOf) return NULL;
duke@435 300 break;
cfang@1116 301 case vmIntrinsics::_equals:
cfang@1116 302 if (!SpecialStringEquals) return NULL;
cfang@1116 303 break;
rasbold@604 304 case vmIntrinsics::_equalsC:
rasbold@604 305 if (!SpecialArraysEquals) return NULL;
rasbold@604 306 break;
duke@435 307 case vmIntrinsics::_arraycopy:
duke@435 308 if (!InlineArrayCopy) return NULL;
duke@435 309 break;
duke@435 310 case vmIntrinsics::_copyMemory:
duke@435 311 if (StubRoutines::unsafe_arraycopy() == NULL) return NULL;
duke@435 312 if (!InlineArrayCopy) return NULL;
duke@435 313 break;
duke@435 314 case vmIntrinsics::_hashCode:
duke@435 315 if (!InlineObjectHash) return NULL;
duke@435 316 break;
duke@435 317 case vmIntrinsics::_clone:
duke@435 318 case vmIntrinsics::_copyOf:
duke@435 319 case vmIntrinsics::_copyOfRange:
duke@435 320 if (!InlineObjectCopy) return NULL;
duke@435 321 // These also use the arraycopy intrinsic mechanism:
duke@435 322 if (!InlineArrayCopy) return NULL;
duke@435 323 break;
duke@435 324 case vmIntrinsics::_checkIndex:
duke@435 325 // We do not intrinsify this. The optimizer does fine with it.
duke@435 326 return NULL;
duke@435 327
duke@435 328 case vmIntrinsics::_get_AtomicLong:
duke@435 329 case vmIntrinsics::_attemptUpdate:
duke@435 330 if (!InlineAtomicLong) return NULL;
duke@435 331 break;
duke@435 332
duke@435 333 case vmIntrinsics::_getCallerClass:
duke@435 334 if (!UseNewReflection) return NULL;
duke@435 335 if (!InlineReflectionGetCallerClass) return NULL;
duke@435 336 if (!JDK_Version::is_gte_jdk14x_version()) return NULL;
duke@435 337 break;
duke@435 338
twisti@1078 339 case vmIntrinsics::_bitCount_i:
twisti@1078 340 case vmIntrinsics::_bitCount_l:
twisti@1078 341 if (!UsePopCountInstruction) return NULL;
twisti@1078 342 break;
twisti@1078 343
johnc@2781 344 case vmIntrinsics::_Reference_get:
johnc@2781 345 // It is only when G1 is enabled that we absolutely
johnc@2781 346 // need to use the intrinsic version of Reference.get()
johnc@2781 347 // so that the value in the referent field, if necessary,
johnc@2781 348 // can be registered by the pre-barrier code.
johnc@2781 349 if (!UseG1GC) return NULL;
johnc@2781 350 break;
johnc@2781 351
duke@435 352 default:
jrose@1291 353 assert(id <= vmIntrinsics::LAST_COMPILER_INLINE, "caller responsibility");
jrose@1291 354 assert(id != vmIntrinsics::_Object_init && id != vmIntrinsics::_invoke, "enum out of order?");
duke@435 355 break;
duke@435 356 }
duke@435 357
duke@435 358 // -XX:-InlineClassNatives disables natives from the Class class.
duke@435 359 // The flag applies to all reflective calls, notably Array.newArray
duke@435 360 // (visible to Java programmers as Array.newInstance).
duke@435 361 if (m->holder()->name() == ciSymbol::java_lang_Class() ||
duke@435 362 m->holder()->name() == ciSymbol::java_lang_reflect_Array()) {
duke@435 363 if (!InlineClassNatives) return NULL;
duke@435 364 }
duke@435 365
duke@435 366 // -XX:-InlineThreadNatives disables natives from the Thread class.
duke@435 367 if (m->holder()->name() == ciSymbol::java_lang_Thread()) {
duke@435 368 if (!InlineThreadNatives) return NULL;
duke@435 369 }
duke@435 370
duke@435 371 // -XX:-InlineMathNatives disables natives from the Math,Float and Double classes.
duke@435 372 if (m->holder()->name() == ciSymbol::java_lang_Math() ||
duke@435 373 m->holder()->name() == ciSymbol::java_lang_Float() ||
duke@435 374 m->holder()->name() == ciSymbol::java_lang_Double()) {
duke@435 375 if (!InlineMathNatives) return NULL;
duke@435 376 }
duke@435 377
duke@435 378 // -XX:-InlineUnsafeOps disables natives from the Unsafe class.
duke@435 379 if (m->holder()->name() == ciSymbol::sun_misc_Unsafe()) {
duke@435 380 if (!InlineUnsafeOps) return NULL;
duke@435 381 }
duke@435 382
duke@435 383 return new LibraryIntrinsic(m, is_virtual, (vmIntrinsics::ID) id);
duke@435 384 }
duke@435 385
duke@435 386 //----------------------register_library_intrinsics-----------------------
duke@435 387 // Initialize this file's data structures, for each Compile instance.
duke@435 388 void Compile::register_library_intrinsics() {
duke@435 389 // Nothing to do here.
duke@435 390 }
duke@435 391
duke@435 392 JVMState* LibraryIntrinsic::generate(JVMState* jvms) {
duke@435 393 LibraryCallKit kit(jvms, this);
duke@435 394 Compile* C = kit.C;
duke@435 395 int nodes = C->unique();
duke@435 396 #ifndef PRODUCT
duke@435 397 if ((PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) && Verbose) {
duke@435 398 char buf[1000];
duke@435 399 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf));
duke@435 400 tty->print_cr("Intrinsic %s", str);
duke@435 401 }
duke@435 402 #endif
johnc@2781 403
duke@435 404 if (kit.try_to_inline()) {
duke@435 405 if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) {
johnc@2781 406 if (jvms->has_method()) {
johnc@2781 407 // Not a root compile.
johnc@2781 408 tty->print("Inlining intrinsic %s%s at bci:%d in",
johnc@2781 409 vmIntrinsics::name_at(intrinsic_id()),
johnc@2781 410 (is_virtual() ? " (virtual)" : ""), kit.bci());
johnc@2781 411 kit.caller()->print_short_name(tty);
johnc@2781 412 tty->print_cr(" (%d bytes)", kit.caller()->code_size());
johnc@2781 413 } else {
johnc@2781 414 // Root compile
johnc@2781 415 tty->print_cr("Generating intrinsic %s%s at bci:%d",
johnc@2781 416 vmIntrinsics::name_at(intrinsic_id()),
johnc@2781 417 (is_virtual() ? " (virtual)" : ""), kit.bci());
johnc@2781 418 }
duke@435 419 }
duke@435 420 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked);
duke@435 421 if (C->log()) {
duke@435 422 C->log()->elem("intrinsic id='%s'%s nodes='%d'",
duke@435 423 vmIntrinsics::name_at(intrinsic_id()),
duke@435 424 (is_virtual() ? " virtual='1'" : ""),
duke@435 425 C->unique() - nodes);
duke@435 426 }
duke@435 427 return kit.transfer_exceptions_into_jvms();
duke@435 428 }
duke@435 429
duke@435 430 if (PrintIntrinsics) {
johnc@2781 431 if (jvms->has_method()) {
johnc@2781 432 // Not a root compile.
johnc@2781 433 tty->print("Did not inline intrinsic %s%s at bci:%d in",
johnc@2781 434 vmIntrinsics::name_at(intrinsic_id()),
johnc@2781 435 (is_virtual() ? " (virtual)" : ""), kit.bci());
johnc@2781 436 kit.caller()->print_short_name(tty);
johnc@2781 437 tty->print_cr(" (%d bytes)", kit.caller()->code_size());
johnc@2781 438 } else {
johnc@2781 439 // Root compile
johnc@2781 440 tty->print("Did not generate intrinsic %s%s at bci:%d in",
jrose@1291 441 vmIntrinsics::name_at(intrinsic_id()),
jrose@1291 442 (is_virtual() ? " (virtual)" : ""), kit.bci());
johnc@2781 443 }
duke@435 444 }
duke@435 445 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed);
duke@435 446 return NULL;
duke@435 447 }
duke@435 448
duke@435 449 bool LibraryCallKit::try_to_inline() {
duke@435 450 // Handle symbolic names for otherwise undistinguished boolean switches:
duke@435 451 const bool is_store = true;
duke@435 452 const bool is_native_ptr = true;
duke@435 453 const bool is_static = true;
duke@435 454
johnc@2781 455 if (!jvms()->has_method()) {
johnc@2781 456 // Root JVMState has a null method.
johnc@2781 457 assert(map()->memory()->Opcode() == Op_Parm, "");
johnc@2781 458 // Insert the memory aliasing node
johnc@2781 459 set_all_memory(reset_memory());
johnc@2781 460 }
johnc@2781 461 assert(merged_memory(), "");
johnc@2781 462
duke@435 463 switch (intrinsic_id()) {
duke@435 464 case vmIntrinsics::_hashCode:
duke@435 465 return inline_native_hashcode(intrinsic()->is_virtual(), !is_static);
duke@435 466 case vmIntrinsics::_identityHashCode:
duke@435 467 return inline_native_hashcode(/*!virtual*/ false, is_static);
duke@435 468 case vmIntrinsics::_getClass:
duke@435 469 return inline_native_getClass();
duke@435 470
duke@435 471 case vmIntrinsics::_dsin:
duke@435 472 case vmIntrinsics::_dcos:
duke@435 473 case vmIntrinsics::_dtan:
duke@435 474 case vmIntrinsics::_dabs:
duke@435 475 case vmIntrinsics::_datan2:
duke@435 476 case vmIntrinsics::_dsqrt:
duke@435 477 case vmIntrinsics::_dexp:
duke@435 478 case vmIntrinsics::_dlog:
duke@435 479 case vmIntrinsics::_dlog10:
duke@435 480 case vmIntrinsics::_dpow:
duke@435 481 return inline_math_native(intrinsic_id());
duke@435 482
duke@435 483 case vmIntrinsics::_min:
duke@435 484 case vmIntrinsics::_max:
duke@435 485 return inline_min_max(intrinsic_id());
duke@435 486
duke@435 487 case vmIntrinsics::_arraycopy:
duke@435 488 return inline_arraycopy();
duke@435 489
duke@435 490 case vmIntrinsics::_compareTo:
duke@435 491 return inline_string_compareTo();
duke@435 492 case vmIntrinsics::_indexOf:
duke@435 493 return inline_string_indexOf();
cfang@1116 494 case vmIntrinsics::_equals:
cfang@1116 495 return inline_string_equals();
duke@435 496
duke@435 497 case vmIntrinsics::_getObject:
duke@435 498 return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, false);
duke@435 499 case vmIntrinsics::_getBoolean:
duke@435 500 return inline_unsafe_access(!is_native_ptr, !is_store, T_BOOLEAN, false);
duke@435 501 case vmIntrinsics::_getByte:
duke@435 502 return inline_unsafe_access(!is_native_ptr, !is_store, T_BYTE, false);
duke@435 503 case vmIntrinsics::_getShort:
duke@435 504 return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, false);
duke@435 505 case vmIntrinsics::_getChar:
duke@435 506 return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, false);
duke@435 507 case vmIntrinsics::_getInt:
duke@435 508 return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, false);
duke@435 509 case vmIntrinsics::_getLong:
duke@435 510 return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, false);
duke@435 511 case vmIntrinsics::_getFloat:
duke@435 512 return inline_unsafe_access(!is_native_ptr, !is_store, T_FLOAT, false);
duke@435 513 case vmIntrinsics::_getDouble:
duke@435 514 return inline_unsafe_access(!is_native_ptr, !is_store, T_DOUBLE, false);
duke@435 515
duke@435 516 case vmIntrinsics::_putObject:
duke@435 517 return inline_unsafe_access(!is_native_ptr, is_store, T_OBJECT, false);
duke@435 518 case vmIntrinsics::_putBoolean:
duke@435 519 return inline_unsafe_access(!is_native_ptr, is_store, T_BOOLEAN, false);
duke@435 520 case vmIntrinsics::_putByte:
duke@435 521 return inline_unsafe_access(!is_native_ptr, is_store, T_BYTE, false);
duke@435 522 case vmIntrinsics::_putShort:
duke@435 523 return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, false);
duke@435 524 case vmIntrinsics::_putChar:
duke@435 525 return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, false);
duke@435 526 case vmIntrinsics::_putInt:
duke@435 527 return inline_unsafe_access(!is_native_ptr, is_store, T_INT, false);
duke@435 528 case vmIntrinsics::_putLong:
duke@435 529 return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, false);
duke@435 530 case vmIntrinsics::_putFloat:
duke@435 531 return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, false);
duke@435 532 case vmIntrinsics::_putDouble:
duke@435 533 return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, false);
duke@435 534
duke@435 535 case vmIntrinsics::_getByte_raw:
duke@435 536 return inline_unsafe_access(is_native_ptr, !is_store, T_BYTE, false);
duke@435 537 case vmIntrinsics::_getShort_raw:
duke@435 538 return inline_unsafe_access(is_native_ptr, !is_store, T_SHORT, false);
duke@435 539 case vmIntrinsics::_getChar_raw:
duke@435 540 return inline_unsafe_access(is_native_ptr, !is_store, T_CHAR, false);
duke@435 541 case vmIntrinsics::_getInt_raw:
duke@435 542 return inline_unsafe_access(is_native_ptr, !is_store, T_INT, false);
duke@435 543 case vmIntrinsics::_getLong_raw:
duke@435 544 return inline_unsafe_access(is_native_ptr, !is_store, T_LONG, false);
duke@435 545 case vmIntrinsics::_getFloat_raw:
duke@435 546 return inline_unsafe_access(is_native_ptr, !is_store, T_FLOAT, false);
duke@435 547 case vmIntrinsics::_getDouble_raw:
duke@435 548 return inline_unsafe_access(is_native_ptr, !is_store, T_DOUBLE, false);
duke@435 549 case vmIntrinsics::_getAddress_raw:
duke@435 550 return inline_unsafe_access(is_native_ptr, !is_store, T_ADDRESS, false);
duke@435 551
duke@435 552 case vmIntrinsics::_putByte_raw:
duke@435 553 return inline_unsafe_access(is_native_ptr, is_store, T_BYTE, false);
duke@435 554 case vmIntrinsics::_putShort_raw:
duke@435 555 return inline_unsafe_access(is_native_ptr, is_store, T_SHORT, false);
duke@435 556 case vmIntrinsics::_putChar_raw:
duke@435 557 return inline_unsafe_access(is_native_ptr, is_store, T_CHAR, false);
duke@435 558 case vmIntrinsics::_putInt_raw:
duke@435 559 return inline_unsafe_access(is_native_ptr, is_store, T_INT, false);
duke@435 560 case vmIntrinsics::_putLong_raw:
duke@435 561 return inline_unsafe_access(is_native_ptr, is_store, T_LONG, false);
duke@435 562 case vmIntrinsics::_putFloat_raw:
duke@435 563 return inline_unsafe_access(is_native_ptr, is_store, T_FLOAT, false);
duke@435 564 case vmIntrinsics::_putDouble_raw:
duke@435 565 return inline_unsafe_access(is_native_ptr, is_store, T_DOUBLE, false);
duke@435 566 case vmIntrinsics::_putAddress_raw:
duke@435 567 return inline_unsafe_access(is_native_ptr, is_store, T_ADDRESS, false);
duke@435 568
duke@435 569 case vmIntrinsics::_getObjectVolatile:
duke@435 570 return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, true);
duke@435 571 case vmIntrinsics::_getBooleanVolatile:
duke@435 572 return inline_unsafe_access(!is_native_ptr, !is_store, T_BOOLEAN, true);
duke@435 573 case vmIntrinsics::_getByteVolatile:
duke@435 574 return inline_unsafe_access(!is_native_ptr, !is_store, T_BYTE, true);
duke@435 575 case vmIntrinsics::_getShortVolatile:
duke@435 576 return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, true);
duke@435 577 case vmIntrinsics::_getCharVolatile:
duke@435 578 return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, true);
duke@435 579 case vmIntrinsics::_getIntVolatile:
duke@435 580 return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, true);
duke@435 581 case vmIntrinsics::_getLongVolatile:
duke@435 582 return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, true);
duke@435 583 case vmIntrinsics::_getFloatVolatile:
duke@435 584 return inline_unsafe_access(!is_native_ptr, !is_store, T_FLOAT, true);
duke@435 585 case vmIntrinsics::_getDoubleVolatile:
duke@435 586 return inline_unsafe_access(!is_native_ptr, !is_store, T_DOUBLE, true);
duke@435 587
duke@435 588 case vmIntrinsics::_putObjectVolatile:
duke@435 589 return inline_unsafe_access(!is_native_ptr, is_store, T_OBJECT, true);
duke@435 590 case vmIntrinsics::_putBooleanVolatile:
duke@435 591 return inline_unsafe_access(!is_native_ptr, is_store, T_BOOLEAN, true);
duke@435 592 case vmIntrinsics::_putByteVolatile:
duke@435 593 return inline_unsafe_access(!is_native_ptr, is_store, T_BYTE, true);
duke@435 594 case vmIntrinsics::_putShortVolatile:
duke@435 595 return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, true);
duke@435 596 case vmIntrinsics::_putCharVolatile:
duke@435 597 return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, true);
duke@435 598 case vmIntrinsics::_putIntVolatile:
duke@435 599 return inline_unsafe_access(!is_native_ptr, is_store, T_INT, true);
duke@435 600 case vmIntrinsics::_putLongVolatile:
duke@435 601 return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, true);
duke@435 602 case vmIntrinsics::_putFloatVolatile:
duke@435 603 return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, true);
duke@435 604 case vmIntrinsics::_putDoubleVolatile:
duke@435 605 return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, true);
duke@435 606
duke@435 607 case vmIntrinsics::_prefetchRead:
duke@435 608 return inline_unsafe_prefetch(!is_native_ptr, !is_store, !is_static);
duke@435 609 case vmIntrinsics::_prefetchWrite:
duke@435 610 return inline_unsafe_prefetch(!is_native_ptr, is_store, !is_static);
duke@435 611 case vmIntrinsics::_prefetchReadStatic:
duke@435 612 return inline_unsafe_prefetch(!is_native_ptr, !is_store, is_static);
duke@435 613 case vmIntrinsics::_prefetchWriteStatic:
duke@435 614 return inline_unsafe_prefetch(!is_native_ptr, is_store, is_static);
duke@435 615
duke@435 616 case vmIntrinsics::_compareAndSwapObject:
duke@435 617 return inline_unsafe_CAS(T_OBJECT);
duke@435 618 case vmIntrinsics::_compareAndSwapInt:
duke@435 619 return inline_unsafe_CAS(T_INT);
duke@435 620 case vmIntrinsics::_compareAndSwapLong:
duke@435 621 return inline_unsafe_CAS(T_LONG);
duke@435 622
duke@435 623 case vmIntrinsics::_putOrderedObject:
duke@435 624 return inline_unsafe_ordered_store(T_OBJECT);
duke@435 625 case vmIntrinsics::_putOrderedInt:
duke@435 626 return inline_unsafe_ordered_store(T_INT);
duke@435 627 case vmIntrinsics::_putOrderedLong:
duke@435 628 return inline_unsafe_ordered_store(T_LONG);
duke@435 629
duke@435 630 case vmIntrinsics::_currentThread:
duke@435 631 return inline_native_currentThread();
duke@435 632 case vmIntrinsics::_isInterrupted:
duke@435 633 return inline_native_isInterrupted();
duke@435 634
duke@435 635 case vmIntrinsics::_currentTimeMillis:
duke@435 636 return inline_native_time_funcs(false);
duke@435 637 case vmIntrinsics::_nanoTime:
duke@435 638 return inline_native_time_funcs(true);
duke@435 639 case vmIntrinsics::_allocateInstance:
duke@435 640 return inline_unsafe_allocate();
duke@435 641 case vmIntrinsics::_copyMemory:
duke@435 642 return inline_unsafe_copyMemory();
duke@435 643 case vmIntrinsics::_newArray:
duke@435 644 return inline_native_newArray();
duke@435 645 case vmIntrinsics::_getLength:
duke@435 646 return inline_native_getLength();
duke@435 647 case vmIntrinsics::_copyOf:
duke@435 648 return inline_array_copyOf(false);
duke@435 649 case vmIntrinsics::_copyOfRange:
duke@435 650 return inline_array_copyOf(true);
rasbold@604 651 case vmIntrinsics::_equalsC:
rasbold@604 652 return inline_array_equals();
duke@435 653 case vmIntrinsics::_clone:
duke@435 654 return inline_native_clone(intrinsic()->is_virtual());
duke@435 655
duke@435 656 case vmIntrinsics::_isAssignableFrom:
duke@435 657 return inline_native_subtype_check();
duke@435 658
duke@435 659 case vmIntrinsics::_isInstance:
duke@435 660 case vmIntrinsics::_getModifiers:
duke@435 661 case vmIntrinsics::_isInterface:
duke@435 662 case vmIntrinsics::_isArray:
duke@435 663 case vmIntrinsics::_isPrimitive:
duke@435 664 case vmIntrinsics::_getSuperclass:
duke@435 665 case vmIntrinsics::_getComponentType:
duke@435 666 case vmIntrinsics::_getClassAccessFlags:
duke@435 667 return inline_native_Class_query(intrinsic_id());
duke@435 668
duke@435 669 case vmIntrinsics::_floatToRawIntBits:
duke@435 670 case vmIntrinsics::_floatToIntBits:
duke@435 671 case vmIntrinsics::_intBitsToFloat:
duke@435 672 case vmIntrinsics::_doubleToRawLongBits:
duke@435 673 case vmIntrinsics::_doubleToLongBits:
duke@435 674 case vmIntrinsics::_longBitsToDouble:
duke@435 675 return inline_fp_conversions(intrinsic_id());
duke@435 676
twisti@1210 677 case vmIntrinsics::_numberOfLeadingZeros_i:
twisti@1210 678 case vmIntrinsics::_numberOfLeadingZeros_l:
twisti@1210 679 return inline_numberOfLeadingZeros(intrinsic_id());
twisti@1210 680
twisti@1210 681 case vmIntrinsics::_numberOfTrailingZeros_i:
twisti@1210 682 case vmIntrinsics::_numberOfTrailingZeros_l:
twisti@1210 683 return inline_numberOfTrailingZeros(intrinsic_id());
twisti@1210 684
twisti@1078 685 case vmIntrinsics::_bitCount_i:
twisti@1078 686 case vmIntrinsics::_bitCount_l:
twisti@1078 687 return inline_bitCount(intrinsic_id());
twisti@1078 688
duke@435 689 case vmIntrinsics::_reverseBytes_i:
duke@435 690 case vmIntrinsics::_reverseBytes_l:
never@1831 691 case vmIntrinsics::_reverseBytes_s:
never@1831 692 case vmIntrinsics::_reverseBytes_c:
duke@435 693 return inline_reverseBytes((vmIntrinsics::ID) intrinsic_id());
duke@435 694
duke@435 695 case vmIntrinsics::_get_AtomicLong:
duke@435 696 return inline_native_AtomicLong_get();
duke@435 697 case vmIntrinsics::_attemptUpdate:
duke@435 698 return inline_native_AtomicLong_attemptUpdate();
duke@435 699
duke@435 700 case vmIntrinsics::_getCallerClass:
duke@435 701 return inline_native_Reflection_getCallerClass();
duke@435 702
johnc@2781 703 case vmIntrinsics::_Reference_get:
johnc@2781 704 return inline_reference_get();
johnc@2781 705
duke@435 706 default:
duke@435 707 // If you get here, it may be that someone has added a new intrinsic
duke@435 708 // to the list in vmSymbols.hpp without implementing it here.
duke@435 709 #ifndef PRODUCT
duke@435 710 if ((PrintMiscellaneous && (Verbose || WizardMode)) || PrintOpto) {
duke@435 711 tty->print_cr("*** Warning: Unimplemented intrinsic %s(%d)",
duke@435 712 vmIntrinsics::name_at(intrinsic_id()), intrinsic_id());
duke@435 713 }
duke@435 714 #endif
duke@435 715 return false;
duke@435 716 }
duke@435 717 }
duke@435 718
duke@435 719 //------------------------------push_result------------------------------
duke@435 720 // Helper function for finishing intrinsics.
duke@435 721 void LibraryCallKit::push_result(RegionNode* region, PhiNode* value) {
duke@435 722 record_for_igvn(region);
duke@435 723 set_control(_gvn.transform(region));
duke@435 724 BasicType value_type = value->type()->basic_type();
duke@435 725 push_node(value_type, _gvn.transform(value));
duke@435 726 }
duke@435 727
duke@435 728 //------------------------------generate_guard---------------------------
duke@435 729 // Helper function for generating guarded fast-slow graph structures.
duke@435 730 // The given 'test', if true, guards a slow path. If the test fails
duke@435 731 // then a fast path can be taken. (We generally hope it fails.)
duke@435 732 // In all cases, GraphKit::control() is updated to the fast path.
duke@435 733 // The returned value represents the control for the slow path.
duke@435 734 // The return value is never 'top'; it is either a valid control
duke@435 735 // or NULL if it is obvious that the slow path can never be taken.
duke@435 736 // Also, if region and the slow control are not NULL, the slow edge
duke@435 737 // is appended to the region.
duke@435 738 Node* LibraryCallKit::generate_guard(Node* test, RegionNode* region, float true_prob) {
duke@435 739 if (stopped()) {
duke@435 740 // Already short circuited.
duke@435 741 return NULL;
duke@435 742 }
duke@435 743
duke@435 744 // Build an if node and its projections.
duke@435 745 // If test is true we take the slow path, which we assume is uncommon.
duke@435 746 if (_gvn.type(test) == TypeInt::ZERO) {
duke@435 747 // The slow branch is never taken. No need to build this guard.
duke@435 748 return NULL;
duke@435 749 }
duke@435 750
duke@435 751 IfNode* iff = create_and_map_if(control(), test, true_prob, COUNT_UNKNOWN);
duke@435 752
duke@435 753 Node* if_slow = _gvn.transform( new (C, 1) IfTrueNode(iff) );
duke@435 754 if (if_slow == top()) {
duke@435 755 // The slow branch is never taken. No need to build this guard.
duke@435 756 return NULL;
duke@435 757 }
duke@435 758
duke@435 759 if (region != NULL)
duke@435 760 region->add_req(if_slow);
duke@435 761
duke@435 762 Node* if_fast = _gvn.transform( new (C, 1) IfFalseNode(iff) );
duke@435 763 set_control(if_fast);
duke@435 764
duke@435 765 return if_slow;
duke@435 766 }
duke@435 767
duke@435 768 inline Node* LibraryCallKit::generate_slow_guard(Node* test, RegionNode* region) {
duke@435 769 return generate_guard(test, region, PROB_UNLIKELY_MAG(3));
duke@435 770 }
duke@435 771 inline Node* LibraryCallKit::generate_fair_guard(Node* test, RegionNode* region) {
duke@435 772 return generate_guard(test, region, PROB_FAIR);
duke@435 773 }
duke@435 774
duke@435 775 inline Node* LibraryCallKit::generate_negative_guard(Node* index, RegionNode* region,
duke@435 776 Node* *pos_index) {
duke@435 777 if (stopped())
duke@435 778 return NULL; // already stopped
duke@435 779 if (_gvn.type(index)->higher_equal(TypeInt::POS)) // [0,maxint]
duke@435 780 return NULL; // index is already adequately typed
duke@435 781 Node* cmp_lt = _gvn.transform( new (C, 3) CmpINode(index, intcon(0)) );
duke@435 782 Node* bol_lt = _gvn.transform( new (C, 2) BoolNode(cmp_lt, BoolTest::lt) );
duke@435 783 Node* is_neg = generate_guard(bol_lt, region, PROB_MIN);
duke@435 784 if (is_neg != NULL && pos_index != NULL) {
duke@435 785 // Emulate effect of Parse::adjust_map_after_if.
duke@435 786 Node* ccast = new (C, 2) CastIINode(index, TypeInt::POS);
duke@435 787 ccast->set_req(0, control());
duke@435 788 (*pos_index) = _gvn.transform(ccast);
duke@435 789 }
duke@435 790 return is_neg;
duke@435 791 }
duke@435 792
duke@435 793 inline Node* LibraryCallKit::generate_nonpositive_guard(Node* index, bool never_negative,
duke@435 794 Node* *pos_index) {
duke@435 795 if (stopped())
duke@435 796 return NULL; // already stopped
duke@435 797 if (_gvn.type(index)->higher_equal(TypeInt::POS1)) // [1,maxint]
duke@435 798 return NULL; // index is already adequately typed
duke@435 799 Node* cmp_le = _gvn.transform( new (C, 3) CmpINode(index, intcon(0)) );
duke@435 800 BoolTest::mask le_or_eq = (never_negative ? BoolTest::eq : BoolTest::le);
duke@435 801 Node* bol_le = _gvn.transform( new (C, 2) BoolNode(cmp_le, le_or_eq) );
duke@435 802 Node* is_notp = generate_guard(bol_le, NULL, PROB_MIN);
duke@435 803 if (is_notp != NULL && pos_index != NULL) {
duke@435 804 // Emulate effect of Parse::adjust_map_after_if.
duke@435 805 Node* ccast = new (C, 2) CastIINode(index, TypeInt::POS1);
duke@435 806 ccast->set_req(0, control());
duke@435 807 (*pos_index) = _gvn.transform(ccast);
duke@435 808 }
duke@435 809 return is_notp;
duke@435 810 }
duke@435 811
duke@435 812 // Make sure that 'position' is a valid limit index, in [0..length].
duke@435 813 // There are two equivalent plans for checking this:
duke@435 814 // A. (offset + copyLength) unsigned<= arrayLength
duke@435 815 // B. offset <= (arrayLength - copyLength)
duke@435 816 // We require that all of the values above, except for the sum and
duke@435 817 // difference, are already known to be non-negative.
duke@435 818 // Plan A is robust in the face of overflow, if offset and copyLength
duke@435 819 // are both hugely positive.
duke@435 820 //
duke@435 821 // Plan B is less direct and intuitive, but it does not overflow at
duke@435 822 // all, since the difference of two non-negatives is always
duke@435 823 // representable. Whenever Java methods must perform the equivalent
duke@435 824 // check they generally use Plan B instead of Plan A.
duke@435 825 // For the moment we use Plan A.
duke@435 826 inline Node* LibraryCallKit::generate_limit_guard(Node* offset,
duke@435 827 Node* subseq_length,
duke@435 828 Node* array_length,
duke@435 829 RegionNode* region) {
duke@435 830 if (stopped())
duke@435 831 return NULL; // already stopped
duke@435 832 bool zero_offset = _gvn.type(offset) == TypeInt::ZERO;
duke@435 833 if (zero_offset && _gvn.eqv_uncast(subseq_length, array_length))
duke@435 834 return NULL; // common case of whole-array copy
duke@435 835 Node* last = subseq_length;
duke@435 836 if (!zero_offset) // last += offset
duke@435 837 last = _gvn.transform( new (C, 3) AddINode(last, offset));
duke@435 838 Node* cmp_lt = _gvn.transform( new (C, 3) CmpUNode(array_length, last) );
duke@435 839 Node* bol_lt = _gvn.transform( new (C, 2) BoolNode(cmp_lt, BoolTest::lt) );
duke@435 840 Node* is_over = generate_guard(bol_lt, region, PROB_MIN);
duke@435 841 return is_over;
duke@435 842 }
duke@435 843
duke@435 844
duke@435 845 //--------------------------generate_current_thread--------------------
duke@435 846 Node* LibraryCallKit::generate_current_thread(Node* &tls_output) {
duke@435 847 ciKlass* thread_klass = env()->Thread_klass();
duke@435 848 const Type* thread_type = TypeOopPtr::make_from_klass(thread_klass)->cast_to_ptr_type(TypePtr::NotNull);
duke@435 849 Node* thread = _gvn.transform(new (C, 1) ThreadLocalNode());
duke@435 850 Node* p = basic_plus_adr(top()/*!oop*/, thread, in_bytes(JavaThread::threadObj_offset()));
duke@435 851 Node* threadObj = make_load(NULL, p, thread_type, T_OBJECT);
duke@435 852 tls_output = thread;
duke@435 853 return threadObj;
duke@435 854 }
duke@435 855
duke@435 856
kvn@1421 857 //------------------------------make_string_method_node------------------------
kvn@1421 858 // Helper method for String intrinsic finctions.
kvn@1421 859 Node* LibraryCallKit::make_string_method_node(int opcode, Node* str1, Node* cnt1, Node* str2, Node* cnt2) {
kvn@1421 860 const int value_offset = java_lang_String::value_offset_in_bytes();
kvn@1421 861 const int count_offset = java_lang_String::count_offset_in_bytes();
kvn@1421 862 const int offset_offset = java_lang_String::offset_offset_in_bytes();
kvn@1421 863
kvn@1421 864 Node* no_ctrl = NULL;
kvn@1421 865
kvn@1421 866 ciInstanceKlass* klass = env()->String_klass();
never@1851 867 const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass);
kvn@1421 868
kvn@1421 869 const TypeAryPtr* value_type =
kvn@1421 870 TypeAryPtr::make(TypePtr::NotNull,
kvn@1421 871 TypeAry::make(TypeInt::CHAR,TypeInt::POS),
kvn@1421 872 ciTypeArrayKlass::make(T_CHAR), true, 0);
kvn@1421 873
kvn@1421 874 // Get start addr of string and substring
kvn@1421 875 Node* str1_valuea = basic_plus_adr(str1, str1, value_offset);
kvn@1421 876 Node* str1_value = make_load(no_ctrl, str1_valuea, value_type, T_OBJECT, string_type->add_offset(value_offset));
kvn@1421 877 Node* str1_offseta = basic_plus_adr(str1, str1, offset_offset);
kvn@1421 878 Node* str1_offset = make_load(no_ctrl, str1_offseta, TypeInt::INT, T_INT, string_type->add_offset(offset_offset));
kvn@1421 879 Node* str1_start = array_element_address(str1_value, str1_offset, T_CHAR);
kvn@1421 880
kvn@1421 881 // Pin loads from String::equals() argument since it could be NULL.
kvn@1421 882 Node* str2_ctrl = (opcode == Op_StrEquals) ? control() : no_ctrl;
kvn@1421 883 Node* str2_valuea = basic_plus_adr(str2, str2, value_offset);
kvn@1421 884 Node* str2_value = make_load(str2_ctrl, str2_valuea, value_type, T_OBJECT, string_type->add_offset(value_offset));
kvn@1421 885 Node* str2_offseta = basic_plus_adr(str2, str2, offset_offset);
kvn@1421 886 Node* str2_offset = make_load(str2_ctrl, str2_offseta, TypeInt::INT, T_INT, string_type->add_offset(offset_offset));
kvn@1421 887 Node* str2_start = array_element_address(str2_value, str2_offset, T_CHAR);
kvn@1421 888
kvn@1421 889 Node* result = NULL;
kvn@1421 890 switch (opcode) {
kvn@1421 891 case Op_StrIndexOf:
kvn@1421 892 result = new (C, 6) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS),
kvn@1421 893 str1_start, cnt1, str2_start, cnt2);
kvn@1421 894 break;
kvn@1421 895 case Op_StrComp:
kvn@1421 896 result = new (C, 6) StrCompNode(control(), memory(TypeAryPtr::CHARS),
kvn@1421 897 str1_start, cnt1, str2_start, cnt2);
kvn@1421 898 break;
kvn@1421 899 case Op_StrEquals:
kvn@1421 900 result = new (C, 5) StrEqualsNode(control(), memory(TypeAryPtr::CHARS),
kvn@1421 901 str1_start, str2_start, cnt1);
kvn@1421 902 break;
kvn@1421 903 default:
kvn@1421 904 ShouldNotReachHere();
kvn@1421 905 return NULL;
kvn@1421 906 }
kvn@1421 907
kvn@1421 908 // All these intrinsics have checks.
kvn@1421 909 C->set_has_split_ifs(true); // Has chance for split-if optimization
kvn@1421 910
kvn@1421 911 return _gvn.transform(result);
kvn@1421 912 }
kvn@1421 913
duke@435 914 //------------------------------inline_string_compareTo------------------------
duke@435 915 bool LibraryCallKit::inline_string_compareTo() {
duke@435 916
cfang@1116 917 if (!Matcher::has_match_rule(Op_StrComp)) return false;
cfang@1116 918
duke@435 919 const int value_offset = java_lang_String::value_offset_in_bytes();
duke@435 920 const int count_offset = java_lang_String::count_offset_in_bytes();
duke@435 921 const int offset_offset = java_lang_String::offset_offset_in_bytes();
duke@435 922
duke@435 923 _sp += 2;
duke@435 924 Node *argument = pop(); // pop non-receiver first: it was pushed second
duke@435 925 Node *receiver = pop();
duke@435 926
duke@435 927 // Null check on self without removing any arguments. The argument
duke@435 928 // null check technically happens in the wrong place, which can lead to
duke@435 929 // invalid stack traces when string compare is inlined into a method
duke@435 930 // which handles NullPointerExceptions.
duke@435 931 _sp += 2;
duke@435 932 receiver = do_null_check(receiver, T_OBJECT);
duke@435 933 argument = do_null_check(argument, T_OBJECT);
duke@435 934 _sp -= 2;
duke@435 935 if (stopped()) {
duke@435 936 return true;
duke@435 937 }
duke@435 938
duke@435 939 ciInstanceKlass* klass = env()->String_klass();
never@1851 940 const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass);
kvn@1421 941 Node* no_ctrl = NULL;
kvn@1421 942
kvn@1421 943 // Get counts for string and argument
kvn@1421 944 Node* receiver_cnta = basic_plus_adr(receiver, receiver, count_offset);
kvn@1421 945 Node* receiver_cnt = make_load(no_ctrl, receiver_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset));
kvn@1421 946
kvn@1421 947 Node* argument_cnta = basic_plus_adr(argument, argument, count_offset);
kvn@1421 948 Node* argument_cnt = make_load(no_ctrl, argument_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset));
kvn@1421 949
kvn@1421 950 Node* compare = make_string_method_node(Op_StrComp, receiver, receiver_cnt, argument, argument_cnt);
duke@435 951 push(compare);
duke@435 952 return true;
duke@435 953 }
duke@435 954
cfang@1116 955 //------------------------------inline_string_equals------------------------
cfang@1116 956 bool LibraryCallKit::inline_string_equals() {
cfang@1116 957
cfang@1116 958 if (!Matcher::has_match_rule(Op_StrEquals)) return false;
cfang@1116 959
cfang@1116 960 const int value_offset = java_lang_String::value_offset_in_bytes();
cfang@1116 961 const int count_offset = java_lang_String::count_offset_in_bytes();
cfang@1116 962 const int offset_offset = java_lang_String::offset_offset_in_bytes();
cfang@1116 963
jrose@2101 964 int nargs = 2;
jrose@2101 965 _sp += nargs;
cfang@1116 966 Node* argument = pop(); // pop non-receiver first: it was pushed second
cfang@1116 967 Node* receiver = pop();
cfang@1116 968
cfang@1116 969 // Null check on self without removing any arguments. The argument
cfang@1116 970 // null check technically happens in the wrong place, which can lead to
cfang@1116 971 // invalid stack traces when string compare is inlined into a method
cfang@1116 972 // which handles NullPointerExceptions.
jrose@2101 973 _sp += nargs;
cfang@1116 974 receiver = do_null_check(receiver, T_OBJECT);
cfang@1116 975 //should not do null check for argument for String.equals(), because spec
cfang@1116 976 //allows to specify NULL as argument.
jrose@2101 977 _sp -= nargs;
cfang@1116 978
cfang@1116 979 if (stopped()) {
cfang@1116 980 return true;
cfang@1116 981 }
cfang@1116 982
kvn@1421 983 // paths (plus control) merge
kvn@1421 984 RegionNode* region = new (C, 5) RegionNode(5);
kvn@1421 985 Node* phi = new (C, 5) PhiNode(region, TypeInt::BOOL);
kvn@1421 986
kvn@1421 987 // does source == target string?
kvn@1421 988 Node* cmp = _gvn.transform(new (C, 3) CmpPNode(receiver, argument));
kvn@1421 989 Node* bol = _gvn.transform(new (C, 2) BoolNode(cmp, BoolTest::eq));
kvn@1421 990
kvn@1421 991 Node* if_eq = generate_slow_guard(bol, NULL);
kvn@1421 992 if (if_eq != NULL) {
kvn@1421 993 // receiver == argument
kvn@1421 994 phi->init_req(2, intcon(1));
kvn@1421 995 region->init_req(2, if_eq);
kvn@1421 996 }
kvn@1421 997
cfang@1116 998 // get String klass for instanceOf
cfang@1116 999 ciInstanceKlass* klass = env()->String_klass();
cfang@1116 1000
kvn@1421 1001 if (!stopped()) {
jrose@2101 1002 _sp += nargs; // gen_instanceof might do an uncommon trap
kvn@1421 1003 Node* inst = gen_instanceof(argument, makecon(TypeKlassPtr::make(klass)));
jrose@2101 1004 _sp -= nargs;
kvn@1421 1005 Node* cmp = _gvn.transform(new (C, 3) CmpINode(inst, intcon(1)));
kvn@1421 1006 Node* bol = _gvn.transform(new (C, 2) BoolNode(cmp, BoolTest::ne));
kvn@1421 1007
kvn@1421 1008 Node* inst_false = generate_guard(bol, NULL, PROB_MIN);
kvn@1421 1009 //instanceOf == true, fallthrough
kvn@1421 1010
kvn@1421 1011 if (inst_false != NULL) {
kvn@1421 1012 phi->init_req(3, intcon(0));
kvn@1421 1013 region->init_req(3, inst_false);
kvn@1421 1014 }
kvn@1421 1015 }
cfang@1116 1016
never@1851 1017 const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass);
cfang@1116 1018
kvn@1421 1019 Node* no_ctrl = NULL;
kvn@1421 1020 Node* receiver_cnt;
kvn@1421 1021 Node* argument_cnt;
kvn@1421 1022
kvn@1421 1023 if (!stopped()) {
never@1851 1024 // Properly cast the argument to String
never@1851 1025 argument = _gvn.transform(new (C, 2) CheckCastPPNode(control(), argument, string_type));
never@1851 1026
kvn@1421 1027 // Get counts for string and argument
kvn@1421 1028 Node* receiver_cnta = basic_plus_adr(receiver, receiver, count_offset);
kvn@1421 1029 receiver_cnt = make_load(no_ctrl, receiver_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset));
kvn@1421 1030
kvn@1421 1031 // Pin load from argument string since it could be NULL.
kvn@1421 1032 Node* argument_cnta = basic_plus_adr(argument, argument, count_offset);
kvn@1421 1033 argument_cnt = make_load(control(), argument_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset));
kvn@1421 1034
kvn@1421 1035 // Check for receiver count != argument count
kvn@1421 1036 Node* cmp = _gvn.transform( new(C, 3) CmpINode(receiver_cnt, argument_cnt) );
kvn@1421 1037 Node* bol = _gvn.transform( new(C, 2) BoolNode(cmp, BoolTest::ne) );
kvn@1421 1038 Node* if_ne = generate_slow_guard(bol, NULL);
kvn@1421 1039 if (if_ne != NULL) {
kvn@1421 1040 phi->init_req(4, intcon(0));
kvn@1421 1041 region->init_req(4, if_ne);
kvn@1421 1042 }
kvn@1421 1043 }
kvn@1421 1044
kvn@1421 1045 // Check for count == 0 is done by mach node StrEquals.
kvn@1421 1046
kvn@1421 1047 if (!stopped()) {
kvn@1421 1048 Node* equals = make_string_method_node(Op_StrEquals, receiver, receiver_cnt, argument, argument_cnt);
kvn@1421 1049 phi->init_req(1, equals);
kvn@1421 1050 region->init_req(1, control());
kvn@1421 1051 }
cfang@1116 1052
cfang@1116 1053 // post merge
cfang@1116 1054 set_control(_gvn.transform(region));
cfang@1116 1055 record_for_igvn(region);
cfang@1116 1056
cfang@1116 1057 push(_gvn.transform(phi));
cfang@1116 1058
cfang@1116 1059 return true;
cfang@1116 1060 }
cfang@1116 1061
rasbold@604 1062 //------------------------------inline_array_equals----------------------------
rasbold@604 1063 bool LibraryCallKit::inline_array_equals() {
rasbold@604 1064
rasbold@609 1065 if (!Matcher::has_match_rule(Op_AryEq)) return false;
rasbold@609 1066
rasbold@604 1067 _sp += 2;
rasbold@604 1068 Node *argument2 = pop();
rasbold@604 1069 Node *argument1 = pop();
rasbold@604 1070
rasbold@604 1071 Node* equals =
kvn@1421 1072 _gvn.transform(new (C, 4) AryEqNode(control(), memory(TypeAryPtr::CHARS),
kvn@1421 1073 argument1, argument2) );
rasbold@604 1074 push(equals);
rasbold@604 1075 return true;
rasbold@604 1076 }
rasbold@604 1077
duke@435 1078 // Java version of String.indexOf(constant string)
duke@435 1079 // class StringDecl {
duke@435 1080 // StringDecl(char[] ca) {
duke@435 1081 // offset = 0;
duke@435 1082 // count = ca.length;
duke@435 1083 // value = ca;
duke@435 1084 // }
duke@435 1085 // int offset;
duke@435 1086 // int count;
duke@435 1087 // char[] value;
duke@435 1088 // }
duke@435 1089 //
duke@435 1090 // static int string_indexOf_J(StringDecl string_object, char[] target_object,
duke@435 1091 // int targetOffset, int cache_i, int md2) {
duke@435 1092 // int cache = cache_i;
duke@435 1093 // int sourceOffset = string_object.offset;
duke@435 1094 // int sourceCount = string_object.count;
duke@435 1095 // int targetCount = target_object.length;
duke@435 1096 //
duke@435 1097 // int targetCountLess1 = targetCount - 1;
duke@435 1098 // int sourceEnd = sourceOffset + sourceCount - targetCountLess1;
duke@435 1099 //
duke@435 1100 // char[] source = string_object.value;
duke@435 1101 // char[] target = target_object;
duke@435 1102 // int lastChar = target[targetCountLess1];
duke@435 1103 //
duke@435 1104 // outer_loop:
duke@435 1105 // for (int i = sourceOffset; i < sourceEnd; ) {
duke@435 1106 // int src = source[i + targetCountLess1];
duke@435 1107 // if (src == lastChar) {
duke@435 1108 // // With random strings and a 4-character alphabet,
duke@435 1109 // // reverse matching at this point sets up 0.8% fewer
duke@435 1110 // // frames, but (paradoxically) makes 0.3% more probes.
duke@435 1111 // // Since those probes are nearer the lastChar probe,
duke@435 1112 // // there is may be a net D$ win with reverse matching.
duke@435 1113 // // But, reversing loop inhibits unroll of inner loop
duke@435 1114 // // for unknown reason. So, does running outer loop from
duke@435 1115 // // (sourceOffset - targetCountLess1) to (sourceOffset + sourceCount)
duke@435 1116 // for (int j = 0; j < targetCountLess1; j++) {
duke@435 1117 // if (target[targetOffset + j] != source[i+j]) {
duke@435 1118 // if ((cache & (1 << source[i+j])) == 0) {
duke@435 1119 // if (md2 < j+1) {
duke@435 1120 // i += j+1;
duke@435 1121 // continue outer_loop;
duke@435 1122 // }
duke@435 1123 // }
duke@435 1124 // i += md2;
duke@435 1125 // continue outer_loop;
duke@435 1126 // }
duke@435 1127 // }
duke@435 1128 // return i - sourceOffset;
duke@435 1129 // }
duke@435 1130 // if ((cache & (1 << src)) == 0) {
duke@435 1131 // i += targetCountLess1;
duke@435 1132 // } // using "i += targetCount;" and an "else i++;" causes a jump to jump.
duke@435 1133 // i++;
duke@435 1134 // }
duke@435 1135 // return -1;
duke@435 1136 // }
duke@435 1137
duke@435 1138 //------------------------------string_indexOf------------------------
duke@435 1139 Node* LibraryCallKit::string_indexOf(Node* string_object, ciTypeArray* target_array, jint targetOffset_i,
duke@435 1140 jint cache_i, jint md2_i) {
duke@435 1141
duke@435 1142 Node* no_ctrl = NULL;
duke@435 1143 float likely = PROB_LIKELY(0.9);
duke@435 1144 float unlikely = PROB_UNLIKELY(0.9);
duke@435 1145
kvn@2665 1146 const int nargs = 2; // number of arguments to push back for uncommon trap in predicate
kvn@2665 1147
duke@435 1148 const int value_offset = java_lang_String::value_offset_in_bytes();
duke@435 1149 const int count_offset = java_lang_String::count_offset_in_bytes();
duke@435 1150 const int offset_offset = java_lang_String::offset_offset_in_bytes();
duke@435 1151
duke@435 1152 ciInstanceKlass* klass = env()->String_klass();
never@1851 1153 const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass);
duke@435 1154 const TypeAryPtr* source_type = TypeAryPtr::make(TypePtr::NotNull, TypeAry::make(TypeInt::CHAR,TypeInt::POS), ciTypeArrayKlass::make(T_CHAR), true, 0);
duke@435 1155
duke@435 1156 Node* sourceOffseta = basic_plus_adr(string_object, string_object, offset_offset);
duke@435 1157 Node* sourceOffset = make_load(no_ctrl, sourceOffseta, TypeInt::INT, T_INT, string_type->add_offset(offset_offset));
duke@435 1158 Node* sourceCounta = basic_plus_adr(string_object, string_object, count_offset);
duke@435 1159 Node* sourceCount = make_load(no_ctrl, sourceCounta, TypeInt::INT, T_INT, string_type->add_offset(count_offset));
duke@435 1160 Node* sourcea = basic_plus_adr(string_object, string_object, value_offset);
duke@435 1161 Node* source = make_load(no_ctrl, sourcea, source_type, T_OBJECT, string_type->add_offset(value_offset));
duke@435 1162
jcoomes@2661 1163 Node* target = _gvn.transform( makecon(TypeOopPtr::make_from_constant(target_array, true)) );
duke@435 1164 jint target_length = target_array->length();
duke@435 1165 const TypeAry* target_array_type = TypeAry::make(TypeInt::CHAR, TypeInt::make(0, target_length, Type::WidenMin));
duke@435 1166 const TypeAryPtr* target_type = TypeAryPtr::make(TypePtr::BotPTR, target_array_type, target_array->klass(), true, Type::OffsetBot);
duke@435 1167
kvn@1286 1168 IdealKit kit(gvn(), control(), merged_memory(), false, true);
duke@435 1169 #define __ kit.
duke@435 1170 Node* zero = __ ConI(0);
duke@435 1171 Node* one = __ ConI(1);
duke@435 1172 Node* cache = __ ConI(cache_i);
duke@435 1173 Node* md2 = __ ConI(md2_i);
duke@435 1174 Node* lastChar = __ ConI(target_array->char_at(target_length - 1));
duke@435 1175 Node* targetCount = __ ConI(target_length);
duke@435 1176 Node* targetCountLess1 = __ ConI(target_length - 1);
duke@435 1177 Node* targetOffset = __ ConI(targetOffset_i);
duke@435 1178 Node* sourceEnd = __ SubI(__ AddI(sourceOffset, sourceCount), targetCountLess1);
duke@435 1179
kvn@1286 1180 IdealVariable rtn(kit), i(kit), j(kit); __ declarations_done();
duke@435 1181 Node* outer_loop = __ make_label(2 /* goto */);
duke@435 1182 Node* return_ = __ make_label(1);
duke@435 1183
duke@435 1184 __ set(rtn,__ ConI(-1));
kvn@2665 1185 __ loop(this, nargs, i, sourceOffset, BoolTest::lt, sourceEnd); {
duke@435 1186 Node* i2 = __ AddI(__ value(i), targetCountLess1);
duke@435 1187 // pin to prohibit loading of "next iteration" value which may SEGV (rare)
duke@435 1188 Node* src = load_array_element(__ ctrl(), source, i2, TypeAryPtr::CHARS);
duke@435 1189 __ if_then(src, BoolTest::eq, lastChar, unlikely); {
kvn@2665 1190 __ loop(this, nargs, j, zero, BoolTest::lt, targetCountLess1); {
duke@435 1191 Node* tpj = __ AddI(targetOffset, __ value(j));
duke@435 1192 Node* targ = load_array_element(no_ctrl, target, tpj, target_type);
duke@435 1193 Node* ipj = __ AddI(__ value(i), __ value(j));
duke@435 1194 Node* src2 = load_array_element(no_ctrl, source, ipj, TypeAryPtr::CHARS);
duke@435 1195 __ if_then(targ, BoolTest::ne, src2); {
duke@435 1196 __ if_then(__ AndI(cache, __ LShiftI(one, src2)), BoolTest::eq, zero); {
duke@435 1197 __ if_then(md2, BoolTest::lt, __ AddI(__ value(j), one)); {
duke@435 1198 __ increment(i, __ AddI(__ value(j), one));
duke@435 1199 __ goto_(outer_loop);
duke@435 1200 } __ end_if(); __ dead(j);
duke@435 1201 }__ end_if(); __ dead(j);
duke@435 1202 __ increment(i, md2);
duke@435 1203 __ goto_(outer_loop);
duke@435 1204 }__ end_if();
duke@435 1205 __ increment(j, one);
duke@435 1206 }__ end_loop(); __ dead(j);
duke@435 1207 __ set(rtn, __ SubI(__ value(i), sourceOffset)); __ dead(i);
duke@435 1208 __ goto_(return_);
duke@435 1209 }__ end_if();
duke@435 1210 __ if_then(__ AndI(cache, __ LShiftI(one, src)), BoolTest::eq, zero, likely); {
duke@435 1211 __ increment(i, targetCountLess1);
duke@435 1212 }__ end_if();
duke@435 1213 __ increment(i, one);
duke@435 1214 __ bind(outer_loop);
duke@435 1215 }__ end_loop(); __ dead(i);
duke@435 1216 __ bind(return_);
kvn@1286 1217
kvn@1286 1218 // Final sync IdealKit and GraphKit.
kvn@1286 1219 sync_kit(kit);
duke@435 1220 Node* result = __ value(rtn);
duke@435 1221 #undef __
duke@435 1222 C->set_has_loops(true);
duke@435 1223 return result;
duke@435 1224 }
duke@435 1225
duke@435 1226 //------------------------------inline_string_indexOf------------------------
duke@435 1227 bool LibraryCallKit::inline_string_indexOf() {
duke@435 1228
cfang@1116 1229 const int value_offset = java_lang_String::value_offset_in_bytes();
cfang@1116 1230 const int count_offset = java_lang_String::count_offset_in_bytes();
cfang@1116 1231 const int offset_offset = java_lang_String::offset_offset_in_bytes();
cfang@1116 1232
duke@435 1233 _sp += 2;
duke@435 1234 Node *argument = pop(); // pop non-receiver first: it was pushed second
duke@435 1235 Node *receiver = pop();
duke@435 1236
cfang@1116 1237 Node* result;
iveresov@1859 1238 // Disable the use of pcmpestri until it can be guaranteed that
iveresov@1859 1239 // the load doesn't cross into the uncommited space.
kvn@2602 1240 if (Matcher::has_match_rule(Op_StrIndexOf) &&
cfang@1116 1241 UseSSE42Intrinsics) {
cfang@1116 1242 // Generate SSE4.2 version of indexOf
cfang@1116 1243 // We currently only have match rules that use SSE4.2
cfang@1116 1244
cfang@1116 1245 // Null check on self without removing any arguments. The argument
cfang@1116 1246 // null check technically happens in the wrong place, which can lead to
cfang@1116 1247 // invalid stack traces when string compare is inlined into a method
cfang@1116 1248 // which handles NullPointerExceptions.
cfang@1116 1249 _sp += 2;
cfang@1116 1250 receiver = do_null_check(receiver, T_OBJECT);
cfang@1116 1251 argument = do_null_check(argument, T_OBJECT);
cfang@1116 1252 _sp -= 2;
cfang@1116 1253
cfang@1116 1254 if (stopped()) {
cfang@1116 1255 return true;
cfang@1116 1256 }
cfang@1116 1257
kvn@2602 1258 ciInstanceKlass* str_klass = env()->String_klass();
kvn@2602 1259 const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(str_klass);
kvn@2602 1260
kvn@1421 1261 // Make the merge point
kvn@2602 1262 RegionNode* result_rgn = new (C, 4) RegionNode(4);
kvn@2602 1263 Node* result_phi = new (C, 4) PhiNode(result_rgn, TypeInt::INT);
kvn@1421 1264 Node* no_ctrl = NULL;
kvn@1421 1265
kvn@1421 1266 // Get counts for string and substr
kvn@1421 1267 Node* source_cnta = basic_plus_adr(receiver, receiver, count_offset);
kvn@1421 1268 Node* source_cnt = make_load(no_ctrl, source_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset));
kvn@1421 1269
kvn@1421 1270 Node* substr_cnta = basic_plus_adr(argument, argument, count_offset);
kvn@1421 1271 Node* substr_cnt = make_load(no_ctrl, substr_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset));
kvn@1421 1272
kvn@1421 1273 // Check for substr count > string count
kvn@1421 1274 Node* cmp = _gvn.transform( new(C, 3) CmpINode(substr_cnt, source_cnt) );
kvn@1421 1275 Node* bol = _gvn.transform( new(C, 2) BoolNode(cmp, BoolTest::gt) );
kvn@1421 1276 Node* if_gt = generate_slow_guard(bol, NULL);
kvn@1421 1277 if (if_gt != NULL) {
kvn@1421 1278 result_phi->init_req(2, intcon(-1));
kvn@1421 1279 result_rgn->init_req(2, if_gt);
kvn@1421 1280 }
kvn@1421 1281
kvn@1421 1282 if (!stopped()) {
kvn@2602 1283 // Check for substr count == 0
kvn@2602 1284 cmp = _gvn.transform( new(C, 3) CmpINode(substr_cnt, intcon(0)) );
kvn@2602 1285 bol = _gvn.transform( new(C, 2) BoolNode(cmp, BoolTest::eq) );
kvn@2602 1286 Node* if_zero = generate_slow_guard(bol, NULL);
kvn@2602 1287 if (if_zero != NULL) {
kvn@2602 1288 result_phi->init_req(3, intcon(0));
kvn@2602 1289 result_rgn->init_req(3, if_zero);
kvn@2602 1290 }
kvn@2602 1291 }
kvn@2602 1292
kvn@2602 1293 if (!stopped()) {
kvn@1421 1294 result = make_string_method_node(Op_StrIndexOf, receiver, source_cnt, argument, substr_cnt);
kvn@1421 1295 result_phi->init_req(1, result);
kvn@1421 1296 result_rgn->init_req(1, control());
kvn@1421 1297 }
kvn@1421 1298 set_control(_gvn.transform(result_rgn));
kvn@1421 1299 record_for_igvn(result_rgn);
kvn@1421 1300 result = _gvn.transform(result_phi);
kvn@1421 1301
kvn@2602 1302 } else { // Use LibraryCallKit::string_indexOf
kvn@2602 1303 // don't intrinsify if argument isn't a constant string.
cfang@1116 1304 if (!argument->is_Con()) {
cfang@1116 1305 return false;
cfang@1116 1306 }
cfang@1116 1307 const TypeOopPtr* str_type = _gvn.type(argument)->isa_oopptr();
cfang@1116 1308 if (str_type == NULL) {
cfang@1116 1309 return false;
cfang@1116 1310 }
cfang@1116 1311 ciInstanceKlass* klass = env()->String_klass();
cfang@1116 1312 ciObject* str_const = str_type->const_oop();
cfang@1116 1313 if (str_const == NULL || str_const->klass() != klass) {
cfang@1116 1314 return false;
cfang@1116 1315 }
cfang@1116 1316 ciInstance* str = str_const->as_instance();
cfang@1116 1317 assert(str != NULL, "must be instance");
cfang@1116 1318
cfang@1116 1319 ciObject* v = str->field_value_by_offset(value_offset).as_object();
cfang@1116 1320 int o = str->field_value_by_offset(offset_offset).as_int();
cfang@1116 1321 int c = str->field_value_by_offset(count_offset).as_int();
cfang@1116 1322 ciTypeArray* pat = v->as_type_array(); // pattern (argument) character array
cfang@1116 1323
cfang@1116 1324 // constant strings have no offset and count == length which
cfang@1116 1325 // simplifies the resulting code somewhat so lets optimize for that.
cfang@1116 1326 if (o != 0 || c != pat->length()) {
cfang@1116 1327 return false;
cfang@1116 1328 }
cfang@1116 1329
cfang@1116 1330 // Null check on self without removing any arguments. The argument
cfang@1116 1331 // null check technically happens in the wrong place, which can lead to
cfang@1116 1332 // invalid stack traces when string compare is inlined into a method
cfang@1116 1333 // which handles NullPointerExceptions.
cfang@1116 1334 _sp += 2;
cfang@1116 1335 receiver = do_null_check(receiver, T_OBJECT);
cfang@1116 1336 // No null check on the argument is needed since it's a constant String oop.
cfang@1116 1337 _sp -= 2;
cfang@1116 1338 if (stopped()) {
kvn@2602 1339 return true;
cfang@1116 1340 }
cfang@1116 1341
cfang@1116 1342 // The null string as a pattern always returns 0 (match at beginning of string)
cfang@1116 1343 if (c == 0) {
cfang@1116 1344 push(intcon(0));
cfang@1116 1345 return true;
cfang@1116 1346 }
cfang@1116 1347
cfang@1116 1348 // Generate default indexOf
cfang@1116 1349 jchar lastChar = pat->char_at(o + (c - 1));
cfang@1116 1350 int cache = 0;
cfang@1116 1351 int i;
cfang@1116 1352 for (i = 0; i < c - 1; i++) {
cfang@1116 1353 assert(i < pat->length(), "out of range");
cfang@1116 1354 cache |= (1 << (pat->char_at(o + i) & (sizeof(cache) * BitsPerByte - 1)));
cfang@1116 1355 }
cfang@1116 1356
cfang@1116 1357 int md2 = c;
cfang@1116 1358 for (i = 0; i < c - 1; i++) {
cfang@1116 1359 assert(i < pat->length(), "out of range");
cfang@1116 1360 if (pat->char_at(o + i) == lastChar) {
cfang@1116 1361 md2 = (c - 1) - i;
cfang@1116 1362 }
cfang@1116 1363 }
cfang@1116 1364
cfang@1116 1365 result = string_indexOf(receiver, pat, o, cache, md2);
duke@435 1366 }
cfang@1116 1367
duke@435 1368 push(result);
duke@435 1369 return true;
duke@435 1370 }
duke@435 1371
duke@435 1372 //--------------------------pop_math_arg--------------------------------
duke@435 1373 // Pop a double argument to a math function from the stack
duke@435 1374 // rounding it if necessary.
duke@435 1375 Node * LibraryCallKit::pop_math_arg() {
duke@435 1376 Node *arg = pop_pair();
duke@435 1377 if( Matcher::strict_fp_requires_explicit_rounding && UseSSE<=1 )
duke@435 1378 arg = _gvn.transform( new (C, 2) RoundDoubleNode(0, arg) );
duke@435 1379 return arg;
duke@435 1380 }
duke@435 1381
duke@435 1382 //------------------------------inline_trig----------------------------------
duke@435 1383 // Inline sin/cos/tan instructions, if possible. If rounding is required, do
duke@435 1384 // argument reduction which will turn into a fast/slow diamond.
duke@435 1385 bool LibraryCallKit::inline_trig(vmIntrinsics::ID id) {
duke@435 1386 _sp += arg_size(); // restore stack pointer
duke@435 1387 Node* arg = pop_math_arg();
duke@435 1388 Node* trig = NULL;
duke@435 1389
duke@435 1390 switch (id) {
duke@435 1391 case vmIntrinsics::_dsin:
duke@435 1392 trig = _gvn.transform((Node*)new (C, 2) SinDNode(arg));
duke@435 1393 break;
duke@435 1394 case vmIntrinsics::_dcos:
duke@435 1395 trig = _gvn.transform((Node*)new (C, 2) CosDNode(arg));
duke@435 1396 break;
duke@435 1397 case vmIntrinsics::_dtan:
duke@435 1398 trig = _gvn.transform((Node*)new (C, 2) TanDNode(arg));
duke@435 1399 break;
duke@435 1400 default:
duke@435 1401 assert(false, "bad intrinsic was passed in");
duke@435 1402 return false;
duke@435 1403 }
duke@435 1404
duke@435 1405 // Rounding required? Check for argument reduction!
duke@435 1406 if( Matcher::strict_fp_requires_explicit_rounding ) {
duke@435 1407
duke@435 1408 static const double pi_4 = 0.7853981633974483;
duke@435 1409 static const double neg_pi_4 = -0.7853981633974483;
duke@435 1410 // pi/2 in 80-bit extended precision
duke@435 1411 // static const unsigned char pi_2_bits_x[] = {0x35,0xc2,0x68,0x21,0xa2,0xda,0x0f,0xc9,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00};
duke@435 1412 // -pi/2 in 80-bit extended precision
duke@435 1413 // static const unsigned char neg_pi_2_bits_x[] = {0x35,0xc2,0x68,0x21,0xa2,0xda,0x0f,0xc9,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00};
duke@435 1414 // Cutoff value for using this argument reduction technique
duke@435 1415 //static const double pi_2_minus_epsilon = 1.564660403643354;
duke@435 1416 //static const double neg_pi_2_plus_epsilon = -1.564660403643354;
duke@435 1417
duke@435 1418 // Pseudocode for sin:
duke@435 1419 // if (x <= Math.PI / 4.0) {
duke@435 1420 // if (x >= -Math.PI / 4.0) return fsin(x);
duke@435 1421 // if (x >= -Math.PI / 2.0) return -fcos(x + Math.PI / 2.0);
duke@435 1422 // } else {
duke@435 1423 // if (x <= Math.PI / 2.0) return fcos(x - Math.PI / 2.0);
duke@435 1424 // }
duke@435 1425 // return StrictMath.sin(x);
duke@435 1426
duke@435 1427 // Pseudocode for cos:
duke@435 1428 // if (x <= Math.PI / 4.0) {
duke@435 1429 // if (x >= -Math.PI / 4.0) return fcos(x);
duke@435 1430 // if (x >= -Math.PI / 2.0) return fsin(x + Math.PI / 2.0);
duke@435 1431 // } else {
duke@435 1432 // if (x <= Math.PI / 2.0) return -fsin(x - Math.PI / 2.0);
duke@435 1433 // }
duke@435 1434 // return StrictMath.cos(x);
duke@435 1435
duke@435 1436 // Actually, sticking in an 80-bit Intel value into C2 will be tough; it
duke@435 1437 // requires a special machine instruction to load it. Instead we'll try
duke@435 1438 // the 'easy' case. If we really need the extra range +/- PI/2 we'll
duke@435 1439 // probably do the math inside the SIN encoding.
duke@435 1440
duke@435 1441 // Make the merge point
duke@435 1442 RegionNode *r = new (C, 3) RegionNode(3);
duke@435 1443 Node *phi = new (C, 3) PhiNode(r,Type::DOUBLE);
duke@435 1444
duke@435 1445 // Flatten arg so we need only 1 test
duke@435 1446 Node *abs = _gvn.transform(new (C, 2) AbsDNode(arg));
duke@435 1447 // Node for PI/4 constant
duke@435 1448 Node *pi4 = makecon(TypeD::make(pi_4));
duke@435 1449 // Check PI/4 : abs(arg)
duke@435 1450 Node *cmp = _gvn.transform(new (C, 3) CmpDNode(pi4,abs));
duke@435 1451 // Check: If PI/4 < abs(arg) then go slow
duke@435 1452 Node *bol = _gvn.transform( new (C, 2) BoolNode( cmp, BoolTest::lt ) );
duke@435 1453 // Branch either way
duke@435 1454 IfNode *iff = create_and_xform_if(control(),bol, PROB_STATIC_FREQUENT, COUNT_UNKNOWN);
duke@435 1455 set_control(opt_iff(r,iff));
duke@435 1456
duke@435 1457 // Set fast path result
duke@435 1458 phi->init_req(2,trig);
duke@435 1459
duke@435 1460 // Slow path - non-blocking leaf call
duke@435 1461 Node* call = NULL;
duke@435 1462 switch (id) {
duke@435 1463 case vmIntrinsics::_dsin:
duke@435 1464 call = make_runtime_call(RC_LEAF, OptoRuntime::Math_D_D_Type(),
duke@435 1465 CAST_FROM_FN_PTR(address, SharedRuntime::dsin),
duke@435 1466 "Sin", NULL, arg, top());
duke@435 1467 break;
duke@435 1468 case vmIntrinsics::_dcos:
duke@435 1469 call = make_runtime_call(RC_LEAF, OptoRuntime::Math_D_D_Type(),
duke@435 1470 CAST_FROM_FN_PTR(address, SharedRuntime::dcos),
duke@435 1471 "Cos", NULL, arg, top());
duke@435 1472 break;
duke@435 1473 case vmIntrinsics::_dtan:
duke@435 1474 call = make_runtime_call(RC_LEAF, OptoRuntime::Math_D_D_Type(),
duke@435 1475 CAST_FROM_FN_PTR(address, SharedRuntime::dtan),
duke@435 1476 "Tan", NULL, arg, top());
duke@435 1477 break;
duke@435 1478 }
duke@435 1479 assert(control()->in(0) == call, "");
duke@435 1480 Node* slow_result = _gvn.transform(new (C, 1) ProjNode(call,TypeFunc::Parms));
duke@435 1481 r->init_req(1,control());
duke@435 1482 phi->init_req(1,slow_result);
duke@435 1483
duke@435 1484 // Post-merge
duke@435 1485 set_control(_gvn.transform(r));
duke@435 1486 record_for_igvn(r);
duke@435 1487 trig = _gvn.transform(phi);
duke@435 1488
duke@435 1489 C->set_has_split_ifs(true); // Has chance for split-if optimization
duke@435 1490 }
duke@435 1491 // Push result back on JVM stack
duke@435 1492 push_pair(trig);
duke@435 1493 return true;
duke@435 1494 }
duke@435 1495
duke@435 1496 //------------------------------inline_sqrt-------------------------------------
duke@435 1497 // Inline square root instruction, if possible.
duke@435 1498 bool LibraryCallKit::inline_sqrt(vmIntrinsics::ID id) {
duke@435 1499 assert(id == vmIntrinsics::_dsqrt, "Not square root");
duke@435 1500 _sp += arg_size(); // restore stack pointer
duke@435 1501 push_pair(_gvn.transform(new (C, 2) SqrtDNode(0, pop_math_arg())));
duke@435 1502 return true;
duke@435 1503 }
duke@435 1504
duke@435 1505 //------------------------------inline_abs-------------------------------------
duke@435 1506 // Inline absolute value instruction, if possible.
duke@435 1507 bool LibraryCallKit::inline_abs(vmIntrinsics::ID id) {
duke@435 1508 assert(id == vmIntrinsics::_dabs, "Not absolute value");
duke@435 1509 _sp += arg_size(); // restore stack pointer
duke@435 1510 push_pair(_gvn.transform(new (C, 2) AbsDNode(pop_math_arg())));
duke@435 1511 return true;
duke@435 1512 }
duke@435 1513
duke@435 1514 //------------------------------inline_exp-------------------------------------
duke@435 1515 // Inline exp instructions, if possible. The Intel hardware only misses
duke@435 1516 // really odd corner cases (+/- Infinity). Just uncommon-trap them.
duke@435 1517 bool LibraryCallKit::inline_exp(vmIntrinsics::ID id) {
duke@435 1518 assert(id == vmIntrinsics::_dexp, "Not exp");
duke@435 1519
duke@435 1520 // If this inlining ever returned NaN in the past, we do not intrinsify it
duke@435 1521 // every again. NaN results requires StrictMath.exp handling.
duke@435 1522 if (too_many_traps(Deoptimization::Reason_intrinsic)) return false;
duke@435 1523
duke@435 1524 // Do not intrinsify on older platforms which lack cmove.
duke@435 1525 if (ConditionalMoveLimit == 0) return false;
duke@435 1526
duke@435 1527 _sp += arg_size(); // restore stack pointer
duke@435 1528 Node *x = pop_math_arg();
duke@435 1529 Node *result = _gvn.transform(new (C, 2) ExpDNode(0,x));
duke@435 1530
duke@435 1531 //-------------------
duke@435 1532 //result=(result.isNaN())? StrictMath::exp():result;
duke@435 1533 // Check: If isNaN() by checking result!=result? then go to Strict Math
duke@435 1534 Node* cmpisnan = _gvn.transform(new (C, 3) CmpDNode(result,result));
duke@435 1535 // Build the boolean node
duke@435 1536 Node* bolisnum = _gvn.transform( new (C, 2) BoolNode(cmpisnan, BoolTest::eq) );
duke@435 1537
duke@435 1538 { BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT);
duke@435 1539 // End the current control-flow path
duke@435 1540 push_pair(x);
duke@435 1541 // Math.exp intrinsic returned a NaN, which requires StrictMath.exp
duke@435 1542 // to handle. Recompile without intrinsifying Math.exp
duke@435 1543 uncommon_trap(Deoptimization::Reason_intrinsic,
duke@435 1544 Deoptimization::Action_make_not_entrant);
duke@435 1545 }
duke@435 1546
duke@435 1547 C->set_has_split_ifs(true); // Has chance for split-if optimization
duke@435 1548
duke@435 1549 push_pair(result);
duke@435 1550
duke@435 1551 return true;
duke@435 1552 }
duke@435 1553
duke@435 1554 //------------------------------inline_pow-------------------------------------
duke@435 1555 // Inline power instructions, if possible.
duke@435 1556 bool LibraryCallKit::inline_pow(vmIntrinsics::ID id) {
duke@435 1557 assert(id == vmIntrinsics::_dpow, "Not pow");
duke@435 1558
duke@435 1559 // If this inlining ever returned NaN in the past, we do not intrinsify it
duke@435 1560 // every again. NaN results requires StrictMath.pow handling.
duke@435 1561 if (too_many_traps(Deoptimization::Reason_intrinsic)) return false;
duke@435 1562
duke@435 1563 // Do not intrinsify on older platforms which lack cmove.
duke@435 1564 if (ConditionalMoveLimit == 0) return false;
duke@435 1565
duke@435 1566 // Pseudocode for pow
duke@435 1567 // if (x <= 0.0) {
duke@435 1568 // if ((double)((int)y)==y) { // if y is int
duke@435 1569 // result = ((1&(int)y)==0)?-DPow(abs(x), y):DPow(abs(x), y)
duke@435 1570 // } else {
duke@435 1571 // result = NaN;
duke@435 1572 // }
duke@435 1573 // } else {
duke@435 1574 // result = DPow(x,y);
duke@435 1575 // }
duke@435 1576 // if (result != result)? {
twisti@1040 1577 // uncommon_trap();
duke@435 1578 // }
duke@435 1579 // return result;
duke@435 1580
duke@435 1581 _sp += arg_size(); // restore stack pointer
duke@435 1582 Node* y = pop_math_arg();
duke@435 1583 Node* x = pop_math_arg();
duke@435 1584
duke@435 1585 Node *fast_result = _gvn.transform( new (C, 3) PowDNode(0, x, y) );
duke@435 1586
duke@435 1587 // Short form: if not top-level (i.e., Math.pow but inlining Math.pow
duke@435 1588 // inside of something) then skip the fancy tests and just check for
duke@435 1589 // NaN result.
duke@435 1590 Node *result = NULL;
duke@435 1591 if( jvms()->depth() >= 1 ) {
duke@435 1592 result = fast_result;
duke@435 1593 } else {
duke@435 1594
duke@435 1595 // Set the merge point for If node with condition of (x <= 0.0)
duke@435 1596 // There are four possible paths to region node and phi node
duke@435 1597 RegionNode *r = new (C, 4) RegionNode(4);
duke@435 1598 Node *phi = new (C, 4) PhiNode(r, Type::DOUBLE);
duke@435 1599
duke@435 1600 // Build the first if node: if (x <= 0.0)
duke@435 1601 // Node for 0 constant
duke@435 1602 Node *zeronode = makecon(TypeD::ZERO);
duke@435 1603 // Check x:0
duke@435 1604 Node *cmp = _gvn.transform(new (C, 3) CmpDNode(x, zeronode));
duke@435 1605 // Check: If (x<=0) then go complex path
duke@435 1606 Node *bol1 = _gvn.transform( new (C, 2) BoolNode( cmp, BoolTest::le ) );
duke@435 1607 // Branch either way
duke@435 1608 IfNode *if1 = create_and_xform_if(control(),bol1, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN);
duke@435 1609 Node *opt_test = _gvn.transform(if1);
duke@435 1610 //assert( opt_test->is_If(), "Expect an IfNode");
duke@435 1611 IfNode *opt_if1 = (IfNode*)opt_test;
duke@435 1612 // Fast path taken; set region slot 3
duke@435 1613 Node *fast_taken = _gvn.transform( new (C, 1) IfFalseNode(opt_if1) );
duke@435 1614 r->init_req(3,fast_taken); // Capture fast-control
duke@435 1615
duke@435 1616 // Fast path not-taken, i.e. slow path
duke@435 1617 Node *complex_path = _gvn.transform( new (C, 1) IfTrueNode(opt_if1) );
duke@435 1618
duke@435 1619 // Set fast path result
duke@435 1620 Node *fast_result = _gvn.transform( new (C, 3) PowDNode(0, y, x) );
duke@435 1621 phi->init_req(3, fast_result);
duke@435 1622
duke@435 1623 // Complex path
duke@435 1624 // Build the second if node (if y is int)
duke@435 1625 // Node for (int)y
duke@435 1626 Node *inty = _gvn.transform( new (C, 2) ConvD2INode(y));
duke@435 1627 // Node for (double)((int) y)
duke@435 1628 Node *doubleinty= _gvn.transform( new (C, 2) ConvI2DNode(inty));
duke@435 1629 // Check (double)((int) y) : y
duke@435 1630 Node *cmpinty= _gvn.transform(new (C, 3) CmpDNode(doubleinty, y));
duke@435 1631 // Check if (y isn't int) then go to slow path
duke@435 1632
duke@435 1633 Node *bol2 = _gvn.transform( new (C, 2) BoolNode( cmpinty, BoolTest::ne ) );
twisti@1040 1634 // Branch either way
duke@435 1635 IfNode *if2 = create_and_xform_if(complex_path,bol2, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN);
duke@435 1636 Node *slow_path = opt_iff(r,if2); // Set region path 2
duke@435 1637
duke@435 1638 // Calculate DPow(abs(x), y)*(1 & (int)y)
duke@435 1639 // Node for constant 1
duke@435 1640 Node *conone = intcon(1);
duke@435 1641 // 1& (int)y
duke@435 1642 Node *signnode= _gvn.transform( new (C, 3) AndINode(conone, inty) );
duke@435 1643 // zero node
duke@435 1644 Node *conzero = intcon(0);
duke@435 1645 // Check (1&(int)y)==0?
duke@435 1646 Node *cmpeq1 = _gvn.transform(new (C, 3) CmpINode(signnode, conzero));
duke@435 1647 // Check if (1&(int)y)!=0?, if so the result is negative
duke@435 1648 Node *bol3 = _gvn.transform( new (C, 2) BoolNode( cmpeq1, BoolTest::ne ) );
duke@435 1649 // abs(x)
duke@435 1650 Node *absx=_gvn.transform( new (C, 2) AbsDNode(x));
duke@435 1651 // abs(x)^y
duke@435 1652 Node *absxpowy = _gvn.transform( new (C, 3) PowDNode(0, y, absx) );
duke@435 1653 // -abs(x)^y
duke@435 1654 Node *negabsxpowy = _gvn.transform(new (C, 2) NegDNode (absxpowy));
duke@435 1655 // (1&(int)y)==1?-DPow(abs(x), y):DPow(abs(x), y)
duke@435 1656 Node *signresult = _gvn.transform( CMoveNode::make(C, NULL, bol3, absxpowy, negabsxpowy, Type::DOUBLE));
duke@435 1657 // Set complex path fast result
duke@435 1658 phi->init_req(2, signresult);
duke@435 1659
duke@435 1660 static const jlong nan_bits = CONST64(0x7ff8000000000000);
duke@435 1661 Node *slow_result = makecon(TypeD::make(*(double*)&nan_bits)); // return NaN
duke@435 1662 r->init_req(1,slow_path);
duke@435 1663 phi->init_req(1,slow_result);
duke@435 1664
duke@435 1665 // Post merge
duke@435 1666 set_control(_gvn.transform(r));
duke@435 1667 record_for_igvn(r);
duke@435 1668 result=_gvn.transform(phi);
duke@435 1669 }
duke@435 1670
duke@435 1671 //-------------------
duke@435 1672 //result=(result.isNaN())? uncommon_trap():result;
duke@435 1673 // Check: If isNaN() by checking result!=result? then go to Strict Math
duke@435 1674 Node* cmpisnan = _gvn.transform(new (C, 3) CmpDNode(result,result));
duke@435 1675 // Build the boolean node
duke@435 1676 Node* bolisnum = _gvn.transform( new (C, 2) BoolNode(cmpisnan, BoolTest::eq) );
duke@435 1677
duke@435 1678 { BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT);
duke@435 1679 // End the current control-flow path
duke@435 1680 push_pair(x);
duke@435 1681 push_pair(y);
duke@435 1682 // Math.pow intrinsic returned a NaN, which requires StrictMath.pow
duke@435 1683 // to handle. Recompile without intrinsifying Math.pow.
duke@435 1684 uncommon_trap(Deoptimization::Reason_intrinsic,
duke@435 1685 Deoptimization::Action_make_not_entrant);
duke@435 1686 }
duke@435 1687
duke@435 1688 C->set_has_split_ifs(true); // Has chance for split-if optimization
duke@435 1689
duke@435 1690 push_pair(result);
duke@435 1691
duke@435 1692 return true;
duke@435 1693 }
duke@435 1694
duke@435 1695 //------------------------------inline_trans-------------------------------------
duke@435 1696 // Inline transcendental instructions, if possible. The Intel hardware gets
duke@435 1697 // these right, no funny corner cases missed.
duke@435 1698 bool LibraryCallKit::inline_trans(vmIntrinsics::ID id) {
duke@435 1699 _sp += arg_size(); // restore stack pointer
duke@435 1700 Node* arg = pop_math_arg();
duke@435 1701 Node* trans = NULL;
duke@435 1702
duke@435 1703 switch (id) {
duke@435 1704 case vmIntrinsics::_dlog:
duke@435 1705 trans = _gvn.transform((Node*)new (C, 2) LogDNode(arg));
duke@435 1706 break;
duke@435 1707 case vmIntrinsics::_dlog10:
duke@435 1708 trans = _gvn.transform((Node*)new (C, 2) Log10DNode(arg));
duke@435 1709 break;
duke@435 1710 default:
duke@435 1711 assert(false, "bad intrinsic was passed in");
duke@435 1712 return false;
duke@435 1713 }
duke@435 1714
duke@435 1715 // Push result back on JVM stack
duke@435 1716 push_pair(trans);
duke@435 1717 return true;
duke@435 1718 }
duke@435 1719
duke@435 1720 //------------------------------runtime_math-----------------------------
duke@435 1721 bool LibraryCallKit::runtime_math(const TypeFunc* call_type, address funcAddr, const char* funcName) {
duke@435 1722 Node* a = NULL;
duke@435 1723 Node* b = NULL;
duke@435 1724
duke@435 1725 assert(call_type == OptoRuntime::Math_DD_D_Type() || call_type == OptoRuntime::Math_D_D_Type(),
duke@435 1726 "must be (DD)D or (D)D type");
duke@435 1727
duke@435 1728 // Inputs
duke@435 1729 _sp += arg_size(); // restore stack pointer
duke@435 1730 if (call_type == OptoRuntime::Math_DD_D_Type()) {
duke@435 1731 b = pop_math_arg();
duke@435 1732 }
duke@435 1733 a = pop_math_arg();
duke@435 1734
duke@435 1735 const TypePtr* no_memory_effects = NULL;
duke@435 1736 Node* trig = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName,
duke@435 1737 no_memory_effects,
duke@435 1738 a, top(), b, b ? top() : NULL);
duke@435 1739 Node* value = _gvn.transform(new (C, 1) ProjNode(trig, TypeFunc::Parms+0));
duke@435 1740 #ifdef ASSERT
duke@435 1741 Node* value_top = _gvn.transform(new (C, 1) ProjNode(trig, TypeFunc::Parms+1));
duke@435 1742 assert(value_top == top(), "second value must be top");
duke@435 1743 #endif
duke@435 1744
duke@435 1745 push_pair(value);
duke@435 1746 return true;
duke@435 1747 }
duke@435 1748
duke@435 1749 //------------------------------inline_math_native-----------------------------
duke@435 1750 bool LibraryCallKit::inline_math_native(vmIntrinsics::ID id) {
duke@435 1751 switch (id) {
duke@435 1752 // These intrinsics are not properly supported on all hardware
duke@435 1753 case vmIntrinsics::_dcos: return Matcher::has_match_rule(Op_CosD) ? inline_trig(id) :
duke@435 1754 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dcos), "COS");
duke@435 1755 case vmIntrinsics::_dsin: return Matcher::has_match_rule(Op_SinD) ? inline_trig(id) :
duke@435 1756 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dsin), "SIN");
duke@435 1757 case vmIntrinsics::_dtan: return Matcher::has_match_rule(Op_TanD) ? inline_trig(id) :
duke@435 1758 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dtan), "TAN");
duke@435 1759
duke@435 1760 case vmIntrinsics::_dlog: return Matcher::has_match_rule(Op_LogD) ? inline_trans(id) :
duke@435 1761 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dlog), "LOG");
duke@435 1762 case vmIntrinsics::_dlog10: return Matcher::has_match_rule(Op_Log10D) ? inline_trans(id) :
duke@435 1763 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dlog10), "LOG10");
duke@435 1764
duke@435 1765 // These intrinsics are supported on all hardware
duke@435 1766 case vmIntrinsics::_dsqrt: return Matcher::has_match_rule(Op_SqrtD) ? inline_sqrt(id) : false;
duke@435 1767 case vmIntrinsics::_dabs: return Matcher::has_match_rule(Op_AbsD) ? inline_abs(id) : false;
duke@435 1768
duke@435 1769 // These intrinsics don't work on X86. The ad implementation doesn't
duke@435 1770 // handle NaN's properly. Instead of returning infinity, the ad
duke@435 1771 // implementation returns a NaN on overflow. See bug: 6304089
duke@435 1772 // Once the ad implementations are fixed, change the code below
duke@435 1773 // to match the intrinsics above
duke@435 1774
duke@435 1775 case vmIntrinsics::_dexp: return
duke@435 1776 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP");
duke@435 1777 case vmIntrinsics::_dpow: return
duke@435 1778 runtime_math(OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW");
duke@435 1779
duke@435 1780 // These intrinsics are not yet correctly implemented
duke@435 1781 case vmIntrinsics::_datan2:
duke@435 1782 return false;
duke@435 1783
duke@435 1784 default:
duke@435 1785 ShouldNotReachHere();
duke@435 1786 return false;
duke@435 1787 }
duke@435 1788 }
duke@435 1789
duke@435 1790 static bool is_simple_name(Node* n) {
duke@435 1791 return (n->req() == 1 // constant
duke@435 1792 || (n->is_Type() && n->as_Type()->type()->singleton())
duke@435 1793 || n->is_Proj() // parameter or return value
duke@435 1794 || n->is_Phi() // local of some sort
duke@435 1795 );
duke@435 1796 }
duke@435 1797
duke@435 1798 //----------------------------inline_min_max-----------------------------------
duke@435 1799 bool LibraryCallKit::inline_min_max(vmIntrinsics::ID id) {
duke@435 1800 push(generate_min_max(id, argument(0), argument(1)));
duke@435 1801
duke@435 1802 return true;
duke@435 1803 }
duke@435 1804
duke@435 1805 Node*
duke@435 1806 LibraryCallKit::generate_min_max(vmIntrinsics::ID id, Node* x0, Node* y0) {
duke@435 1807 // These are the candidate return value:
duke@435 1808 Node* xvalue = x0;
duke@435 1809 Node* yvalue = y0;
duke@435 1810
duke@435 1811 if (xvalue == yvalue) {
duke@435 1812 return xvalue;
duke@435 1813 }
duke@435 1814
duke@435 1815 bool want_max = (id == vmIntrinsics::_max);
duke@435 1816
duke@435 1817 const TypeInt* txvalue = _gvn.type(xvalue)->isa_int();
duke@435 1818 const TypeInt* tyvalue = _gvn.type(yvalue)->isa_int();
duke@435 1819 if (txvalue == NULL || tyvalue == NULL) return top();
duke@435 1820 // This is not really necessary, but it is consistent with a
duke@435 1821 // hypothetical MaxINode::Value method:
duke@435 1822 int widen = MAX2(txvalue->_widen, tyvalue->_widen);
duke@435 1823
duke@435 1824 // %%% This folding logic should (ideally) be in a different place.
duke@435 1825 // Some should be inside IfNode, and there to be a more reliable
duke@435 1826 // transformation of ?: style patterns into cmoves. We also want
duke@435 1827 // more powerful optimizations around cmove and min/max.
duke@435 1828
duke@435 1829 // Try to find a dominating comparison of these guys.
duke@435 1830 // It can simplify the index computation for Arrays.copyOf
duke@435 1831 // and similar uses of System.arraycopy.
duke@435 1832 // First, compute the normalized version of CmpI(x, y).
duke@435 1833 int cmp_op = Op_CmpI;
duke@435 1834 Node* xkey = xvalue;
duke@435 1835 Node* ykey = yvalue;
duke@435 1836 Node* ideal_cmpxy = _gvn.transform( new(C, 3) CmpINode(xkey, ykey) );
duke@435 1837 if (ideal_cmpxy->is_Cmp()) {
duke@435 1838 // E.g., if we have CmpI(length - offset, count),
duke@435 1839 // it might idealize to CmpI(length, count + offset)
duke@435 1840 cmp_op = ideal_cmpxy->Opcode();
duke@435 1841 xkey = ideal_cmpxy->in(1);
duke@435 1842 ykey = ideal_cmpxy->in(2);
duke@435 1843 }
duke@435 1844
duke@435 1845 // Start by locating any relevant comparisons.
duke@435 1846 Node* start_from = (xkey->outcnt() < ykey->outcnt()) ? xkey : ykey;
duke@435 1847 Node* cmpxy = NULL;
duke@435 1848 Node* cmpyx = NULL;
duke@435 1849 for (DUIterator_Fast kmax, k = start_from->fast_outs(kmax); k < kmax; k++) {
duke@435 1850 Node* cmp = start_from->fast_out(k);
duke@435 1851 if (cmp->outcnt() > 0 && // must have prior uses
duke@435 1852 cmp->in(0) == NULL && // must be context-independent
duke@435 1853 cmp->Opcode() == cmp_op) { // right kind of compare
duke@435 1854 if (cmp->in(1) == xkey && cmp->in(2) == ykey) cmpxy = cmp;
duke@435 1855 if (cmp->in(1) == ykey && cmp->in(2) == xkey) cmpyx = cmp;
duke@435 1856 }
duke@435 1857 }
duke@435 1858
duke@435 1859 const int NCMPS = 2;
duke@435 1860 Node* cmps[NCMPS] = { cmpxy, cmpyx };
duke@435 1861 int cmpn;
duke@435 1862 for (cmpn = 0; cmpn < NCMPS; cmpn++) {
duke@435 1863 if (cmps[cmpn] != NULL) break; // find a result
duke@435 1864 }
duke@435 1865 if (cmpn < NCMPS) {
duke@435 1866 // Look for a dominating test that tells us the min and max.
duke@435 1867 int depth = 0; // Limit search depth for speed
duke@435 1868 Node* dom = control();
duke@435 1869 for (; dom != NULL; dom = IfNode::up_one_dom(dom, true)) {
duke@435 1870 if (++depth >= 100) break;
duke@435 1871 Node* ifproj = dom;
duke@435 1872 if (!ifproj->is_Proj()) continue;
duke@435 1873 Node* iff = ifproj->in(0);
duke@435 1874 if (!iff->is_If()) continue;
duke@435 1875 Node* bol = iff->in(1);
duke@435 1876 if (!bol->is_Bool()) continue;
duke@435 1877 Node* cmp = bol->in(1);
duke@435 1878 if (cmp == NULL) continue;
duke@435 1879 for (cmpn = 0; cmpn < NCMPS; cmpn++)
duke@435 1880 if (cmps[cmpn] == cmp) break;
duke@435 1881 if (cmpn == NCMPS) continue;
duke@435 1882 BoolTest::mask btest = bol->as_Bool()->_test._test;
duke@435 1883 if (ifproj->is_IfFalse()) btest = BoolTest(btest).negate();
duke@435 1884 if (cmp->in(1) == ykey) btest = BoolTest(btest).commute();
duke@435 1885 // At this point, we know that 'x btest y' is true.
duke@435 1886 switch (btest) {
duke@435 1887 case BoolTest::eq:
duke@435 1888 // They are proven equal, so we can collapse the min/max.
duke@435 1889 // Either value is the answer. Choose the simpler.
duke@435 1890 if (is_simple_name(yvalue) && !is_simple_name(xvalue))
duke@435 1891 return yvalue;
duke@435 1892 return xvalue;
duke@435 1893 case BoolTest::lt: // x < y
duke@435 1894 case BoolTest::le: // x <= y
duke@435 1895 return (want_max ? yvalue : xvalue);
duke@435 1896 case BoolTest::gt: // x > y
duke@435 1897 case BoolTest::ge: // x >= y
duke@435 1898 return (want_max ? xvalue : yvalue);
duke@435 1899 }
duke@435 1900 }
duke@435 1901 }
duke@435 1902
duke@435 1903 // We failed to find a dominating test.
duke@435 1904 // Let's pick a test that might GVN with prior tests.
duke@435 1905 Node* best_bol = NULL;
duke@435 1906 BoolTest::mask best_btest = BoolTest::illegal;
duke@435 1907 for (cmpn = 0; cmpn < NCMPS; cmpn++) {
duke@435 1908 Node* cmp = cmps[cmpn];
duke@435 1909 if (cmp == NULL) continue;
duke@435 1910 for (DUIterator_Fast jmax, j = cmp->fast_outs(jmax); j < jmax; j++) {
duke@435 1911 Node* bol = cmp->fast_out(j);
duke@435 1912 if (!bol->is_Bool()) continue;
duke@435 1913 BoolTest::mask btest = bol->as_Bool()->_test._test;
duke@435 1914 if (btest == BoolTest::eq || btest == BoolTest::ne) continue;
duke@435 1915 if (cmp->in(1) == ykey) btest = BoolTest(btest).commute();
duke@435 1916 if (bol->outcnt() > (best_bol == NULL ? 0 : best_bol->outcnt())) {
duke@435 1917 best_bol = bol->as_Bool();
duke@435 1918 best_btest = btest;
duke@435 1919 }
duke@435 1920 }
duke@435 1921 }
duke@435 1922
duke@435 1923 Node* answer_if_true = NULL;
duke@435 1924 Node* answer_if_false = NULL;
duke@435 1925 switch (best_btest) {
duke@435 1926 default:
duke@435 1927 if (cmpxy == NULL)
duke@435 1928 cmpxy = ideal_cmpxy;
duke@435 1929 best_bol = _gvn.transform( new(C, 2) BoolNode(cmpxy, BoolTest::lt) );
duke@435 1930 // and fall through:
duke@435 1931 case BoolTest::lt: // x < y
duke@435 1932 case BoolTest::le: // x <= y
duke@435 1933 answer_if_true = (want_max ? yvalue : xvalue);
duke@435 1934 answer_if_false = (want_max ? xvalue : yvalue);
duke@435 1935 break;
duke@435 1936 case BoolTest::gt: // x > y
duke@435 1937 case BoolTest::ge: // x >= y
duke@435 1938 answer_if_true = (want_max ? xvalue : yvalue);
duke@435 1939 answer_if_false = (want_max ? yvalue : xvalue);
duke@435 1940 break;
duke@435 1941 }
duke@435 1942
duke@435 1943 jint hi, lo;
duke@435 1944 if (want_max) {
duke@435 1945 // We can sharpen the minimum.
duke@435 1946 hi = MAX2(txvalue->_hi, tyvalue->_hi);
duke@435 1947 lo = MAX2(txvalue->_lo, tyvalue->_lo);
duke@435 1948 } else {
duke@435 1949 // We can sharpen the maximum.
duke@435 1950 hi = MIN2(txvalue->_hi, tyvalue->_hi);
duke@435 1951 lo = MIN2(txvalue->_lo, tyvalue->_lo);
duke@435 1952 }
duke@435 1953
duke@435 1954 // Use a flow-free graph structure, to avoid creating excess control edges
duke@435 1955 // which could hinder other optimizations.
duke@435 1956 // Since Math.min/max is often used with arraycopy, we want
duke@435 1957 // tightly_coupled_allocation to be able to see beyond min/max expressions.
duke@435 1958 Node* cmov = CMoveNode::make(C, NULL, best_bol,
duke@435 1959 answer_if_false, answer_if_true,
duke@435 1960 TypeInt::make(lo, hi, widen));
duke@435 1961
duke@435 1962 return _gvn.transform(cmov);
duke@435 1963
duke@435 1964 /*
duke@435 1965 // This is not as desirable as it may seem, since Min and Max
duke@435 1966 // nodes do not have a full set of optimizations.
duke@435 1967 // And they would interfere, anyway, with 'if' optimizations
duke@435 1968 // and with CMoveI canonical forms.
duke@435 1969 switch (id) {
duke@435 1970 case vmIntrinsics::_min:
duke@435 1971 result_val = _gvn.transform(new (C, 3) MinINode(x,y)); break;
duke@435 1972 case vmIntrinsics::_max:
duke@435 1973 result_val = _gvn.transform(new (C, 3) MaxINode(x,y)); break;
duke@435 1974 default:
duke@435 1975 ShouldNotReachHere();
duke@435 1976 }
duke@435 1977 */
duke@435 1978 }
duke@435 1979
duke@435 1980 inline int
duke@435 1981 LibraryCallKit::classify_unsafe_addr(Node* &base, Node* &offset) {
duke@435 1982 const TypePtr* base_type = TypePtr::NULL_PTR;
duke@435 1983 if (base != NULL) base_type = _gvn.type(base)->isa_ptr();
duke@435 1984 if (base_type == NULL) {
duke@435 1985 // Unknown type.
duke@435 1986 return Type::AnyPtr;
duke@435 1987 } else if (base_type == TypePtr::NULL_PTR) {
duke@435 1988 // Since this is a NULL+long form, we have to switch to a rawptr.
duke@435 1989 base = _gvn.transform( new (C, 2) CastX2PNode(offset) );
duke@435 1990 offset = MakeConX(0);
duke@435 1991 return Type::RawPtr;
duke@435 1992 } else if (base_type->base() == Type::RawPtr) {
duke@435 1993 return Type::RawPtr;
duke@435 1994 } else if (base_type->isa_oopptr()) {
duke@435 1995 // Base is never null => always a heap address.
duke@435 1996 if (base_type->ptr() == TypePtr::NotNull) {
duke@435 1997 return Type::OopPtr;
duke@435 1998 }
duke@435 1999 // Offset is small => always a heap address.
duke@435 2000 const TypeX* offset_type = _gvn.type(offset)->isa_intptr_t();
duke@435 2001 if (offset_type != NULL &&
duke@435 2002 base_type->offset() == 0 && // (should always be?)
duke@435 2003 offset_type->_lo >= 0 &&
duke@435 2004 !MacroAssembler::needs_explicit_null_check(offset_type->_hi)) {
duke@435 2005 return Type::OopPtr;
duke@435 2006 }
duke@435 2007 // Otherwise, it might either be oop+off or NULL+addr.
duke@435 2008 return Type::AnyPtr;
duke@435 2009 } else {
duke@435 2010 // No information:
duke@435 2011 return Type::AnyPtr;
duke@435 2012 }
duke@435 2013 }
duke@435 2014
duke@435 2015 inline Node* LibraryCallKit::make_unsafe_address(Node* base, Node* offset) {
duke@435 2016 int kind = classify_unsafe_addr(base, offset);
duke@435 2017 if (kind == Type::RawPtr) {
duke@435 2018 return basic_plus_adr(top(), base, offset);
duke@435 2019 } else {
duke@435 2020 return basic_plus_adr(base, offset);
duke@435 2021 }
duke@435 2022 }
duke@435 2023
twisti@1210 2024 //-------------------inline_numberOfLeadingZeros_int/long-----------------------
twisti@1210 2025 // inline int Integer.numberOfLeadingZeros(int)
twisti@1210 2026 // inline int Long.numberOfLeadingZeros(long)
twisti@1210 2027 bool LibraryCallKit::inline_numberOfLeadingZeros(vmIntrinsics::ID id) {
twisti@1210 2028 assert(id == vmIntrinsics::_numberOfLeadingZeros_i || id == vmIntrinsics::_numberOfLeadingZeros_l, "not numberOfLeadingZeros");
twisti@1210 2029 if (id == vmIntrinsics::_numberOfLeadingZeros_i && !Matcher::match_rule_supported(Op_CountLeadingZerosI)) return false;
twisti@1210 2030 if (id == vmIntrinsics::_numberOfLeadingZeros_l && !Matcher::match_rule_supported(Op_CountLeadingZerosL)) return false;
twisti@1210 2031 _sp += arg_size(); // restore stack pointer
twisti@1210 2032 switch (id) {
twisti@1210 2033 case vmIntrinsics::_numberOfLeadingZeros_i:
twisti@1210 2034 push(_gvn.transform(new (C, 2) CountLeadingZerosINode(pop())));
twisti@1210 2035 break;
twisti@1210 2036 case vmIntrinsics::_numberOfLeadingZeros_l:
twisti@1210 2037 push(_gvn.transform(new (C, 2) CountLeadingZerosLNode(pop_pair())));
twisti@1210 2038 break;
twisti@1210 2039 default:
twisti@1210 2040 ShouldNotReachHere();
twisti@1210 2041 }
twisti@1210 2042 return true;
twisti@1210 2043 }
twisti@1210 2044
twisti@1210 2045 //-------------------inline_numberOfTrailingZeros_int/long----------------------
twisti@1210 2046 // inline int Integer.numberOfTrailingZeros(int)
twisti@1210 2047 // inline int Long.numberOfTrailingZeros(long)
twisti@1210 2048 bool LibraryCallKit::inline_numberOfTrailingZeros(vmIntrinsics::ID id) {
twisti@1210 2049 assert(id == vmIntrinsics::_numberOfTrailingZeros_i || id == vmIntrinsics::_numberOfTrailingZeros_l, "not numberOfTrailingZeros");
twisti@1210 2050 if (id == vmIntrinsics::_numberOfTrailingZeros_i && !Matcher::match_rule_supported(Op_CountTrailingZerosI)) return false;
twisti@1210 2051 if (id == vmIntrinsics::_numberOfTrailingZeros_l && !Matcher::match_rule_supported(Op_CountTrailingZerosL)) return false;
twisti@1210 2052 _sp += arg_size(); // restore stack pointer
twisti@1210 2053 switch (id) {
twisti@1210 2054 case vmIntrinsics::_numberOfTrailingZeros_i:
twisti@1210 2055 push(_gvn.transform(new (C, 2) CountTrailingZerosINode(pop())));
twisti@1210 2056 break;
twisti@1210 2057 case vmIntrinsics::_numberOfTrailingZeros_l:
twisti@1210 2058 push(_gvn.transform(new (C, 2) CountTrailingZerosLNode(pop_pair())));
twisti@1210 2059 break;
twisti@1210 2060 default:
twisti@1210 2061 ShouldNotReachHere();
twisti@1210 2062 }
twisti@1210 2063 return true;
twisti@1210 2064 }
twisti@1210 2065
twisti@1078 2066 //----------------------------inline_bitCount_int/long-----------------------
twisti@1078 2067 // inline int Integer.bitCount(int)
twisti@1078 2068 // inline int Long.bitCount(long)
twisti@1078 2069 bool LibraryCallKit::inline_bitCount(vmIntrinsics::ID id) {
twisti@1078 2070 assert(id == vmIntrinsics::_bitCount_i || id == vmIntrinsics::_bitCount_l, "not bitCount");
twisti@1078 2071 if (id == vmIntrinsics::_bitCount_i && !Matcher::has_match_rule(Op_PopCountI)) return false;
twisti@1078 2072 if (id == vmIntrinsics::_bitCount_l && !Matcher::has_match_rule(Op_PopCountL)) return false;
twisti@1078 2073 _sp += arg_size(); // restore stack pointer
twisti@1078 2074 switch (id) {
twisti@1078 2075 case vmIntrinsics::_bitCount_i:
twisti@1078 2076 push(_gvn.transform(new (C, 2) PopCountINode(pop())));
twisti@1078 2077 break;
twisti@1078 2078 case vmIntrinsics::_bitCount_l:
twisti@1078 2079 push(_gvn.transform(new (C, 2) PopCountLNode(pop_pair())));
twisti@1078 2080 break;
twisti@1078 2081 default:
twisti@1078 2082 ShouldNotReachHere();
twisti@1078 2083 }
twisti@1078 2084 return true;
twisti@1078 2085 }
twisti@1078 2086
never@1831 2087 //----------------------------inline_reverseBytes_int/long/char/short-------------------
twisti@1040 2088 // inline Integer.reverseBytes(int)
twisti@1040 2089 // inline Long.reverseBytes(long)
never@1831 2090 // inline Character.reverseBytes(char)
never@1831 2091 // inline Short.reverseBytes(short)
duke@435 2092 bool LibraryCallKit::inline_reverseBytes(vmIntrinsics::ID id) {
never@1831 2093 assert(id == vmIntrinsics::_reverseBytes_i || id == vmIntrinsics::_reverseBytes_l ||
never@1831 2094 id == vmIntrinsics::_reverseBytes_c || id == vmIntrinsics::_reverseBytes_s,
never@1831 2095 "not reverse Bytes");
never@1831 2096 if (id == vmIntrinsics::_reverseBytes_i && !Matcher::has_match_rule(Op_ReverseBytesI)) return false;
never@1831 2097 if (id == vmIntrinsics::_reverseBytes_l && !Matcher::has_match_rule(Op_ReverseBytesL)) return false;
never@1831 2098 if (id == vmIntrinsics::_reverseBytes_c && !Matcher::has_match_rule(Op_ReverseBytesUS)) return false;
never@1831 2099 if (id == vmIntrinsics::_reverseBytes_s && !Matcher::has_match_rule(Op_ReverseBytesS)) return false;
duke@435 2100 _sp += arg_size(); // restore stack pointer
duke@435 2101 switch (id) {
duke@435 2102 case vmIntrinsics::_reverseBytes_i:
duke@435 2103 push(_gvn.transform(new (C, 2) ReverseBytesINode(0, pop())));
duke@435 2104 break;
duke@435 2105 case vmIntrinsics::_reverseBytes_l:
duke@435 2106 push_pair(_gvn.transform(new (C, 2) ReverseBytesLNode(0, pop_pair())));
duke@435 2107 break;
never@1831 2108 case vmIntrinsics::_reverseBytes_c:
never@1831 2109 push(_gvn.transform(new (C, 2) ReverseBytesUSNode(0, pop())));
never@1831 2110 break;
never@1831 2111 case vmIntrinsics::_reverseBytes_s:
never@1831 2112 push(_gvn.transform(new (C, 2) ReverseBytesSNode(0, pop())));
never@1831 2113 break;
duke@435 2114 default:
duke@435 2115 ;
duke@435 2116 }
duke@435 2117 return true;
duke@435 2118 }
duke@435 2119
duke@435 2120 //----------------------------inline_unsafe_access----------------------------
duke@435 2121
duke@435 2122 const static BasicType T_ADDRESS_HOLDER = T_LONG;
duke@435 2123
johnc@2781 2124 // Helper that guards and inserts a G1 pre-barrier.
johnc@2781 2125 void LibraryCallKit::insert_g1_pre_barrier(Node* base_oop, Node* offset, Node* pre_val) {
johnc@2781 2126 assert(UseG1GC, "should not call this otherwise");
johnc@2781 2127
johnc@2781 2128 // We could be accessing the referent field of a reference object. If so, when G1
johnc@2781 2129 // is enabled, we need to log the value in the referent field in an SATB buffer.
johnc@2781 2130 // This routine performs some compile time filters and generates suitable
johnc@2781 2131 // runtime filters that guard the pre-barrier code.
johnc@2781 2132
johnc@2781 2133 // Some compile time checks.
johnc@2781 2134
johnc@2781 2135 // If offset is a constant, is it java_lang_ref_Reference::_reference_offset?
johnc@2781 2136 const TypeX* otype = offset->find_intptr_t_type();
johnc@2781 2137 if (otype != NULL && otype->is_con() &&
johnc@2781 2138 otype->get_con() != java_lang_ref_Reference::referent_offset) {
johnc@2781 2139 // Constant offset but not the reference_offset so just return
johnc@2781 2140 return;
johnc@2781 2141 }
johnc@2781 2142
johnc@2781 2143 // We only need to generate the runtime guards for instances.
johnc@2781 2144 const TypeOopPtr* btype = base_oop->bottom_type()->isa_oopptr();
johnc@2781 2145 if (btype != NULL) {
johnc@2781 2146 if (btype->isa_aryptr()) {
johnc@2781 2147 // Array type so nothing to do
johnc@2781 2148 return;
johnc@2781 2149 }
johnc@2781 2150
johnc@2781 2151 const TypeInstPtr* itype = btype->isa_instptr();
johnc@2781 2152 if (itype != NULL) {
johnc@2781 2153 // Can the klass of base_oop be statically determined
johnc@2781 2154 // to be _not_ a sub-class of Reference?
johnc@2781 2155 ciKlass* klass = itype->klass();
johnc@2781 2156 if (klass->is_subtype_of(env()->Reference_klass()) &&
johnc@2781 2157 !env()->Reference_klass()->is_subtype_of(klass)) {
johnc@2781 2158 return;
johnc@2781 2159 }
johnc@2781 2160 }
johnc@2781 2161 }
johnc@2781 2162
johnc@2781 2163 // The compile time filters did not reject base_oop/offset so
johnc@2781 2164 // we need to generate the following runtime filters
johnc@2781 2165 //
johnc@2781 2166 // if (offset == java_lang_ref_Reference::_reference_offset) {
johnc@2781 2167 // if (base != null) {
johnc@2781 2168 // if (klass(base)->reference_type() != REF_NONE)) {
johnc@2781 2169 // pre_barrier(_, pre_val, ...);
johnc@2781 2170 // }
johnc@2781 2171 // }
johnc@2781 2172 // }
johnc@2781 2173
johnc@2781 2174 float likely = PROB_LIKELY(0.999);
johnc@2781 2175 float unlikely = PROB_UNLIKELY(0.999);
johnc@2781 2176
johnc@2781 2177 IdealKit ideal(gvn(), control(), merged_memory());
johnc@2781 2178 #define __ ideal.
johnc@2781 2179
johnc@2781 2180 const int reference_type_offset = instanceKlass::reference_type_offset_in_bytes() +
johnc@2781 2181 sizeof(oopDesc);
johnc@2781 2182
johnc@2781 2183 Node* referent_off = __ ConI(java_lang_ref_Reference::referent_offset);
johnc@2781 2184
johnc@2781 2185 __ if_then(offset, BoolTest::eq, referent_off, unlikely); {
johnc@2781 2186 __ if_then(base_oop, BoolTest::ne, null(), likely); {
johnc@2781 2187
johnc@2781 2188 // Update graphKit memory and control from IdealKit.
johnc@2781 2189 set_all_memory(__ merged_memory());
johnc@2781 2190 set_control(__ ctrl());
johnc@2781 2191
johnc@2781 2192 Node* ref_klass_con = makecon(TypeKlassPtr::make(env()->Reference_klass()));
johnc@2781 2193 Node* is_instof = gen_instanceof(base_oop, ref_klass_con);
johnc@2781 2194
johnc@2781 2195 // Update IdealKit memory and control from graphKit.
johnc@2781 2196 __ set_all_memory(merged_memory());
johnc@2781 2197 __ set_ctrl(control());
johnc@2781 2198
johnc@2781 2199 Node* one = __ ConI(1);
johnc@2781 2200
johnc@2781 2201 __ if_then(is_instof, BoolTest::eq, one, unlikely); {
johnc@2781 2202
johnc@2781 2203 // Update graphKit from IdeakKit.
johnc@2781 2204 set_all_memory(__ merged_memory());
johnc@2781 2205 set_control(__ ctrl());
johnc@2781 2206
johnc@2781 2207 // Use the pre-barrier to record the value in the referent field
johnc@2781 2208 pre_barrier(false /* do_load */,
johnc@2781 2209 __ ctrl(),
johnc@2781 2210 NULL /* obj */, NULL /* adr */, -1 /* alias_idx */, NULL /* val */, NULL /* val_type */,
johnc@2781 2211 pre_val /* pre_val */,
johnc@2781 2212 T_OBJECT);
johnc@2781 2213
johnc@2781 2214 // Update IdealKit from graphKit.
johnc@2781 2215 __ set_all_memory(merged_memory());
johnc@2781 2216 __ set_ctrl(control());
johnc@2781 2217
johnc@2781 2218 } __ end_if(); // _ref_type != ref_none
johnc@2781 2219 } __ end_if(); // base != NULL
johnc@2781 2220 } __ end_if(); // offset == referent_offset
johnc@2781 2221
johnc@2781 2222 // Final sync IdealKit and GraphKit.
johnc@2781 2223 sync_kit(ideal);
johnc@2781 2224 #undef __
johnc@2781 2225 }
johnc@2781 2226
johnc@2781 2227
duke@435 2228 // Interpret Unsafe.fieldOffset cookies correctly:
duke@435 2229 extern jlong Unsafe_field_offset_to_byte_offset(jlong field_offset);
duke@435 2230
duke@435 2231 bool LibraryCallKit::inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile) {
duke@435 2232 if (callee()->is_static()) return false; // caller must have the capability!
duke@435 2233
duke@435 2234 #ifndef PRODUCT
duke@435 2235 {
duke@435 2236 ResourceMark rm;
duke@435 2237 // Check the signatures.
duke@435 2238 ciSignature* sig = signature();
duke@435 2239 #ifdef ASSERT
duke@435 2240 if (!is_store) {
duke@435 2241 // Object getObject(Object base, int/long offset), etc.
duke@435 2242 BasicType rtype = sig->return_type()->basic_type();
duke@435 2243 if (rtype == T_ADDRESS_HOLDER && callee()->name() == ciSymbol::getAddress_name())
duke@435 2244 rtype = T_ADDRESS; // it is really a C void*
duke@435 2245 assert(rtype == type, "getter must return the expected value");
duke@435 2246 if (!is_native_ptr) {
duke@435 2247 assert(sig->count() == 2, "oop getter has 2 arguments");
duke@435 2248 assert(sig->type_at(0)->basic_type() == T_OBJECT, "getter base is object");
duke@435 2249 assert(sig->type_at(1)->basic_type() == T_LONG, "getter offset is correct");
duke@435 2250 } else {
duke@435 2251 assert(sig->count() == 1, "native getter has 1 argument");
duke@435 2252 assert(sig->type_at(0)->basic_type() == T_LONG, "getter base is long");
duke@435 2253 }
duke@435 2254 } else {
duke@435 2255 // void putObject(Object base, int/long offset, Object x), etc.
duke@435 2256 assert(sig->return_type()->basic_type() == T_VOID, "putter must not return a value");
duke@435 2257 if (!is_native_ptr) {
duke@435 2258 assert(sig->count() == 3, "oop putter has 3 arguments");
duke@435 2259 assert(sig->type_at(0)->basic_type() == T_OBJECT, "putter base is object");
duke@435 2260 assert(sig->type_at(1)->basic_type() == T_LONG, "putter offset is correct");
duke@435 2261 } else {
duke@435 2262 assert(sig->count() == 2, "native putter has 2 arguments");
duke@435 2263 assert(sig->type_at(0)->basic_type() == T_LONG, "putter base is long");
duke@435 2264 }
duke@435 2265 BasicType vtype = sig->type_at(sig->count()-1)->basic_type();
duke@435 2266 if (vtype == T_ADDRESS_HOLDER && callee()->name() == ciSymbol::putAddress_name())
duke@435 2267 vtype = T_ADDRESS; // it is really a C void*
duke@435 2268 assert(vtype == type, "putter must accept the expected value");
duke@435 2269 }
duke@435 2270 #endif // ASSERT
duke@435 2271 }
duke@435 2272 #endif //PRODUCT
duke@435 2273
duke@435 2274 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe".
duke@435 2275
duke@435 2276 int type_words = type2size[ (type == T_ADDRESS) ? T_LONG : type ];
duke@435 2277
duke@435 2278 // Argument words: "this" plus (oop/offset) or (lo/hi) args plus maybe 1 or 2 value words
duke@435 2279 int nargs = 1 + (is_native_ptr ? 2 : 3) + (is_store ? type_words : 0);
duke@435 2280
duke@435 2281 debug_only(int saved_sp = _sp);
duke@435 2282 _sp += nargs;
duke@435 2283
duke@435 2284 Node* val;
duke@435 2285 debug_only(val = (Node*)(uintptr_t)-1);
duke@435 2286
duke@435 2287
duke@435 2288 if (is_store) {
duke@435 2289 // Get the value being stored. (Pop it first; it was pushed last.)
duke@435 2290 switch (type) {
duke@435 2291 case T_DOUBLE:
duke@435 2292 case T_LONG:
duke@435 2293 case T_ADDRESS:
duke@435 2294 val = pop_pair();
duke@435 2295 break;
duke@435 2296 default:
duke@435 2297 val = pop();
duke@435 2298 }
duke@435 2299 }
duke@435 2300
duke@435 2301 // Build address expression. See the code in inline_unsafe_prefetch.
duke@435 2302 Node *adr;
duke@435 2303 Node *heap_base_oop = top();
johnc@2781 2304 Node* offset = top();
johnc@2781 2305
duke@435 2306 if (!is_native_ptr) {
duke@435 2307 // The offset is a value produced by Unsafe.staticFieldOffset or Unsafe.objectFieldOffset
johnc@2781 2308 offset = pop_pair();
duke@435 2309 // The base is either a Java object or a value produced by Unsafe.staticFieldBase
duke@435 2310 Node* base = pop();
duke@435 2311 // We currently rely on the cookies produced by Unsafe.xxxFieldOffset
duke@435 2312 // to be plain byte offsets, which are also the same as those accepted
duke@435 2313 // by oopDesc::field_base.
duke@435 2314 assert(Unsafe_field_offset_to_byte_offset(11) == 11,
duke@435 2315 "fieldOffset must be byte-scaled");
duke@435 2316 // 32-bit machines ignore the high half!
duke@435 2317 offset = ConvL2X(offset);
duke@435 2318 adr = make_unsafe_address(base, offset);
duke@435 2319 heap_base_oop = base;
duke@435 2320 } else {
duke@435 2321 Node* ptr = pop_pair();
duke@435 2322 // Adjust Java long to machine word:
duke@435 2323 ptr = ConvL2X(ptr);
duke@435 2324 adr = make_unsafe_address(NULL, ptr);
duke@435 2325 }
duke@435 2326
duke@435 2327 // Pop receiver last: it was pushed first.
duke@435 2328 Node *receiver = pop();
duke@435 2329
duke@435 2330 assert(saved_sp == _sp, "must have correct argument count");
duke@435 2331
duke@435 2332 const TypePtr *adr_type = _gvn.type(adr)->isa_ptr();
duke@435 2333
duke@435 2334 // First guess at the value type.
duke@435 2335 const Type *value_type = Type::get_const_basic_type(type);
duke@435 2336
duke@435 2337 // Try to categorize the address. If it comes up as TypeJavaPtr::BOTTOM,
duke@435 2338 // there was not enough information to nail it down.
duke@435 2339 Compile::AliasType* alias_type = C->alias_type(adr_type);
duke@435 2340 assert(alias_type->index() != Compile::AliasIdxBot, "no bare pointers here");
duke@435 2341
duke@435 2342 // We will need memory barriers unless we can determine a unique
duke@435 2343 // alias category for this reference. (Note: If for some reason
duke@435 2344 // the barriers get omitted and the unsafe reference begins to "pollute"
duke@435 2345 // the alias analysis of the rest of the graph, either Compile::can_alias
duke@435 2346 // or Compile::must_alias will throw a diagnostic assert.)
duke@435 2347 bool need_mem_bar = (alias_type->adr_type() == TypeOopPtr::BOTTOM);
duke@435 2348
johnc@2781 2349 // If we are reading the value of the referent field of a Reference
johnc@2781 2350 // object (either by using Unsafe directly or through reflection)
johnc@2781 2351 // then, if G1 is enabled, we need to record the referent in an
johnc@2781 2352 // SATB log buffer using the pre-barrier mechanism.
johnc@2781 2353 bool need_read_barrier = UseG1GC && !is_native_ptr && !is_store &&
johnc@2781 2354 offset != top() && heap_base_oop != top();
johnc@2781 2355
duke@435 2356 if (!is_store && type == T_OBJECT) {
duke@435 2357 // Attempt to infer a sharper value type from the offset and base type.
duke@435 2358 ciKlass* sharpened_klass = NULL;
duke@435 2359
duke@435 2360 // See if it is an instance field, with an object type.
duke@435 2361 if (alias_type->field() != NULL) {
duke@435 2362 assert(!is_native_ptr, "native pointer op cannot use a java address");
duke@435 2363 if (alias_type->field()->type()->is_klass()) {
duke@435 2364 sharpened_klass = alias_type->field()->type()->as_klass();
duke@435 2365 }
duke@435 2366 }
duke@435 2367
duke@435 2368 // See if it is a narrow oop array.
duke@435 2369 if (adr_type->isa_aryptr()) {
twisti@1330 2370 if (adr_type->offset() >= objArrayOopDesc::base_offset_in_bytes()) {
duke@435 2371 const TypeOopPtr *elem_type = adr_type->is_aryptr()->elem()->isa_oopptr();
duke@435 2372 if (elem_type != NULL) {
duke@435 2373 sharpened_klass = elem_type->klass();
duke@435 2374 }
duke@435 2375 }
duke@435 2376 }
duke@435 2377
duke@435 2378 if (sharpened_klass != NULL) {
duke@435 2379 const TypeOopPtr* tjp = TypeOopPtr::make_from_klass(sharpened_klass);
duke@435 2380
duke@435 2381 // Sharpen the value type.
duke@435 2382 value_type = tjp;
duke@435 2383
duke@435 2384 #ifndef PRODUCT
duke@435 2385 if (PrintIntrinsics || PrintInlining || PrintOptoInlining) {
duke@435 2386 tty->print(" from base type: "); adr_type->dump();
duke@435 2387 tty->print(" sharpened value: "); value_type->dump();
duke@435 2388 }
duke@435 2389 #endif
duke@435 2390 }
duke@435 2391 }
duke@435 2392
duke@435 2393 // Null check on self without removing any arguments. The argument
duke@435 2394 // null check technically happens in the wrong place, which can lead to
duke@435 2395 // invalid stack traces when the primitive is inlined into a method
duke@435 2396 // which handles NullPointerExceptions.
duke@435 2397 _sp += nargs;
duke@435 2398 do_null_check(receiver, T_OBJECT);
duke@435 2399 _sp -= nargs;
duke@435 2400 if (stopped()) {
duke@435 2401 return true;
duke@435 2402 }
duke@435 2403 // Heap pointers get a null-check from the interpreter,
duke@435 2404 // as a courtesy. However, this is not guaranteed by Unsafe,
duke@435 2405 // and it is not possible to fully distinguish unintended nulls
duke@435 2406 // from intended ones in this API.
duke@435 2407
duke@435 2408 if (is_volatile) {
duke@435 2409 // We need to emit leading and trailing CPU membars (see below) in
duke@435 2410 // addition to memory membars when is_volatile. This is a little
duke@435 2411 // too strong, but avoids the need to insert per-alias-type
duke@435 2412 // volatile membars (for stores; compare Parse::do_put_xxx), which
twisti@1040 2413 // we cannot do effectively here because we probably only have a
duke@435 2414 // rough approximation of type.
duke@435 2415 need_mem_bar = true;
duke@435 2416 // For Stores, place a memory ordering barrier now.
duke@435 2417 if (is_store)
duke@435 2418 insert_mem_bar(Op_MemBarRelease);
duke@435 2419 }
duke@435 2420
duke@435 2421 // Memory barrier to prevent normal and 'unsafe' accesses from
duke@435 2422 // bypassing each other. Happens after null checks, so the
duke@435 2423 // exception paths do not take memory state from the memory barrier,
duke@435 2424 // so there's no problems making a strong assert about mixing users
duke@435 2425 // of safe & unsafe memory. Otherwise fails in a CTW of rt.jar
duke@435 2426 // around 5701, class sun/reflect/UnsafeBooleanFieldAccessorImpl.
duke@435 2427 if (need_mem_bar) insert_mem_bar(Op_MemBarCPUOrder);
duke@435 2428
duke@435 2429 if (!is_store) {
duke@435 2430 Node* p = make_load(control(), adr, value_type, type, adr_type, is_volatile);
duke@435 2431 // load value and push onto stack
duke@435 2432 switch (type) {
duke@435 2433 case T_BOOLEAN:
duke@435 2434 case T_CHAR:
duke@435 2435 case T_BYTE:
duke@435 2436 case T_SHORT:
duke@435 2437 case T_INT:
duke@435 2438 case T_FLOAT:
johnc@2781 2439 push(p);
johnc@2781 2440 break;
duke@435 2441 case T_OBJECT:
johnc@2781 2442 if (need_read_barrier) {
johnc@2781 2443 insert_g1_pre_barrier(heap_base_oop, offset, p);
johnc@2781 2444 }
johnc@2781 2445 push(p);
duke@435 2446 break;
duke@435 2447 case T_ADDRESS:
duke@435 2448 // Cast to an int type.
duke@435 2449 p = _gvn.transform( new (C, 2) CastP2XNode(NULL,p) );
duke@435 2450 p = ConvX2L(p);
duke@435 2451 push_pair(p);
duke@435 2452 break;
duke@435 2453 case T_DOUBLE:
duke@435 2454 case T_LONG:
duke@435 2455 push_pair( p );
duke@435 2456 break;
duke@435 2457 default: ShouldNotReachHere();
duke@435 2458 }
duke@435 2459 } else {
duke@435 2460 // place effect of store into memory
duke@435 2461 switch (type) {
duke@435 2462 case T_DOUBLE:
duke@435 2463 val = dstore_rounding(val);
duke@435 2464 break;
duke@435 2465 case T_ADDRESS:
duke@435 2466 // Repackage the long as a pointer.
duke@435 2467 val = ConvL2X(val);
duke@435 2468 val = _gvn.transform( new (C, 2) CastX2PNode(val) );
duke@435 2469 break;
duke@435 2470 }
duke@435 2471
duke@435 2472 if (type != T_OBJECT ) {
duke@435 2473 (void) store_to_memory(control(), adr, val, type, adr_type, is_volatile);
duke@435 2474 } else {
duke@435 2475 // Possibly an oop being stored to Java heap or native memory
duke@435 2476 if (!TypePtr::NULL_PTR->higher_equal(_gvn.type(heap_base_oop))) {
duke@435 2477 // oop to Java heap.
never@1260 2478 (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type);
duke@435 2479 } else {
duke@435 2480 // We can't tell at compile time if we are storing in the Java heap or outside
duke@435 2481 // of it. So we need to emit code to conditionally do the proper type of
duke@435 2482 // store.
duke@435 2483
kvn@1286 2484 IdealKit ideal(gvn(), control(), merged_memory());
kvn@1286 2485 #define __ ideal.
duke@435 2486 // QQQ who knows what probability is here??
kvn@1286 2487 __ if_then(heap_base_oop, BoolTest::ne, null(), PROB_UNLIKELY(0.999)); {
kvn@1286 2488 // Sync IdealKit and graphKit.
kvn@1286 2489 set_all_memory( __ merged_memory());
kvn@1286 2490 set_control(__ ctrl());
kvn@1286 2491 Node* st = store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type);
kvn@1286 2492 // Update IdealKit memory.
kvn@1286 2493 __ set_all_memory(merged_memory());
kvn@1286 2494 __ set_ctrl(control());
kvn@1286 2495 } __ else_(); {
kvn@1286 2496 __ store(__ ctrl(), adr, val, type, alias_type->index(), is_volatile);
kvn@1286 2497 } __ end_if();
kvn@1286 2498 // Final sync IdealKit and GraphKit.
kvn@1286 2499 sync_kit(ideal);
kvn@1286 2500 #undef __
duke@435 2501 }
duke@435 2502 }
duke@435 2503 }
duke@435 2504
duke@435 2505 if (is_volatile) {
duke@435 2506 if (!is_store)
duke@435 2507 insert_mem_bar(Op_MemBarAcquire);
duke@435 2508 else
duke@435 2509 insert_mem_bar(Op_MemBarVolatile);
duke@435 2510 }
duke@435 2511
duke@435 2512 if (need_mem_bar) insert_mem_bar(Op_MemBarCPUOrder);
duke@435 2513
duke@435 2514 return true;
duke@435 2515 }
duke@435 2516
duke@435 2517 //----------------------------inline_unsafe_prefetch----------------------------
duke@435 2518
duke@435 2519 bool LibraryCallKit::inline_unsafe_prefetch(bool is_native_ptr, bool is_store, bool is_static) {
duke@435 2520 #ifndef PRODUCT
duke@435 2521 {
duke@435 2522 ResourceMark rm;
duke@435 2523 // Check the signatures.
duke@435 2524 ciSignature* sig = signature();
duke@435 2525 #ifdef ASSERT
duke@435 2526 // Object getObject(Object base, int/long offset), etc.
duke@435 2527 BasicType rtype = sig->return_type()->basic_type();
duke@435 2528 if (!is_native_ptr) {
duke@435 2529 assert(sig->count() == 2, "oop prefetch has 2 arguments");
duke@435 2530 assert(sig->type_at(0)->basic_type() == T_OBJECT, "prefetch base is object");
duke@435 2531 assert(sig->type_at(1)->basic_type() == T_LONG, "prefetcha offset is correct");
duke@435 2532 } else {
duke@435 2533 assert(sig->count() == 1, "native prefetch has 1 argument");
duke@435 2534 assert(sig->type_at(0)->basic_type() == T_LONG, "prefetch base is long");
duke@435 2535 }
duke@435 2536 #endif // ASSERT
duke@435 2537 }
duke@435 2538 #endif // !PRODUCT
duke@435 2539
duke@435 2540 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe".
duke@435 2541
duke@435 2542 // Argument words: "this" if not static, plus (oop/offset) or (lo/hi) args
duke@435 2543 int nargs = (is_static ? 0 : 1) + (is_native_ptr ? 2 : 3);
duke@435 2544
duke@435 2545 debug_only(int saved_sp = _sp);
duke@435 2546 _sp += nargs;
duke@435 2547
duke@435 2548 // Build address expression. See the code in inline_unsafe_access.
duke@435 2549 Node *adr;
duke@435 2550 if (!is_native_ptr) {
duke@435 2551 // The offset is a value produced by Unsafe.staticFieldOffset or Unsafe.objectFieldOffset
duke@435 2552 Node* offset = pop_pair();
duke@435 2553 // The base is either a Java object or a value produced by Unsafe.staticFieldBase
duke@435 2554 Node* base = pop();
duke@435 2555 // We currently rely on the cookies produced by Unsafe.xxxFieldOffset
duke@435 2556 // to be plain byte offsets, which are also the same as those accepted
duke@435 2557 // by oopDesc::field_base.
duke@435 2558 assert(Unsafe_field_offset_to_byte_offset(11) == 11,
duke@435 2559 "fieldOffset must be byte-scaled");
duke@435 2560 // 32-bit machines ignore the high half!
duke@435 2561 offset = ConvL2X(offset);
duke@435 2562 adr = make_unsafe_address(base, offset);
duke@435 2563 } else {
duke@435 2564 Node* ptr = pop_pair();
duke@435 2565 // Adjust Java long to machine word:
duke@435 2566 ptr = ConvL2X(ptr);
duke@435 2567 adr = make_unsafe_address(NULL, ptr);
duke@435 2568 }
duke@435 2569
duke@435 2570 if (is_static) {
duke@435 2571 assert(saved_sp == _sp, "must have correct argument count");
duke@435 2572 } else {
duke@435 2573 // Pop receiver last: it was pushed first.
duke@435 2574 Node *receiver = pop();
duke@435 2575 assert(saved_sp == _sp, "must have correct argument count");
duke@435 2576
duke@435 2577 // Null check on self without removing any arguments. The argument
duke@435 2578 // null check technically happens in the wrong place, which can lead to
duke@435 2579 // invalid stack traces when the primitive is inlined into a method
duke@435 2580 // which handles NullPointerExceptions.
duke@435 2581 _sp += nargs;
duke@435 2582 do_null_check(receiver, T_OBJECT);
duke@435 2583 _sp -= nargs;
duke@435 2584 if (stopped()) {
duke@435 2585 return true;
duke@435 2586 }
duke@435 2587 }
duke@435 2588
duke@435 2589 // Generate the read or write prefetch
duke@435 2590 Node *prefetch;
duke@435 2591 if (is_store) {
duke@435 2592 prefetch = new (C, 3) PrefetchWriteNode(i_o(), adr);
duke@435 2593 } else {
duke@435 2594 prefetch = new (C, 3) PrefetchReadNode(i_o(), adr);
duke@435 2595 }
duke@435 2596 prefetch->init_req(0, control());
duke@435 2597 set_i_o(_gvn.transform(prefetch));
duke@435 2598
duke@435 2599 return true;
duke@435 2600 }
duke@435 2601
duke@435 2602 //----------------------------inline_unsafe_CAS----------------------------
duke@435 2603
duke@435 2604 bool LibraryCallKit::inline_unsafe_CAS(BasicType type) {
duke@435 2605 // This basic scheme here is the same as inline_unsafe_access, but
duke@435 2606 // differs in enough details that combining them would make the code
duke@435 2607 // overly confusing. (This is a true fact! I originally combined
duke@435 2608 // them, but even I was confused by it!) As much code/comments as
duke@435 2609 // possible are retained from inline_unsafe_access though to make
twisti@1040 2610 // the correspondences clearer. - dl
duke@435 2611
duke@435 2612 if (callee()->is_static()) return false; // caller must have the capability!
duke@435 2613
duke@435 2614 #ifndef PRODUCT
duke@435 2615 {
duke@435 2616 ResourceMark rm;
duke@435 2617 // Check the signatures.
duke@435 2618 ciSignature* sig = signature();
duke@435 2619 #ifdef ASSERT
duke@435 2620 BasicType rtype = sig->return_type()->basic_type();
duke@435 2621 assert(rtype == T_BOOLEAN, "CAS must return boolean");
duke@435 2622 assert(sig->count() == 4, "CAS has 4 arguments");
duke@435 2623 assert(sig->type_at(0)->basic_type() == T_OBJECT, "CAS base is object");
duke@435 2624 assert(sig->type_at(1)->basic_type() == T_LONG, "CAS offset is long");
duke@435 2625 #endif // ASSERT
duke@435 2626 }
duke@435 2627 #endif //PRODUCT
duke@435 2628
duke@435 2629 // number of stack slots per value argument (1 or 2)
duke@435 2630 int type_words = type2size[type];
duke@435 2631
duke@435 2632 // Cannot inline wide CAS on machines that don't support it natively
kvn@464 2633 if (type2aelembytes(type) > BytesPerInt && !VM_Version::supports_cx8())
duke@435 2634 return false;
duke@435 2635
duke@435 2636 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe".
duke@435 2637
duke@435 2638 // Argument words: "this" plus oop plus offset plus oldvalue plus newvalue;
duke@435 2639 int nargs = 1 + 1 + 2 + type_words + type_words;
duke@435 2640
duke@435 2641 // pop arguments: newval, oldval, offset, base, and receiver
duke@435 2642 debug_only(int saved_sp = _sp);
duke@435 2643 _sp += nargs;
duke@435 2644 Node* newval = (type_words == 1) ? pop() : pop_pair();
duke@435 2645 Node* oldval = (type_words == 1) ? pop() : pop_pair();
duke@435 2646 Node *offset = pop_pair();
duke@435 2647 Node *base = pop();
duke@435 2648 Node *receiver = pop();
duke@435 2649 assert(saved_sp == _sp, "must have correct argument count");
duke@435 2650
duke@435 2651 // Null check receiver.
duke@435 2652 _sp += nargs;
duke@435 2653 do_null_check(receiver, T_OBJECT);
duke@435 2654 _sp -= nargs;
duke@435 2655 if (stopped()) {
duke@435 2656 return true;
duke@435 2657 }
duke@435 2658
duke@435 2659 // Build field offset expression.
duke@435 2660 // We currently rely on the cookies produced by Unsafe.xxxFieldOffset
duke@435 2661 // to be plain byte offsets, which are also the same as those accepted
duke@435 2662 // by oopDesc::field_base.
duke@435 2663 assert(Unsafe_field_offset_to_byte_offset(11) == 11, "fieldOffset must be byte-scaled");
duke@435 2664 // 32-bit machines ignore the high half of long offsets
duke@435 2665 offset = ConvL2X(offset);
duke@435 2666 Node* adr = make_unsafe_address(base, offset);
duke@435 2667 const TypePtr *adr_type = _gvn.type(adr)->isa_ptr();
duke@435 2668
duke@435 2669 // (Unlike inline_unsafe_access, there seems no point in trying
duke@435 2670 // to refine types. Just use the coarse types here.
duke@435 2671 const Type *value_type = Type::get_const_basic_type(type);
duke@435 2672 Compile::AliasType* alias_type = C->alias_type(adr_type);
duke@435 2673 assert(alias_type->index() != Compile::AliasIdxBot, "no bare pointers here");
duke@435 2674 int alias_idx = C->get_alias_index(adr_type);
duke@435 2675
duke@435 2676 // Memory-model-wise, a CAS acts like a little synchronized block,
twisti@1040 2677 // so needs barriers on each side. These don't translate into
duke@435 2678 // actual barriers on most machines, but we still need rest of
duke@435 2679 // compiler to respect ordering.
duke@435 2680
duke@435 2681 insert_mem_bar(Op_MemBarRelease);
duke@435 2682 insert_mem_bar(Op_MemBarCPUOrder);
duke@435 2683
duke@435 2684 // 4984716: MemBars must be inserted before this
duke@435 2685 // memory node in order to avoid a false
duke@435 2686 // dependency which will confuse the scheduler.
duke@435 2687 Node *mem = memory(alias_idx);
duke@435 2688
duke@435 2689 // For now, we handle only those cases that actually exist: ints,
duke@435 2690 // longs, and Object. Adding others should be straightforward.
duke@435 2691 Node* cas;
duke@435 2692 switch(type) {
duke@435 2693 case T_INT:
duke@435 2694 cas = _gvn.transform(new (C, 5) CompareAndSwapINode(control(), mem, adr, newval, oldval));
duke@435 2695 break;
duke@435 2696 case T_LONG:
duke@435 2697 cas = _gvn.transform(new (C, 5) CompareAndSwapLNode(control(), mem, adr, newval, oldval));
duke@435 2698 break;
duke@435 2699 case T_OBJECT:
coleenp@548 2700 // reference stores need a store barrier.
duke@435 2701 // (They don't if CAS fails, but it isn't worth checking.)
johnc@2781 2702 pre_barrier(true /* do_load*/,
johnc@2781 2703 control(), base, adr, alias_idx, newval, value_type->make_oopptr(),
johnc@2781 2704 NULL /* pre_val*/,
johnc@2781 2705 T_OBJECT);
coleenp@548 2706 #ifdef _LP64
kvn@598 2707 if (adr->bottom_type()->is_ptr_to_narrowoop()) {
kvn@656 2708 Node *newval_enc = _gvn.transform(new (C, 2) EncodePNode(newval, newval->bottom_type()->make_narrowoop()));
kvn@656 2709 Node *oldval_enc = _gvn.transform(new (C, 2) EncodePNode(oldval, oldval->bottom_type()->make_narrowoop()));
coleenp@548 2710 cas = _gvn.transform(new (C, 5) CompareAndSwapNNode(control(), mem, adr,
kvn@656 2711 newval_enc, oldval_enc));
coleenp@548 2712 } else
coleenp@548 2713 #endif
kvn@656 2714 {
kvn@656 2715 cas = _gvn.transform(new (C, 5) CompareAndSwapPNode(control(), mem, adr, newval, oldval));
kvn@656 2716 }
duke@435 2717 post_barrier(control(), cas, base, adr, alias_idx, newval, T_OBJECT, true);
duke@435 2718 break;
duke@435 2719 default:
duke@435 2720 ShouldNotReachHere();
duke@435 2721 break;
duke@435 2722 }
duke@435 2723
duke@435 2724 // SCMemProjNodes represent the memory state of CAS. Their main
duke@435 2725 // role is to prevent CAS nodes from being optimized away when their
duke@435 2726 // results aren't used.
duke@435 2727 Node* proj = _gvn.transform( new (C, 1) SCMemProjNode(cas));
duke@435 2728 set_memory(proj, alias_idx);
duke@435 2729
duke@435 2730 // Add the trailing membar surrounding the access
duke@435 2731 insert_mem_bar(Op_MemBarCPUOrder);
duke@435 2732 insert_mem_bar(Op_MemBarAcquire);
duke@435 2733
duke@435 2734 push(cas);
duke@435 2735 return true;
duke@435 2736 }
duke@435 2737
duke@435 2738 bool LibraryCallKit::inline_unsafe_ordered_store(BasicType type) {
duke@435 2739 // This is another variant of inline_unsafe_access, differing in
duke@435 2740 // that it always issues store-store ("release") barrier and ensures
duke@435 2741 // store-atomicity (which only matters for "long").
duke@435 2742
duke@435 2743 if (callee()->is_static()) return false; // caller must have the capability!
duke@435 2744
duke@435 2745 #ifndef PRODUCT
duke@435 2746 {
duke@435 2747 ResourceMark rm;
duke@435 2748 // Check the signatures.
duke@435 2749 ciSignature* sig = signature();
duke@435 2750 #ifdef ASSERT
duke@435 2751 BasicType rtype = sig->return_type()->basic_type();
duke@435 2752 assert(rtype == T_VOID, "must return void");
duke@435 2753 assert(sig->count() == 3, "has 3 arguments");
duke@435 2754 assert(sig->type_at(0)->basic_type() == T_OBJECT, "base is object");
duke@435 2755 assert(sig->type_at(1)->basic_type() == T_LONG, "offset is long");
duke@435 2756 #endif // ASSERT
duke@435 2757 }
duke@435 2758 #endif //PRODUCT
duke@435 2759
duke@435 2760 // number of stack slots per value argument (1 or 2)
duke@435 2761 int type_words = type2size[type];
duke@435 2762
duke@435 2763 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe".
duke@435 2764
duke@435 2765 // Argument words: "this" plus oop plus offset plus value;
duke@435 2766 int nargs = 1 + 1 + 2 + type_words;
duke@435 2767
duke@435 2768 // pop arguments: val, offset, base, and receiver
duke@435 2769 debug_only(int saved_sp = _sp);
duke@435 2770 _sp += nargs;
duke@435 2771 Node* val = (type_words == 1) ? pop() : pop_pair();
duke@435 2772 Node *offset = pop_pair();
duke@435 2773 Node *base = pop();
duke@435 2774 Node *receiver = pop();
duke@435 2775 assert(saved_sp == _sp, "must have correct argument count");
duke@435 2776
duke@435 2777 // Null check receiver.
duke@435 2778 _sp += nargs;
duke@435 2779 do_null_check(receiver, T_OBJECT);
duke@435 2780 _sp -= nargs;
duke@435 2781 if (stopped()) {
duke@435 2782 return true;
duke@435 2783 }
duke@435 2784
duke@435 2785 // Build field offset expression.
duke@435 2786 assert(Unsafe_field_offset_to_byte_offset(11) == 11, "fieldOffset must be byte-scaled");
duke@435 2787 // 32-bit machines ignore the high half of long offsets
duke@435 2788 offset = ConvL2X(offset);
duke@435 2789 Node* adr = make_unsafe_address(base, offset);
duke@435 2790 const TypePtr *adr_type = _gvn.type(adr)->isa_ptr();
duke@435 2791 const Type *value_type = Type::get_const_basic_type(type);
duke@435 2792 Compile::AliasType* alias_type = C->alias_type(adr_type);
duke@435 2793
duke@435 2794 insert_mem_bar(Op_MemBarRelease);
duke@435 2795 insert_mem_bar(Op_MemBarCPUOrder);
duke@435 2796 // Ensure that the store is atomic for longs:
duke@435 2797 bool require_atomic_access = true;
duke@435 2798 Node* store;
duke@435 2799 if (type == T_OBJECT) // reference stores need a store barrier.
never@1260 2800 store = store_oop_to_unknown(control(), base, adr, adr_type, val, type);
duke@435 2801 else {
duke@435 2802 store = store_to_memory(control(), adr, val, type, adr_type, require_atomic_access);
duke@435 2803 }
duke@435 2804 insert_mem_bar(Op_MemBarCPUOrder);
duke@435 2805 return true;
duke@435 2806 }
duke@435 2807
duke@435 2808 bool LibraryCallKit::inline_unsafe_allocate() {
duke@435 2809 if (callee()->is_static()) return false; // caller must have the capability!
duke@435 2810 int nargs = 1 + 1;
duke@435 2811 assert(signature()->size() == nargs-1, "alloc has 1 argument");
duke@435 2812 null_check_receiver(callee()); // check then ignore argument(0)
duke@435 2813 _sp += nargs; // set original stack for use by uncommon_trap
duke@435 2814 Node* cls = do_null_check(argument(1), T_OBJECT);
duke@435 2815 _sp -= nargs;
duke@435 2816 if (stopped()) return true;
duke@435 2817
duke@435 2818 Node* kls = load_klass_from_mirror(cls, false, nargs, NULL, 0);
duke@435 2819 _sp += nargs; // set original stack for use by uncommon_trap
duke@435 2820 kls = do_null_check(kls, T_OBJECT);
duke@435 2821 _sp -= nargs;
duke@435 2822 if (stopped()) return true; // argument was like int.class
duke@435 2823
duke@435 2824 // Note: The argument might still be an illegal value like
duke@435 2825 // Serializable.class or Object[].class. The runtime will handle it.
duke@435 2826 // But we must make an explicit check for initialization.
duke@435 2827 Node* insp = basic_plus_adr(kls, instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc));
duke@435 2828 Node* inst = make_load(NULL, insp, TypeInt::INT, T_INT);
duke@435 2829 Node* bits = intcon(instanceKlass::fully_initialized);
duke@435 2830 Node* test = _gvn.transform( new (C, 3) SubINode(inst, bits) );
duke@435 2831 // The 'test' is non-zero if we need to take a slow path.
duke@435 2832
duke@435 2833 Node* obj = new_instance(kls, test);
duke@435 2834 push(obj);
duke@435 2835
duke@435 2836 return true;
duke@435 2837 }
duke@435 2838
duke@435 2839 //------------------------inline_native_time_funcs--------------
duke@435 2840 // inline code for System.currentTimeMillis() and System.nanoTime()
duke@435 2841 // these have the same type and signature
duke@435 2842 bool LibraryCallKit::inline_native_time_funcs(bool isNano) {
duke@435 2843 address funcAddr = isNano ? CAST_FROM_FN_PTR(address, os::javaTimeNanos) :
duke@435 2844 CAST_FROM_FN_PTR(address, os::javaTimeMillis);
duke@435 2845 const char * funcName = isNano ? "nanoTime" : "currentTimeMillis";
duke@435 2846 const TypeFunc *tf = OptoRuntime::current_time_millis_Type();
duke@435 2847 const TypePtr* no_memory_effects = NULL;
duke@435 2848 Node* time = make_runtime_call(RC_LEAF, tf, funcAddr, funcName, no_memory_effects);
duke@435 2849 Node* value = _gvn.transform(new (C, 1) ProjNode(time, TypeFunc::Parms+0));
duke@435 2850 #ifdef ASSERT
duke@435 2851 Node* value_top = _gvn.transform(new (C, 1) ProjNode(time, TypeFunc::Parms + 1));
duke@435 2852 assert(value_top == top(), "second value must be top");
duke@435 2853 #endif
duke@435 2854 push_pair(value);
duke@435 2855 return true;
duke@435 2856 }
duke@435 2857
duke@435 2858 //------------------------inline_native_currentThread------------------
duke@435 2859 bool LibraryCallKit::inline_native_currentThread() {
duke@435 2860 Node* junk = NULL;
duke@435 2861 push(generate_current_thread(junk));
duke@435 2862 return true;
duke@435 2863 }
duke@435 2864
duke@435 2865 //------------------------inline_native_isInterrupted------------------
duke@435 2866 bool LibraryCallKit::inline_native_isInterrupted() {
duke@435 2867 const int nargs = 1+1; // receiver + boolean
duke@435 2868 assert(nargs == arg_size(), "sanity");
duke@435 2869 // Add a fast path to t.isInterrupted(clear_int):
duke@435 2870 // (t == Thread.current() && (!TLS._osthread._interrupted || !clear_int))
duke@435 2871 // ? TLS._osthread._interrupted : /*slow path:*/ t.isInterrupted(clear_int)
duke@435 2872 // So, in the common case that the interrupt bit is false,
duke@435 2873 // we avoid making a call into the VM. Even if the interrupt bit
duke@435 2874 // is true, if the clear_int argument is false, we avoid the VM call.
duke@435 2875 // However, if the receiver is not currentThread, we must call the VM,
duke@435 2876 // because there must be some locking done around the operation.
duke@435 2877
duke@435 2878 // We only go to the fast case code if we pass two guards.
duke@435 2879 // Paths which do not pass are accumulated in the slow_region.
duke@435 2880 RegionNode* slow_region = new (C, 1) RegionNode(1);
duke@435 2881 record_for_igvn(slow_region);
duke@435 2882 RegionNode* result_rgn = new (C, 4) RegionNode(1+3); // fast1, fast2, slow
duke@435 2883 PhiNode* result_val = new (C, 4) PhiNode(result_rgn, TypeInt::BOOL);
duke@435 2884 enum { no_int_result_path = 1,
duke@435 2885 no_clear_result_path = 2,
duke@435 2886 slow_result_path = 3
duke@435 2887 };
duke@435 2888
duke@435 2889 // (a) Receiving thread must be the current thread.
duke@435 2890 Node* rec_thr = argument(0);
duke@435 2891 Node* tls_ptr = NULL;
duke@435 2892 Node* cur_thr = generate_current_thread(tls_ptr);
duke@435 2893 Node* cmp_thr = _gvn.transform( new (C, 3) CmpPNode(cur_thr, rec_thr) );
duke@435 2894 Node* bol_thr = _gvn.transform( new (C, 2) BoolNode(cmp_thr, BoolTest::ne) );
duke@435 2895
duke@435 2896 bool known_current_thread = (_gvn.type(bol_thr) == TypeInt::ZERO);
duke@435 2897 if (!known_current_thread)
duke@435 2898 generate_slow_guard(bol_thr, slow_region);
duke@435 2899
duke@435 2900 // (b) Interrupt bit on TLS must be false.
duke@435 2901 Node* p = basic_plus_adr(top()/*!oop*/, tls_ptr, in_bytes(JavaThread::osthread_offset()));
duke@435 2902 Node* osthread = make_load(NULL, p, TypeRawPtr::NOTNULL, T_ADDRESS);
duke@435 2903 p = basic_plus_adr(top()/*!oop*/, osthread, in_bytes(OSThread::interrupted_offset()));
kvn@1222 2904 // Set the control input on the field _interrupted read to prevent it floating up.
kvn@1222 2905 Node* int_bit = make_load(control(), p, TypeInt::BOOL, T_INT);
duke@435 2906 Node* cmp_bit = _gvn.transform( new (C, 3) CmpINode(int_bit, intcon(0)) );
duke@435 2907 Node* bol_bit = _gvn.transform( new (C, 2) BoolNode(cmp_bit, BoolTest::ne) );
duke@435 2908
duke@435 2909 IfNode* iff_bit = create_and_map_if(control(), bol_bit, PROB_UNLIKELY_MAG(3), COUNT_UNKNOWN);
duke@435 2910
duke@435 2911 // First fast path: if (!TLS._interrupted) return false;
duke@435 2912 Node* false_bit = _gvn.transform( new (C, 1) IfFalseNode(iff_bit) );
duke@435 2913 result_rgn->init_req(no_int_result_path, false_bit);
duke@435 2914 result_val->init_req(no_int_result_path, intcon(0));
duke@435 2915
duke@435 2916 // drop through to next case
duke@435 2917 set_control( _gvn.transform(new (C, 1) IfTrueNode(iff_bit)) );
duke@435 2918
duke@435 2919 // (c) Or, if interrupt bit is set and clear_int is false, use 2nd fast path.
duke@435 2920 Node* clr_arg = argument(1);
duke@435 2921 Node* cmp_arg = _gvn.transform( new (C, 3) CmpINode(clr_arg, intcon(0)) );
duke@435 2922 Node* bol_arg = _gvn.transform( new (C, 2) BoolNode(cmp_arg, BoolTest::ne) );
duke@435 2923 IfNode* iff_arg = create_and_map_if(control(), bol_arg, PROB_FAIR, COUNT_UNKNOWN);
duke@435 2924
duke@435 2925 // Second fast path: ... else if (!clear_int) return true;
duke@435 2926 Node* false_arg = _gvn.transform( new (C, 1) IfFalseNode(iff_arg) );
duke@435 2927 result_rgn->init_req(no_clear_result_path, false_arg);
duke@435 2928 result_val->init_req(no_clear_result_path, intcon(1));
duke@435 2929
duke@435 2930 // drop through to next case
duke@435 2931 set_control( _gvn.transform(new (C, 1) IfTrueNode(iff_arg)) );
duke@435 2932
duke@435 2933 // (d) Otherwise, go to the slow path.
duke@435 2934 slow_region->add_req(control());
duke@435 2935 set_control( _gvn.transform(slow_region) );
duke@435 2936
duke@435 2937 if (stopped()) {
duke@435 2938 // There is no slow path.
duke@435 2939 result_rgn->init_req(slow_result_path, top());
duke@435 2940 result_val->init_req(slow_result_path, top());
duke@435 2941 } else {
duke@435 2942 // non-virtual because it is a private non-static
duke@435 2943 CallJavaNode* slow_call = generate_method_call(vmIntrinsics::_isInterrupted);
duke@435 2944
duke@435 2945 Node* slow_val = set_results_for_java_call(slow_call);
duke@435 2946 // this->control() comes from set_results_for_java_call
duke@435 2947
duke@435 2948 // If we know that the result of the slow call will be true, tell the optimizer!
duke@435 2949 if (known_current_thread) slow_val = intcon(1);
duke@435 2950
duke@435 2951 Node* fast_io = slow_call->in(TypeFunc::I_O);
duke@435 2952 Node* fast_mem = slow_call->in(TypeFunc::Memory);
duke@435 2953 // These two phis are pre-filled with copies of of the fast IO and Memory
duke@435 2954 Node* io_phi = PhiNode::make(result_rgn, fast_io, Type::ABIO);
duke@435 2955 Node* mem_phi = PhiNode::make(result_rgn, fast_mem, Type::MEMORY, TypePtr::BOTTOM);
duke@435 2956
duke@435 2957 result_rgn->init_req(slow_result_path, control());
duke@435 2958 io_phi ->init_req(slow_result_path, i_o());
duke@435 2959 mem_phi ->init_req(slow_result_path, reset_memory());
duke@435 2960 result_val->init_req(slow_result_path, slow_val);
duke@435 2961
duke@435 2962 set_all_memory( _gvn.transform(mem_phi) );
duke@435 2963 set_i_o( _gvn.transform(io_phi) );
duke@435 2964 }
duke@435 2965
duke@435 2966 push_result(result_rgn, result_val);
duke@435 2967 C->set_has_split_ifs(true); // Has chance for split-if optimization
duke@435 2968
duke@435 2969 return true;
duke@435 2970 }
duke@435 2971
duke@435 2972 //---------------------------load_mirror_from_klass----------------------------
duke@435 2973 // Given a klass oop, load its java mirror (a java.lang.Class oop).
duke@435 2974 Node* LibraryCallKit::load_mirror_from_klass(Node* klass) {
duke@435 2975 Node* p = basic_plus_adr(klass, Klass::java_mirror_offset_in_bytes() + sizeof(oopDesc));
duke@435 2976 return make_load(NULL, p, TypeInstPtr::MIRROR, T_OBJECT);
duke@435 2977 }
duke@435 2978
duke@435 2979 //-----------------------load_klass_from_mirror_common-------------------------
duke@435 2980 // Given a java mirror (a java.lang.Class oop), load its corresponding klass oop.
duke@435 2981 // Test the klass oop for null (signifying a primitive Class like Integer.TYPE),
duke@435 2982 // and branch to the given path on the region.
duke@435 2983 // If never_see_null, take an uncommon trap on null, so we can optimistically
duke@435 2984 // compile for the non-null case.
duke@435 2985 // If the region is NULL, force never_see_null = true.
duke@435 2986 Node* LibraryCallKit::load_klass_from_mirror_common(Node* mirror,
duke@435 2987 bool never_see_null,
duke@435 2988 int nargs,
duke@435 2989 RegionNode* region,
duke@435 2990 int null_path,
duke@435 2991 int offset) {
duke@435 2992 if (region == NULL) never_see_null = true;
duke@435 2993 Node* p = basic_plus_adr(mirror, offset);
duke@435 2994 const TypeKlassPtr* kls_type = TypeKlassPtr::OBJECT_OR_NULL;
kvn@599 2995 Node* kls = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeRawPtr::BOTTOM, kls_type) );
duke@435 2996 _sp += nargs; // any deopt will start just before call to enclosing method
duke@435 2997 Node* null_ctl = top();
duke@435 2998 kls = null_check_oop(kls, &null_ctl, never_see_null);
duke@435 2999 if (region != NULL) {
duke@435 3000 // Set region->in(null_path) if the mirror is a primitive (e.g, int.class).
duke@435 3001 region->init_req(null_path, null_ctl);
duke@435 3002 } else {
duke@435 3003 assert(null_ctl == top(), "no loose ends");
duke@435 3004 }
duke@435 3005 _sp -= nargs;
duke@435 3006 return kls;
duke@435 3007 }
duke@435 3008
duke@435 3009 //--------------------(inline_native_Class_query helpers)---------------------
duke@435 3010 // Use this for JVM_ACC_INTERFACE, JVM_ACC_IS_CLONEABLE, JVM_ACC_HAS_FINALIZER.
duke@435 3011 // Fall through if (mods & mask) == bits, take the guard otherwise.
duke@435 3012 Node* LibraryCallKit::generate_access_flags_guard(Node* kls, int modifier_mask, int modifier_bits, RegionNode* region) {
duke@435 3013 // Branch around if the given klass has the given modifier bit set.
duke@435 3014 // Like generate_guard, adds a new path onto the region.
duke@435 3015 Node* modp = basic_plus_adr(kls, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc));
duke@435 3016 Node* mods = make_load(NULL, modp, TypeInt::INT, T_INT);
duke@435 3017 Node* mask = intcon(modifier_mask);
duke@435 3018 Node* bits = intcon(modifier_bits);
duke@435 3019 Node* mbit = _gvn.transform( new (C, 3) AndINode(mods, mask) );
duke@435 3020 Node* cmp = _gvn.transform( new (C, 3) CmpINode(mbit, bits) );
duke@435 3021 Node* bol = _gvn.transform( new (C, 2) BoolNode(cmp, BoolTest::ne) );
duke@435 3022 return generate_fair_guard(bol, region);
duke@435 3023 }
duke@435 3024 Node* LibraryCallKit::generate_interface_guard(Node* kls, RegionNode* region) {
duke@435 3025 return generate_access_flags_guard(kls, JVM_ACC_INTERFACE, 0, region);
duke@435 3026 }
duke@435 3027
duke@435 3028 //-------------------------inline_native_Class_query-------------------
duke@435 3029 bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) {
duke@435 3030 int nargs = 1+0; // just the Class mirror, in most cases
duke@435 3031 const Type* return_type = TypeInt::BOOL;
duke@435 3032 Node* prim_return_value = top(); // what happens if it's a primitive class?
duke@435 3033 bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check);
duke@435 3034 bool expect_prim = false; // most of these guys expect to work on refs
duke@435 3035
duke@435 3036 enum { _normal_path = 1, _prim_path = 2, PATH_LIMIT };
duke@435 3037
duke@435 3038 switch (id) {
duke@435 3039 case vmIntrinsics::_isInstance:
duke@435 3040 nargs = 1+1; // the Class mirror, plus the object getting queried about
duke@435 3041 // nothing is an instance of a primitive type
duke@435 3042 prim_return_value = intcon(0);
duke@435 3043 break;
duke@435 3044 case vmIntrinsics::_getModifiers:
duke@435 3045 prim_return_value = intcon(JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
duke@435 3046 assert(is_power_of_2((int)JVM_ACC_WRITTEN_FLAGS+1), "change next line");
duke@435 3047 return_type = TypeInt::make(0, JVM_ACC_WRITTEN_FLAGS, Type::WidenMin);
duke@435 3048 break;
duke@435 3049 case vmIntrinsics::_isInterface:
duke@435 3050 prim_return_value = intcon(0);
duke@435 3051 break;
duke@435 3052 case vmIntrinsics::_isArray:
duke@435 3053 prim_return_value = intcon(0);
duke@435 3054 expect_prim = true; // cf. ObjectStreamClass.getClassSignature
duke@435 3055 break;
duke@435 3056 case vmIntrinsics::_isPrimitive:
duke@435 3057 prim_return_value = intcon(1);
duke@435 3058 expect_prim = true; // obviously
duke@435 3059 break;
duke@435 3060 case vmIntrinsics::_getSuperclass:
duke@435 3061 prim_return_value = null();
duke@435 3062 return_type = TypeInstPtr::MIRROR->cast_to_ptr_type(TypePtr::BotPTR);
duke@435 3063 break;
duke@435 3064 case vmIntrinsics::_getComponentType:
duke@435 3065 prim_return_value = null();
duke@435 3066 return_type = TypeInstPtr::MIRROR->cast_to_ptr_type(TypePtr::BotPTR);
duke@435 3067 break;
duke@435 3068 case vmIntrinsics::_getClassAccessFlags:
duke@435 3069 prim_return_value = intcon(JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
duke@435 3070 return_type = TypeInt::INT; // not bool! 6297094
duke@435 3071 break;
duke@435 3072 default:
duke@435 3073 ShouldNotReachHere();
duke@435 3074 }
duke@435 3075
duke@435 3076 Node* mirror = argument(0);
duke@435 3077 Node* obj = (nargs <= 1)? top(): argument(1);
duke@435 3078
duke@435 3079 const TypeInstPtr* mirror_con = _gvn.type(mirror)->isa_instptr();
duke@435 3080 if (mirror_con == NULL) return false; // cannot happen?
duke@435 3081
duke@435 3082 #ifndef PRODUCT
duke@435 3083 if (PrintIntrinsics || PrintInlining || PrintOptoInlining) {
duke@435 3084 ciType* k = mirror_con->java_mirror_type();
duke@435 3085 if (k) {
duke@435 3086 tty->print("Inlining %s on constant Class ", vmIntrinsics::name_at(intrinsic_id()));
duke@435 3087 k->print_name();
duke@435 3088 tty->cr();
duke@435 3089 }
duke@435 3090 }
duke@435 3091 #endif
duke@435 3092
duke@435 3093 // Null-check the mirror, and the mirror's klass ptr (in case it is a primitive).
duke@435 3094 RegionNode* region = new (C, PATH_LIMIT) RegionNode(PATH_LIMIT);
duke@435 3095 record_for_igvn(region);
duke@435 3096 PhiNode* phi = new (C, PATH_LIMIT) PhiNode(region, return_type);
duke@435 3097
duke@435 3098 // The mirror will never be null of Reflection.getClassAccessFlags, however
duke@435 3099 // it may be null for Class.isInstance or Class.getModifiers. Throw a NPE
duke@435 3100 // if it is. See bug 4774291.
duke@435 3101
duke@435 3102 // For Reflection.getClassAccessFlags(), the null check occurs in
duke@435 3103 // the wrong place; see inline_unsafe_access(), above, for a similar
duke@435 3104 // situation.
duke@435 3105 _sp += nargs; // set original stack for use by uncommon_trap
duke@435 3106 mirror = do_null_check(mirror, T_OBJECT);
duke@435 3107 _sp -= nargs;
duke@435 3108 // If mirror or obj is dead, only null-path is taken.
duke@435 3109 if (stopped()) return true;
duke@435 3110
duke@435 3111 if (expect_prim) never_see_null = false; // expect nulls (meaning prims)
duke@435 3112
duke@435 3113 // Now load the mirror's klass metaobject, and null-check it.
duke@435 3114 // Side-effects region with the control path if the klass is null.
duke@435 3115 Node* kls = load_klass_from_mirror(mirror, never_see_null, nargs,
duke@435 3116 region, _prim_path);
duke@435 3117 // If kls is null, we have a primitive mirror.
duke@435 3118 phi->init_req(_prim_path, prim_return_value);
duke@435 3119 if (stopped()) { push_result(region, phi); return true; }
duke@435 3120
duke@435 3121 Node* p; // handy temp
duke@435 3122 Node* null_ctl;
duke@435 3123
duke@435 3124 // Now that we have the non-null klass, we can perform the real query.
duke@435 3125 // For constant classes, the query will constant-fold in LoadNode::Value.
duke@435 3126 Node* query_value = top();
duke@435 3127 switch (id) {
duke@435 3128 case vmIntrinsics::_isInstance:
duke@435 3129 // nothing is an instance of a primitive type
jrose@2101 3130 _sp += nargs; // gen_instanceof might do an uncommon trap
duke@435 3131 query_value = gen_instanceof(obj, kls);
jrose@2101 3132 _sp -= nargs;
duke@435 3133 break;
duke@435 3134
duke@435 3135 case vmIntrinsics::_getModifiers:
duke@435 3136 p = basic_plus_adr(kls, Klass::modifier_flags_offset_in_bytes() + sizeof(oopDesc));
duke@435 3137 query_value = make_load(NULL, p, TypeInt::INT, T_INT);
duke@435 3138 break;
duke@435 3139
duke@435 3140 case vmIntrinsics::_isInterface:
duke@435 3141 // (To verify this code sequence, check the asserts in JVM_IsInterface.)
duke@435 3142 if (generate_interface_guard(kls, region) != NULL)
duke@435 3143 // A guard was added. If the guard is taken, it was an interface.
duke@435 3144 phi->add_req(intcon(1));
duke@435 3145 // If we fall through, it's a plain class.
duke@435 3146 query_value = intcon(0);
duke@435 3147 break;
duke@435 3148
duke@435 3149 case vmIntrinsics::_isArray:
duke@435 3150 // (To verify this code sequence, check the asserts in JVM_IsArrayClass.)
duke@435 3151 if (generate_array_guard(kls, region) != NULL)
duke@435 3152 // A guard was added. If the guard is taken, it was an array.
duke@435 3153 phi->add_req(intcon(1));
duke@435 3154 // If we fall through, it's a plain class.
duke@435 3155 query_value = intcon(0);
duke@435 3156 break;
duke@435 3157
duke@435 3158 case vmIntrinsics::_isPrimitive:
duke@435 3159 query_value = intcon(0); // "normal" path produces false
duke@435 3160 break;
duke@435 3161
duke@435 3162 case vmIntrinsics::_getSuperclass:
duke@435 3163 // The rules here are somewhat unfortunate, but we can still do better
duke@435 3164 // with random logic than with a JNI call.
duke@435 3165 // Interfaces store null or Object as _super, but must report null.
duke@435 3166 // Arrays store an intermediate super as _super, but must report Object.
duke@435 3167 // Other types can report the actual _super.
duke@435 3168 // (To verify this code sequence, check the asserts in JVM_IsInterface.)
duke@435 3169 if (generate_interface_guard(kls, region) != NULL)
duke@435 3170 // A guard was added. If the guard is taken, it was an interface.
duke@435 3171 phi->add_req(null());
duke@435 3172 if (generate_array_guard(kls, region) != NULL)
duke@435 3173 // A guard was added. If the guard is taken, it was an array.
duke@435 3174 phi->add_req(makecon(TypeInstPtr::make(env()->Object_klass()->java_mirror())));
duke@435 3175 // If we fall through, it's a plain class. Get its _super.
duke@435 3176 p = basic_plus_adr(kls, Klass::super_offset_in_bytes() + sizeof(oopDesc));
kvn@599 3177 kls = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeRawPtr::BOTTOM, TypeKlassPtr::OBJECT_OR_NULL) );
duke@435 3178 null_ctl = top();
duke@435 3179 kls = null_check_oop(kls, &null_ctl);
duke@435 3180 if (null_ctl != top()) {
duke@435 3181 // If the guard is taken, Object.superClass is null (both klass and mirror).
duke@435 3182 region->add_req(null_ctl);
duke@435 3183 phi ->add_req(null());
duke@435 3184 }
duke@435 3185 if (!stopped()) {
duke@435 3186 query_value = load_mirror_from_klass(kls);
duke@435 3187 }
duke@435 3188 break;
duke@435 3189
duke@435 3190 case vmIntrinsics::_getComponentType:
duke@435 3191 if (generate_array_guard(kls, region) != NULL) {
duke@435 3192 // Be sure to pin the oop load to the guard edge just created:
duke@435 3193 Node* is_array_ctrl = region->in(region->req()-1);
duke@435 3194 Node* cma = basic_plus_adr(kls, in_bytes(arrayKlass::component_mirror_offset()) + sizeof(oopDesc));
duke@435 3195 Node* cmo = make_load(is_array_ctrl, cma, TypeInstPtr::MIRROR, T_OBJECT);
duke@435 3196 phi->add_req(cmo);
duke@435 3197 }
duke@435 3198 query_value = null(); // non-array case is null
duke@435 3199 break;
duke@435 3200
duke@435 3201 case vmIntrinsics::_getClassAccessFlags:
duke@435 3202 p = basic_plus_adr(kls, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc));
duke@435 3203 query_value = make_load(NULL, p, TypeInt::INT, T_INT);
duke@435 3204 break;
duke@435 3205
duke@435 3206 default:
duke@435 3207 ShouldNotReachHere();
duke@435 3208 }
duke@435 3209
duke@435 3210 // Fall-through is the normal case of a query to a real class.
duke@435 3211 phi->init_req(1, query_value);
duke@435 3212 region->init_req(1, control());
duke@435 3213
duke@435 3214 push_result(region, phi);
duke@435 3215 C->set_has_split_ifs(true); // Has chance for split-if optimization
duke@435 3216
duke@435 3217 return true;
duke@435 3218 }
duke@435 3219
duke@435 3220 //--------------------------inline_native_subtype_check------------------------
duke@435 3221 // This intrinsic takes the JNI calls out of the heart of
duke@435 3222 // UnsafeFieldAccessorImpl.set, which improves Field.set, readObject, etc.
duke@435 3223 bool LibraryCallKit::inline_native_subtype_check() {
duke@435 3224 int nargs = 1+1; // the Class mirror, plus the other class getting examined
duke@435 3225
duke@435 3226 // Pull both arguments off the stack.
duke@435 3227 Node* args[2]; // two java.lang.Class mirrors: superc, subc
duke@435 3228 args[0] = argument(0);
duke@435 3229 args[1] = argument(1);
duke@435 3230 Node* klasses[2]; // corresponding Klasses: superk, subk
duke@435 3231 klasses[0] = klasses[1] = top();
duke@435 3232
duke@435 3233 enum {
duke@435 3234 // A full decision tree on {superc is prim, subc is prim}:
duke@435 3235 _prim_0_path = 1, // {P,N} => false
duke@435 3236 // {P,P} & superc!=subc => false
duke@435 3237 _prim_same_path, // {P,P} & superc==subc => true
duke@435 3238 _prim_1_path, // {N,P} => false
duke@435 3239 _ref_subtype_path, // {N,N} & subtype check wins => true
duke@435 3240 _both_ref_path, // {N,N} & subtype check loses => false
duke@435 3241 PATH_LIMIT
duke@435 3242 };
duke@435 3243
duke@435 3244 RegionNode* region = new (C, PATH_LIMIT) RegionNode(PATH_LIMIT);
duke@435 3245 Node* phi = new (C, PATH_LIMIT) PhiNode(region, TypeInt::BOOL);
duke@435 3246 record_for_igvn(region);
duke@435 3247
duke@435 3248 const TypePtr* adr_type = TypeRawPtr::BOTTOM; // memory type of loads
duke@435 3249 const TypeKlassPtr* kls_type = TypeKlassPtr::OBJECT_OR_NULL;
duke@435 3250 int class_klass_offset = java_lang_Class::klass_offset_in_bytes();
duke@435 3251
duke@435 3252 // First null-check both mirrors and load each mirror's klass metaobject.
duke@435 3253 int which_arg;
duke@435 3254 for (which_arg = 0; which_arg <= 1; which_arg++) {
duke@435 3255 Node* arg = args[which_arg];
duke@435 3256 _sp += nargs; // set original stack for use by uncommon_trap
duke@435 3257 arg = do_null_check(arg, T_OBJECT);
duke@435 3258 _sp -= nargs;
duke@435 3259 if (stopped()) break;
duke@435 3260 args[which_arg] = _gvn.transform(arg);
duke@435 3261
duke@435 3262 Node* p = basic_plus_adr(arg, class_klass_offset);
kvn@599 3263 Node* kls = LoadKlassNode::make(_gvn, immutable_memory(), p, adr_type, kls_type);
duke@435 3264 klasses[which_arg] = _gvn.transform(kls);
duke@435 3265 }
duke@435 3266
duke@435 3267 // Having loaded both klasses, test each for null.
duke@435 3268 bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check);
duke@435 3269 for (which_arg = 0; which_arg <= 1; which_arg++) {
duke@435 3270 Node* kls = klasses[which_arg];
duke@435 3271 Node* null_ctl = top();
duke@435 3272 _sp += nargs; // set original stack for use by uncommon_trap
duke@435 3273 kls = null_check_oop(kls, &null_ctl, never_see_null);
duke@435 3274 _sp -= nargs;
duke@435 3275 int prim_path = (which_arg == 0 ? _prim_0_path : _prim_1_path);
duke@435 3276 region->init_req(prim_path, null_ctl);
duke@435 3277 if (stopped()) break;
duke@435 3278 klasses[which_arg] = kls;
duke@435 3279 }
duke@435 3280
duke@435 3281 if (!stopped()) {
duke@435 3282 // now we have two reference types, in klasses[0..1]
duke@435 3283 Node* subk = klasses[1]; // the argument to isAssignableFrom
duke@435 3284 Node* superk = klasses[0]; // the receiver
duke@435 3285 region->set_req(_both_ref_path, gen_subtype_check(subk, superk));
duke@435 3286 // now we have a successful reference subtype check
duke@435 3287 region->set_req(_ref_subtype_path, control());
duke@435 3288 }
duke@435 3289
duke@435 3290 // If both operands are primitive (both klasses null), then
duke@435 3291 // we must return true when they are identical primitives.
duke@435 3292 // It is convenient to test this after the first null klass check.
duke@435 3293 set_control(region->in(_prim_0_path)); // go back to first null check
duke@435 3294 if (!stopped()) {
duke@435 3295 // Since superc is primitive, make a guard for the superc==subc case.
duke@435 3296 Node* cmp_eq = _gvn.transform( new (C, 3) CmpPNode(args[0], args[1]) );
duke@435 3297 Node* bol_eq = _gvn.transform( new (C, 2) BoolNode(cmp_eq, BoolTest::eq) );
duke@435 3298 generate_guard(bol_eq, region, PROB_FAIR);
duke@435 3299 if (region->req() == PATH_LIMIT+1) {
duke@435 3300 // A guard was added. If the added guard is taken, superc==subc.
duke@435 3301 region->swap_edges(PATH_LIMIT, _prim_same_path);
duke@435 3302 region->del_req(PATH_LIMIT);
duke@435 3303 }
duke@435 3304 region->set_req(_prim_0_path, control()); // Not equal after all.
duke@435 3305 }
duke@435 3306
duke@435 3307 // these are the only paths that produce 'true':
duke@435 3308 phi->set_req(_prim_same_path, intcon(1));
duke@435 3309 phi->set_req(_ref_subtype_path, intcon(1));
duke@435 3310
duke@435 3311 // pull together the cases:
duke@435 3312 assert(region->req() == PATH_LIMIT, "sane region");
duke@435 3313 for (uint i = 1; i < region->req(); i++) {
duke@435 3314 Node* ctl = region->in(i);
duke@435 3315 if (ctl == NULL || ctl == top()) {
duke@435 3316 region->set_req(i, top());
duke@435 3317 phi ->set_req(i, top());
duke@435 3318 } else if (phi->in(i) == NULL) {
duke@435 3319 phi->set_req(i, intcon(0)); // all other paths produce 'false'
duke@435 3320 }
duke@435 3321 }
duke@435 3322
duke@435 3323 set_control(_gvn.transform(region));
duke@435 3324 push(_gvn.transform(phi));
duke@435 3325
duke@435 3326 return true;
duke@435 3327 }
duke@435 3328
duke@435 3329 //---------------------generate_array_guard_common------------------------
duke@435 3330 Node* LibraryCallKit::generate_array_guard_common(Node* kls, RegionNode* region,
duke@435 3331 bool obj_array, bool not_array) {
duke@435 3332 // If obj_array/non_array==false/false:
duke@435 3333 // Branch around if the given klass is in fact an array (either obj or prim).
duke@435 3334 // If obj_array/non_array==false/true:
duke@435 3335 // Branch around if the given klass is not an array klass of any kind.
duke@435 3336 // If obj_array/non_array==true/true:
duke@435 3337 // Branch around if the kls is not an oop array (kls is int[], String, etc.)
duke@435 3338 // If obj_array/non_array==true/false:
duke@435 3339 // Branch around if the kls is an oop array (Object[] or subtype)
duke@435 3340 //
duke@435 3341 // Like generate_guard, adds a new path onto the region.
duke@435 3342 jint layout_con = 0;
duke@435 3343 Node* layout_val = get_layout_helper(kls, layout_con);
duke@435 3344 if (layout_val == NULL) {
duke@435 3345 bool query = (obj_array
duke@435 3346 ? Klass::layout_helper_is_objArray(layout_con)
duke@435 3347 : Klass::layout_helper_is_javaArray(layout_con));
duke@435 3348 if (query == not_array) {
duke@435 3349 return NULL; // never a branch
duke@435 3350 } else { // always a branch
duke@435 3351 Node* always_branch = control();
duke@435 3352 if (region != NULL)
duke@435 3353 region->add_req(always_branch);
duke@435 3354 set_control(top());
duke@435 3355 return always_branch;
duke@435 3356 }
duke@435 3357 }
duke@435 3358 // Now test the correct condition.
duke@435 3359 jint nval = (obj_array
duke@435 3360 ? ((jint)Klass::_lh_array_tag_type_value
duke@435 3361 << Klass::_lh_array_tag_shift)
duke@435 3362 : Klass::_lh_neutral_value);
duke@435 3363 Node* cmp = _gvn.transform( new(C, 3) CmpINode(layout_val, intcon(nval)) );
duke@435 3364 BoolTest::mask btest = BoolTest::lt; // correct for testing is_[obj]array
duke@435 3365 // invert the test if we are looking for a non-array
duke@435 3366 if (not_array) btest = BoolTest(btest).negate();
duke@435 3367 Node* bol = _gvn.transform( new(C, 2) BoolNode(cmp, btest) );
duke@435 3368 return generate_fair_guard(bol, region);
duke@435 3369 }
duke@435 3370
duke@435 3371
duke@435 3372 //-----------------------inline_native_newArray--------------------------
duke@435 3373 bool LibraryCallKit::inline_native_newArray() {
duke@435 3374 int nargs = 2;
duke@435 3375 Node* mirror = argument(0);
duke@435 3376 Node* count_val = argument(1);
duke@435 3377
duke@435 3378 _sp += nargs; // set original stack for use by uncommon_trap
duke@435 3379 mirror = do_null_check(mirror, T_OBJECT);
duke@435 3380 _sp -= nargs;
kvn@598 3381 // If mirror or obj is dead, only null-path is taken.
kvn@598 3382 if (stopped()) return true;
duke@435 3383
duke@435 3384 enum { _normal_path = 1, _slow_path = 2, PATH_LIMIT };
duke@435 3385 RegionNode* result_reg = new(C, PATH_LIMIT) RegionNode(PATH_LIMIT);
duke@435 3386 PhiNode* result_val = new(C, PATH_LIMIT) PhiNode(result_reg,
duke@435 3387 TypeInstPtr::NOTNULL);
duke@435 3388 PhiNode* result_io = new(C, PATH_LIMIT) PhiNode(result_reg, Type::ABIO);
duke@435 3389 PhiNode* result_mem = new(C, PATH_LIMIT) PhiNode(result_reg, Type::MEMORY,
duke@435 3390 TypePtr::BOTTOM);
duke@435 3391
duke@435 3392 bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check);
duke@435 3393 Node* klass_node = load_array_klass_from_mirror(mirror, never_see_null,
duke@435 3394 nargs,
duke@435 3395 result_reg, _slow_path);
duke@435 3396 Node* normal_ctl = control();
duke@435 3397 Node* no_array_ctl = result_reg->in(_slow_path);
duke@435 3398
duke@435 3399 // Generate code for the slow case. We make a call to newArray().
duke@435 3400 set_control(no_array_ctl);
duke@435 3401 if (!stopped()) {
duke@435 3402 // Either the input type is void.class, or else the
duke@435 3403 // array klass has not yet been cached. Either the
duke@435 3404 // ensuing call will throw an exception, or else it
duke@435 3405 // will cache the array klass for next time.
duke@435 3406 PreserveJVMState pjvms(this);
duke@435 3407 CallJavaNode* slow_call = generate_method_call_static(vmIntrinsics::_newArray);
duke@435 3408 Node* slow_result = set_results_for_java_call(slow_call);
duke@435 3409 // this->control() comes from set_results_for_java_call
duke@435 3410 result_reg->set_req(_slow_path, control());
duke@435 3411 result_val->set_req(_slow_path, slow_result);
duke@435 3412 result_io ->set_req(_slow_path, i_o());
duke@435 3413 result_mem->set_req(_slow_path, reset_memory());
duke@435 3414 }
duke@435 3415
duke@435 3416 set_control(normal_ctl);
duke@435 3417 if (!stopped()) {
duke@435 3418 // Normal case: The array type has been cached in the java.lang.Class.
duke@435 3419 // The following call works fine even if the array type is polymorphic.
duke@435 3420 // It could be a dynamic mix of int[], boolean[], Object[], etc.
cfang@1165 3421 Node* obj = new_array(klass_node, count_val, nargs);
duke@435 3422 result_reg->init_req(_normal_path, control());
duke@435 3423 result_val->init_req(_normal_path, obj);
duke@435 3424 result_io ->init_req(_normal_path, i_o());
duke@435 3425 result_mem->init_req(_normal_path, reset_memory());
duke@435 3426 }
duke@435 3427
duke@435 3428 // Return the combined state.
duke@435 3429 set_i_o( _gvn.transform(result_io) );
duke@435 3430 set_all_memory( _gvn.transform(result_mem) );
duke@435 3431 push_result(result_reg, result_val);
duke@435 3432 C->set_has_split_ifs(true); // Has chance for split-if optimization
duke@435 3433
duke@435 3434 return true;
duke@435 3435 }
duke@435 3436
duke@435 3437 //----------------------inline_native_getLength--------------------------
duke@435 3438 bool LibraryCallKit::inline_native_getLength() {
duke@435 3439 if (too_many_traps(Deoptimization::Reason_intrinsic)) return false;
duke@435 3440
duke@435 3441 int nargs = 1;
duke@435 3442 Node* array = argument(0);
duke@435 3443
duke@435 3444 _sp += nargs; // set original stack for use by uncommon_trap
duke@435 3445 array = do_null_check(array, T_OBJECT);
duke@435 3446 _sp -= nargs;
duke@435 3447
duke@435 3448 // If array is dead, only null-path is taken.
duke@435 3449 if (stopped()) return true;
duke@435 3450
duke@435 3451 // Deoptimize if it is a non-array.
duke@435 3452 Node* non_array = generate_non_array_guard(load_object_klass(array), NULL);
duke@435 3453
duke@435 3454 if (non_array != NULL) {
duke@435 3455 PreserveJVMState pjvms(this);
duke@435 3456 set_control(non_array);
duke@435 3457 _sp += nargs; // push the arguments back on the stack
duke@435 3458 uncommon_trap(Deoptimization::Reason_intrinsic,
duke@435 3459 Deoptimization::Action_maybe_recompile);
duke@435 3460 }
duke@435 3461
duke@435 3462 // If control is dead, only non-array-path is taken.
duke@435 3463 if (stopped()) return true;
duke@435 3464
duke@435 3465 // The works fine even if the array type is polymorphic.
duke@435 3466 // It could be a dynamic mix of int[], boolean[], Object[], etc.
duke@435 3467 push( load_array_length(array) );
duke@435 3468
duke@435 3469 C->set_has_split_ifs(true); // Has chance for split-if optimization
duke@435 3470
duke@435 3471 return true;
duke@435 3472 }
duke@435 3473
duke@435 3474 //------------------------inline_array_copyOf----------------------------
duke@435 3475 bool LibraryCallKit::inline_array_copyOf(bool is_copyOfRange) {
duke@435 3476 if (too_many_traps(Deoptimization::Reason_intrinsic)) return false;
duke@435 3477
duke@435 3478 // Restore the stack and pop off the arguments.
duke@435 3479 int nargs = 3 + (is_copyOfRange? 1: 0);
duke@435 3480 Node* original = argument(0);
duke@435 3481 Node* start = is_copyOfRange? argument(1): intcon(0);
duke@435 3482 Node* end = is_copyOfRange? argument(2): argument(1);
duke@435 3483 Node* array_type_mirror = is_copyOfRange? argument(3): argument(2);
duke@435 3484
cfang@1337 3485 Node* newcopy;
cfang@1337 3486
cfang@1337 3487 //set the original stack and the reexecute bit for the interpreter to reexecute
cfang@1337 3488 //the bytecode that invokes Arrays.copyOf if deoptimization happens
cfang@1337 3489 { PreserveReexecuteState preexecs(this);
cfang@1337 3490 _sp += nargs;
cfang@1337 3491 jvms()->set_should_reexecute(true);
cfang@1337 3492
cfang@1337 3493 array_type_mirror = do_null_check(array_type_mirror, T_OBJECT);
cfang@1337 3494 original = do_null_check(original, T_OBJECT);
cfang@1337 3495
cfang@1337 3496 // Check if a null path was taken unconditionally.
cfang@1337 3497 if (stopped()) return true;
cfang@1337 3498
cfang@1337 3499 Node* orig_length = load_array_length(original);
cfang@1337 3500
cfang@1337 3501 Node* klass_node = load_klass_from_mirror(array_type_mirror, false, 0,
cfang@1337 3502 NULL, 0);
cfang@1337 3503 klass_node = do_null_check(klass_node, T_OBJECT);
cfang@1337 3504
cfang@1337 3505 RegionNode* bailout = new (C, 1) RegionNode(1);
cfang@1337 3506 record_for_igvn(bailout);
cfang@1337 3507
cfang@1337 3508 // Despite the generic type of Arrays.copyOf, the mirror might be int, int[], etc.
cfang@1337 3509 // Bail out if that is so.
cfang@1337 3510 Node* not_objArray = generate_non_objArray_guard(klass_node, bailout);
cfang@1337 3511 if (not_objArray != NULL) {
cfang@1337 3512 // Improve the klass node's type from the new optimistic assumption:
cfang@1337 3513 ciKlass* ak = ciArrayKlass::make(env()->Object_klass());
cfang@1337 3514 const Type* akls = TypeKlassPtr::make(TypePtr::NotNull, ak, 0/*offset*/);
cfang@1337 3515 Node* cast = new (C, 2) CastPPNode(klass_node, akls);
cfang@1337 3516 cast->init_req(0, control());
cfang@1337 3517 klass_node = _gvn.transform(cast);
cfang@1337 3518 }
cfang@1337 3519
cfang@1337 3520 // Bail out if either start or end is negative.
cfang@1337 3521 generate_negative_guard(start, bailout, &start);
cfang@1337 3522 generate_negative_guard(end, bailout, &end);
cfang@1337 3523
cfang@1337 3524 Node* length = end;
cfang@1337 3525 if (_gvn.type(start) != TypeInt::ZERO) {
cfang@1337 3526 length = _gvn.transform( new (C, 3) SubINode(end, start) );
cfang@1337 3527 }
cfang@1337 3528
cfang@1337 3529 // Bail out if length is negative.
cfang@1337 3530 // ...Not needed, since the new_array will throw the right exception.
cfang@1337 3531 //generate_negative_guard(length, bailout, &length);
cfang@1337 3532
cfang@1337 3533 if (bailout->req() > 1) {
cfang@1337 3534 PreserveJVMState pjvms(this);
cfang@1337 3535 set_control( _gvn.transform(bailout) );
cfang@1337 3536 uncommon_trap(Deoptimization::Reason_intrinsic,
cfang@1337 3537 Deoptimization::Action_maybe_recompile);
cfang@1337 3538 }
cfang@1337 3539
cfang@1337 3540 if (!stopped()) {
cfang@1335 3541
cfang@1335 3542 // How many elements will we copy from the original?
cfang@1335 3543 // The answer is MinI(orig_length - start, length).
cfang@1335 3544 Node* orig_tail = _gvn.transform( new(C, 3) SubINode(orig_length, start) );
cfang@1335 3545 Node* moved = generate_min_max(vmIntrinsics::_min, orig_tail, length);
cfang@1335 3546
cfang@1335 3547 const bool raw_mem_only = true;
cfang@1335 3548 newcopy = new_array(klass_node, length, 0, raw_mem_only);
cfang@1335 3549
cfang@1335 3550 // Generate a direct call to the right arraycopy function(s).
cfang@1335 3551 // We know the copy is disjoint but we might not know if the
cfang@1335 3552 // oop stores need checking.
cfang@1335 3553 // Extreme case: Arrays.copyOf((Integer[])x, 10, String[].class).
cfang@1335 3554 // This will fail a store-check if x contains any non-nulls.
cfang@1335 3555 bool disjoint_bases = true;
cfang@1335 3556 bool length_never_negative = true;
cfang@1335 3557 generate_arraycopy(TypeAryPtr::OOPS, T_OBJECT,
cfang@1335 3558 original, start, newcopy, intcon(0), moved,
cfang@1335 3559 disjoint_bases, length_never_negative);
cfang@1337 3560 }
cfang@1337 3561 } //original reexecute and sp are set back here
cfang@1337 3562
cfang@1337 3563 if(!stopped()) {
duke@435 3564 push(newcopy);
duke@435 3565 }
duke@435 3566
duke@435 3567 C->set_has_split_ifs(true); // Has chance for split-if optimization
duke@435 3568
duke@435 3569 return true;
duke@435 3570 }
duke@435 3571
duke@435 3572
duke@435 3573 //----------------------generate_virtual_guard---------------------------
duke@435 3574 // Helper for hashCode and clone. Peeks inside the vtable to avoid a call.
duke@435 3575 Node* LibraryCallKit::generate_virtual_guard(Node* obj_klass,
duke@435 3576 RegionNode* slow_region) {
duke@435 3577 ciMethod* method = callee();
duke@435 3578 int vtable_index = method->vtable_index();
duke@435 3579 // Get the methodOop out of the appropriate vtable entry.
duke@435 3580 int entry_offset = (instanceKlass::vtable_start_offset() +
duke@435 3581 vtable_index*vtableEntry::size()) * wordSize +
duke@435 3582 vtableEntry::method_offset_in_bytes();
duke@435 3583 Node* entry_addr = basic_plus_adr(obj_klass, entry_offset);
duke@435 3584 Node* target_call = make_load(NULL, entry_addr, TypeInstPtr::NOTNULL, T_OBJECT);
duke@435 3585
duke@435 3586 // Compare the target method with the expected method (e.g., Object.hashCode).
duke@435 3587 const TypeInstPtr* native_call_addr = TypeInstPtr::make(method);
duke@435 3588
duke@435 3589 Node* native_call = makecon(native_call_addr);
duke@435 3590 Node* chk_native = _gvn.transform( new(C, 3) CmpPNode(target_call, native_call) );
duke@435 3591 Node* test_native = _gvn.transform( new(C, 2) BoolNode(chk_native, BoolTest::ne) );
duke@435 3592
duke@435 3593 return generate_slow_guard(test_native, slow_region);
duke@435 3594 }
duke@435 3595
duke@435 3596 //-----------------------generate_method_call----------------------------
duke@435 3597 // Use generate_method_call to make a slow-call to the real
duke@435 3598 // method if the fast path fails. An alternative would be to
duke@435 3599 // use a stub like OptoRuntime::slow_arraycopy_Java.
duke@435 3600 // This only works for expanding the current library call,
duke@435 3601 // not another intrinsic. (E.g., don't use this for making an
duke@435 3602 // arraycopy call inside of the copyOf intrinsic.)
duke@435 3603 CallJavaNode*
duke@435 3604 LibraryCallKit::generate_method_call(vmIntrinsics::ID method_id, bool is_virtual, bool is_static) {
duke@435 3605 // When compiling the intrinsic method itself, do not use this technique.
duke@435 3606 guarantee(callee() != C->method(), "cannot make slow-call to self");
duke@435 3607
duke@435 3608 ciMethod* method = callee();
duke@435 3609 // ensure the JVMS we have will be correct for this call
duke@435 3610 guarantee(method_id == method->intrinsic_id(), "must match");
duke@435 3611
duke@435 3612 const TypeFunc* tf = TypeFunc::make(method);
duke@435 3613 int tfdc = tf->domain()->cnt();
duke@435 3614 CallJavaNode* slow_call;
duke@435 3615 if (is_static) {
duke@435 3616 assert(!is_virtual, "");
duke@435 3617 slow_call = new(C, tfdc) CallStaticJavaNode(tf,
duke@435 3618 SharedRuntime::get_resolve_static_call_stub(),
duke@435 3619 method, bci());
duke@435 3620 } else if (is_virtual) {
duke@435 3621 null_check_receiver(method);
duke@435 3622 int vtable_index = methodOopDesc::invalid_vtable_index;
duke@435 3623 if (UseInlineCaches) {
duke@435 3624 // Suppress the vtable call
duke@435 3625 } else {
duke@435 3626 // hashCode and clone are not a miranda methods,
duke@435 3627 // so the vtable index is fixed.
duke@435 3628 // No need to use the linkResolver to get it.
duke@435 3629 vtable_index = method->vtable_index();
duke@435 3630 }
duke@435 3631 slow_call = new(C, tfdc) CallDynamicJavaNode(tf,
duke@435 3632 SharedRuntime::get_resolve_virtual_call_stub(),
duke@435 3633 method, vtable_index, bci());
duke@435 3634 } else { // neither virtual nor static: opt_virtual
duke@435 3635 null_check_receiver(method);
duke@435 3636 slow_call = new(C, tfdc) CallStaticJavaNode(tf,
duke@435 3637 SharedRuntime::get_resolve_opt_virtual_call_stub(),
duke@435 3638 method, bci());
duke@435 3639 slow_call->set_optimized_virtual(true);
duke@435 3640 }
duke@435 3641 set_arguments_for_java_call(slow_call);
duke@435 3642 set_edges_for_java_call(slow_call);
duke@435 3643 return slow_call;
duke@435 3644 }
duke@435 3645
duke@435 3646
duke@435 3647 //------------------------------inline_native_hashcode--------------------
duke@435 3648 // Build special case code for calls to hashCode on an object.
duke@435 3649 bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) {
duke@435 3650 assert(is_static == callee()->is_static(), "correct intrinsic selection");
duke@435 3651 assert(!(is_virtual && is_static), "either virtual, special, or static");
duke@435 3652
duke@435 3653 enum { _slow_path = 1, _fast_path, _null_path, PATH_LIMIT };
duke@435 3654
duke@435 3655 RegionNode* result_reg = new(C, PATH_LIMIT) RegionNode(PATH_LIMIT);
duke@435 3656 PhiNode* result_val = new(C, PATH_LIMIT) PhiNode(result_reg,
duke@435 3657 TypeInt::INT);
duke@435 3658 PhiNode* result_io = new(C, PATH_LIMIT) PhiNode(result_reg, Type::ABIO);
duke@435 3659 PhiNode* result_mem = new(C, PATH_LIMIT) PhiNode(result_reg, Type::MEMORY,
duke@435 3660 TypePtr::BOTTOM);
duke@435 3661 Node* obj = NULL;
duke@435 3662 if (!is_static) {
duke@435 3663 // Check for hashing null object
duke@435 3664 obj = null_check_receiver(callee());
duke@435 3665 if (stopped()) return true; // unconditionally null
duke@435 3666 result_reg->init_req(_null_path, top());
duke@435 3667 result_val->init_req(_null_path, top());
duke@435 3668 } else {
duke@435 3669 // Do a null check, and return zero if null.
duke@435 3670 // System.identityHashCode(null) == 0
duke@435 3671 obj = argument(0);
duke@435 3672 Node* null_ctl = top();
duke@435 3673 obj = null_check_oop(obj, &null_ctl);
duke@435 3674 result_reg->init_req(_null_path, null_ctl);
duke@435 3675 result_val->init_req(_null_path, _gvn.intcon(0));
duke@435 3676 }
duke@435 3677
duke@435 3678 // Unconditionally null? Then return right away.
duke@435 3679 if (stopped()) {
duke@435 3680 set_control( result_reg->in(_null_path) );
duke@435 3681 if (!stopped())
duke@435 3682 push( result_val ->in(_null_path) );
duke@435 3683 return true;
duke@435 3684 }
duke@435 3685
duke@435 3686 // After null check, get the object's klass.
duke@435 3687 Node* obj_klass = load_object_klass(obj);
duke@435 3688
duke@435 3689 // This call may be virtual (invokevirtual) or bound (invokespecial).
duke@435 3690 // For each case we generate slightly different code.
duke@435 3691
duke@435 3692 // We only go to the fast case code if we pass a number of guards. The
duke@435 3693 // paths which do not pass are accumulated in the slow_region.
duke@435 3694 RegionNode* slow_region = new (C, 1) RegionNode(1);
duke@435 3695 record_for_igvn(slow_region);
duke@435 3696
duke@435 3697 // If this is a virtual call, we generate a funny guard. We pull out
duke@435 3698 // the vtable entry corresponding to hashCode() from the target object.
duke@435 3699 // If the target method which we are calling happens to be the native
duke@435 3700 // Object hashCode() method, we pass the guard. We do not need this
duke@435 3701 // guard for non-virtual calls -- the caller is known to be the native
duke@435 3702 // Object hashCode().
duke@435 3703 if (is_virtual) {
duke@435 3704 generate_virtual_guard(obj_klass, slow_region);
duke@435 3705 }
duke@435 3706
duke@435 3707 // Get the header out of the object, use LoadMarkNode when available
duke@435 3708 Node* header_addr = basic_plus_adr(obj, oopDesc::mark_offset_in_bytes());
kvn@1964 3709 Node* header = make_load(control(), header_addr, TypeX_X, TypeX_X->basic_type());
duke@435 3710
duke@435 3711 // Test the header to see if it is unlocked.
duke@435 3712 Node *lock_mask = _gvn.MakeConX(markOopDesc::biased_lock_mask_in_place);
duke@435 3713 Node *lmasked_header = _gvn.transform( new (C, 3) AndXNode(header, lock_mask) );
duke@435 3714 Node *unlocked_val = _gvn.MakeConX(markOopDesc::unlocked_value);
duke@435 3715 Node *chk_unlocked = _gvn.transform( new (C, 3) CmpXNode( lmasked_header, unlocked_val));
duke@435 3716 Node *test_unlocked = _gvn.transform( new (C, 2) BoolNode( chk_unlocked, BoolTest::ne) );
duke@435 3717
duke@435 3718 generate_slow_guard(test_unlocked, slow_region);
duke@435 3719
duke@435 3720 // Get the hash value and check to see that it has been properly assigned.
duke@435 3721 // We depend on hash_mask being at most 32 bits and avoid the use of
duke@435 3722 // hash_mask_in_place because it could be larger than 32 bits in a 64-bit
duke@435 3723 // vm: see markOop.hpp.
duke@435 3724 Node *hash_mask = _gvn.intcon(markOopDesc::hash_mask);
duke@435 3725 Node *hash_shift = _gvn.intcon(markOopDesc::hash_shift);
duke@435 3726 Node *hshifted_header= _gvn.transform( new (C, 3) URShiftXNode(header, hash_shift) );
duke@435 3727 // This hack lets the hash bits live anywhere in the mark object now, as long
twisti@1040 3728 // as the shift drops the relevant bits into the low 32 bits. Note that
duke@435 3729 // Java spec says that HashCode is an int so there's no point in capturing
duke@435 3730 // an 'X'-sized hashcode (32 in 32-bit build or 64 in 64-bit build).
duke@435 3731 hshifted_header = ConvX2I(hshifted_header);
duke@435 3732 Node *hash_val = _gvn.transform( new (C, 3) AndINode(hshifted_header, hash_mask) );
duke@435 3733
duke@435 3734 Node *no_hash_val = _gvn.intcon(markOopDesc::no_hash);
duke@435 3735 Node *chk_assigned = _gvn.transform( new (C, 3) CmpINode( hash_val, no_hash_val));
duke@435 3736 Node *test_assigned = _gvn.transform( new (C, 2) BoolNode( chk_assigned, BoolTest::eq) );
duke@435 3737
duke@435 3738 generate_slow_guard(test_assigned, slow_region);
duke@435 3739
duke@435 3740 Node* init_mem = reset_memory();
duke@435 3741 // fill in the rest of the null path:
duke@435 3742 result_io ->init_req(_null_path, i_o());
duke@435 3743 result_mem->init_req(_null_path, init_mem);
duke@435 3744
duke@435 3745 result_val->init_req(_fast_path, hash_val);
duke@435 3746 result_reg->init_req(_fast_path, control());
duke@435 3747 result_io ->init_req(_fast_path, i_o());
duke@435 3748 result_mem->init_req(_fast_path, init_mem);
duke@435 3749
duke@435 3750 // Generate code for the slow case. We make a call to hashCode().
duke@435 3751 set_control(_gvn.transform(slow_region));
duke@435 3752 if (!stopped()) {
duke@435 3753 // No need for PreserveJVMState, because we're using up the present state.
duke@435 3754 set_all_memory(init_mem);
duke@435 3755 vmIntrinsics::ID hashCode_id = vmIntrinsics::_hashCode;
duke@435 3756 if (is_static) hashCode_id = vmIntrinsics::_identityHashCode;
duke@435 3757 CallJavaNode* slow_call = generate_method_call(hashCode_id, is_virtual, is_static);
duke@435 3758 Node* slow_result = set_results_for_java_call(slow_call);
duke@435 3759 // this->control() comes from set_results_for_java_call
duke@435 3760 result_reg->init_req(_slow_path, control());
duke@435 3761 result_val->init_req(_slow_path, slow_result);
duke@435 3762 result_io ->set_req(_slow_path, i_o());
duke@435 3763 result_mem ->set_req(_slow_path, reset_memory());
duke@435 3764 }
duke@435 3765
duke@435 3766 // Return the combined state.
duke@435 3767 set_i_o( _gvn.transform(result_io) );
duke@435 3768 set_all_memory( _gvn.transform(result_mem) );
duke@435 3769 push_result(result_reg, result_val);
duke@435 3770
duke@435 3771 return true;
duke@435 3772 }
duke@435 3773
duke@435 3774 //---------------------------inline_native_getClass----------------------------
twisti@1040 3775 // Build special case code for calls to getClass on an object.
duke@435 3776 bool LibraryCallKit::inline_native_getClass() {
duke@435 3777 Node* obj = null_check_receiver(callee());
duke@435 3778 if (stopped()) return true;
duke@435 3779 push( load_mirror_from_klass(load_object_klass(obj)) );
duke@435 3780 return true;
duke@435 3781 }
duke@435 3782
duke@435 3783 //-----------------inline_native_Reflection_getCallerClass---------------------
duke@435 3784 // In the presence of deep enough inlining, getCallerClass() becomes a no-op.
duke@435 3785 //
duke@435 3786 // NOTE that this code must perform the same logic as
duke@435 3787 // vframeStream::security_get_caller_frame in that it must skip
duke@435 3788 // Method.invoke() and auxiliary frames.
duke@435 3789
duke@435 3790
duke@435 3791
duke@435 3792
duke@435 3793 bool LibraryCallKit::inline_native_Reflection_getCallerClass() {
duke@435 3794 ciMethod* method = callee();
duke@435 3795
duke@435 3796 #ifndef PRODUCT
duke@435 3797 if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) {
duke@435 3798 tty->print_cr("Attempting to inline sun.reflect.Reflection.getCallerClass");
duke@435 3799 }
duke@435 3800 #endif
duke@435 3801
duke@435 3802 debug_only(int saved_sp = _sp);
duke@435 3803
duke@435 3804 // Argument words: (int depth)
duke@435 3805 int nargs = 1;
duke@435 3806
duke@435 3807 _sp += nargs;
duke@435 3808 Node* caller_depth_node = pop();
duke@435 3809
duke@435 3810 assert(saved_sp == _sp, "must have correct argument count");
duke@435 3811
duke@435 3812 // The depth value must be a constant in order for the runtime call
duke@435 3813 // to be eliminated.
duke@435 3814 const TypeInt* caller_depth_type = _gvn.type(caller_depth_node)->isa_int();
duke@435 3815 if (caller_depth_type == NULL || !caller_depth_type->is_con()) {
duke@435 3816 #ifndef PRODUCT
duke@435 3817 if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) {
duke@435 3818 tty->print_cr(" Bailing out because caller depth was not a constant");
duke@435 3819 }
duke@435 3820 #endif
duke@435 3821 return false;
duke@435 3822 }
duke@435 3823 // Note that the JVM state at this point does not include the
duke@435 3824 // getCallerClass() frame which we are trying to inline. The
duke@435 3825 // semantics of getCallerClass(), however, are that the "first"
duke@435 3826 // frame is the getCallerClass() frame, so we subtract one from the
duke@435 3827 // requested depth before continuing. We don't inline requests of
duke@435 3828 // getCallerClass(0).
duke@435 3829 int caller_depth = caller_depth_type->get_con() - 1;
duke@435 3830 if (caller_depth < 0) {
duke@435 3831 #ifndef PRODUCT
duke@435 3832 if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) {
duke@435 3833 tty->print_cr(" Bailing out because caller depth was %d", caller_depth);
duke@435 3834 }
duke@435 3835 #endif
duke@435 3836 return false;
duke@435 3837 }
duke@435 3838
duke@435 3839 if (!jvms()->has_method()) {
duke@435 3840 #ifndef PRODUCT
duke@435 3841 if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) {
duke@435 3842 tty->print_cr(" Bailing out because intrinsic was inlined at top level");
duke@435 3843 }
duke@435 3844 #endif
duke@435 3845 return false;
duke@435 3846 }
duke@435 3847 int _depth = jvms()->depth(); // cache call chain depth
duke@435 3848
duke@435 3849 // Walk back up the JVM state to find the caller at the required
duke@435 3850 // depth. NOTE that this code must perform the same logic as
duke@435 3851 // vframeStream::security_get_caller_frame in that it must skip
duke@435 3852 // Method.invoke() and auxiliary frames. Note also that depth is
duke@435 3853 // 1-based (1 is the bottom of the inlining).
duke@435 3854 int inlining_depth = _depth;
duke@435 3855 JVMState* caller_jvms = NULL;
duke@435 3856
duke@435 3857 if (inlining_depth > 0) {
duke@435 3858 caller_jvms = jvms();
duke@435 3859 assert(caller_jvms = jvms()->of_depth(inlining_depth), "inlining_depth == our depth");
duke@435 3860 do {
duke@435 3861 // The following if-tests should be performed in this order
duke@435 3862 if (is_method_invoke_or_aux_frame(caller_jvms)) {
duke@435 3863 // Skip a Method.invoke() or auxiliary frame
duke@435 3864 } else if (caller_depth > 0) {
duke@435 3865 // Skip real frame
duke@435 3866 --caller_depth;
duke@435 3867 } else {
duke@435 3868 // We're done: reached desired caller after skipping.
duke@435 3869 break;
duke@435 3870 }
duke@435 3871 caller_jvms = caller_jvms->caller();
duke@435 3872 --inlining_depth;
duke@435 3873 } while (inlining_depth > 0);
duke@435 3874 }
duke@435 3875
duke@435 3876 if (inlining_depth == 0) {
duke@435 3877 #ifndef PRODUCT
duke@435 3878 if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) {
duke@435 3879 tty->print_cr(" Bailing out because caller depth (%d) exceeded inlining depth (%d)", caller_depth_type->get_con(), _depth);
duke@435 3880 tty->print_cr(" JVM state at this point:");
duke@435 3881 for (int i = _depth; i >= 1; i--) {
duke@435 3882 tty->print_cr(" %d) %s", i, jvms()->of_depth(i)->method()->name()->as_utf8());
duke@435 3883 }
duke@435 3884 }
duke@435 3885 #endif
duke@435 3886 return false; // Reached end of inlining
duke@435 3887 }
duke@435 3888
duke@435 3889 // Acquire method holder as java.lang.Class
duke@435 3890 ciInstanceKlass* caller_klass = caller_jvms->method()->holder();
duke@435 3891 ciInstance* caller_mirror = caller_klass->java_mirror();
duke@435 3892 // Push this as a constant
duke@435 3893 push(makecon(TypeInstPtr::make(caller_mirror)));
duke@435 3894 #ifndef PRODUCT
duke@435 3895 if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) {
duke@435 3896 tty->print_cr(" Succeeded: caller = %s.%s, caller depth = %d, depth = %d", caller_klass->name()->as_utf8(), caller_jvms->method()->name()->as_utf8(), caller_depth_type->get_con(), _depth);
duke@435 3897 tty->print_cr(" JVM state at this point:");
duke@435 3898 for (int i = _depth; i >= 1; i--) {
duke@435 3899 tty->print_cr(" %d) %s", i, jvms()->of_depth(i)->method()->name()->as_utf8());
duke@435 3900 }
duke@435 3901 }
duke@435 3902 #endif
duke@435 3903 return true;
duke@435 3904 }
duke@435 3905
duke@435 3906 // Helper routine for above
duke@435 3907 bool LibraryCallKit::is_method_invoke_or_aux_frame(JVMState* jvms) {
twisti@1587 3908 ciMethod* method = jvms->method();
twisti@1587 3909
duke@435 3910 // Is this the Method.invoke method itself?
twisti@1587 3911 if (method->intrinsic_id() == vmIntrinsics::_invoke)
duke@435 3912 return true;
duke@435 3913
duke@435 3914 // Is this a helper, defined somewhere underneath MethodAccessorImpl.
twisti@1587 3915 ciKlass* k = method->holder();
duke@435 3916 if (k->is_instance_klass()) {
duke@435 3917 ciInstanceKlass* ik = k->as_instance_klass();
duke@435 3918 for (; ik != NULL; ik = ik->super()) {
duke@435 3919 if (ik->name() == ciSymbol::sun_reflect_MethodAccessorImpl() &&
duke@435 3920 ik == env()->find_system_klass(ik->name())) {
duke@435 3921 return true;
duke@435 3922 }
duke@435 3923 }
duke@435 3924 }
twisti@1587 3925 else if (method->is_method_handle_adapter()) {
twisti@1587 3926 // This is an internal adapter frame from the MethodHandleCompiler -- skip it
twisti@1587 3927 return true;
twisti@1587 3928 }
duke@435 3929
duke@435 3930 return false;
duke@435 3931 }
duke@435 3932
duke@435 3933 static int value_field_offset = -1; // offset of the "value" field of AtomicLongCSImpl. This is needed by
duke@435 3934 // inline_native_AtomicLong_attemptUpdate() but it has no way of
duke@435 3935 // computing it since there is no lookup field by name function in the
duke@435 3936 // CI interface. This is computed and set by inline_native_AtomicLong_get().
duke@435 3937 // Using a static variable here is safe even if we have multiple compilation
duke@435 3938 // threads because the offset is constant. At worst the same offset will be
duke@435 3939 // computed and stored multiple
duke@435 3940
duke@435 3941 bool LibraryCallKit::inline_native_AtomicLong_get() {
duke@435 3942 // Restore the stack and pop off the argument
duke@435 3943 _sp+=1;
duke@435 3944 Node *obj = pop();
duke@435 3945
duke@435 3946 // get the offset of the "value" field. Since the CI interfaces
duke@435 3947 // does not provide a way to look up a field by name, we scan the bytecodes
duke@435 3948 // to get the field index. We expect the first 2 instructions of the method
duke@435 3949 // to be:
duke@435 3950 // 0 aload_0
duke@435 3951 // 1 getfield "value"
duke@435 3952 ciMethod* method = callee();
duke@435 3953 if (value_field_offset == -1)
duke@435 3954 {
duke@435 3955 ciField* value_field;
duke@435 3956 ciBytecodeStream iter(method);
duke@435 3957 Bytecodes::Code bc = iter.next();
duke@435 3958
duke@435 3959 if ((bc != Bytecodes::_aload_0) &&
duke@435 3960 ((bc != Bytecodes::_aload) || (iter.get_index() != 0)))
duke@435 3961 return false;
duke@435 3962 bc = iter.next();
duke@435 3963 if (bc != Bytecodes::_getfield)
duke@435 3964 return false;
duke@435 3965 bool ignore;
duke@435 3966 value_field = iter.get_field(ignore);
duke@435 3967 value_field_offset = value_field->offset_in_bytes();
duke@435 3968 }
duke@435 3969
duke@435 3970 // Null check without removing any arguments.
duke@435 3971 _sp++;
duke@435 3972 obj = do_null_check(obj, T_OBJECT);
duke@435 3973 _sp--;
duke@435 3974 // Check for locking null object
duke@435 3975 if (stopped()) return true;
duke@435 3976
duke@435 3977 Node *adr = basic_plus_adr(obj, obj, value_field_offset);
duke@435 3978 const TypePtr *adr_type = _gvn.type(adr)->is_ptr();
duke@435 3979 int alias_idx = C->get_alias_index(adr_type);
duke@435 3980
duke@435 3981 Node *result = _gvn.transform(new (C, 3) LoadLLockedNode(control(), memory(alias_idx), adr));
duke@435 3982
duke@435 3983 push_pair(result);
duke@435 3984
duke@435 3985 return true;
duke@435 3986 }
duke@435 3987
duke@435 3988 bool LibraryCallKit::inline_native_AtomicLong_attemptUpdate() {
duke@435 3989 // Restore the stack and pop off the arguments
duke@435 3990 _sp+=5;
duke@435 3991 Node *newVal = pop_pair();
duke@435 3992 Node *oldVal = pop_pair();
duke@435 3993 Node *obj = pop();
duke@435 3994
duke@435 3995 // we need the offset of the "value" field which was computed when
duke@435 3996 // inlining the get() method. Give up if we don't have it.
duke@435 3997 if (value_field_offset == -1)
duke@435 3998 return false;
duke@435 3999
duke@435 4000 // Null check without removing any arguments.
duke@435 4001 _sp+=5;
duke@435 4002 obj = do_null_check(obj, T_OBJECT);
duke@435 4003 _sp-=5;
duke@435 4004 // Check for locking null object
duke@435 4005 if (stopped()) return true;
duke@435 4006
duke@435 4007 Node *adr = basic_plus_adr(obj, obj, value_field_offset);
duke@435 4008 const TypePtr *adr_type = _gvn.type(adr)->is_ptr();
duke@435 4009 int alias_idx = C->get_alias_index(adr_type);
duke@435 4010
kvn@855 4011 Node *cas = _gvn.transform(new (C, 5) StoreLConditionalNode(control(), memory(alias_idx), adr, newVal, oldVal));
kvn@855 4012 Node *store_proj = _gvn.transform( new (C, 1) SCMemProjNode(cas));
duke@435 4013 set_memory(store_proj, alias_idx);
kvn@855 4014 Node *bol = _gvn.transform( new (C, 2) BoolNode( cas, BoolTest::eq ) );
kvn@855 4015
kvn@855 4016 Node *result;
kvn@855 4017 // CMove node is not used to be able fold a possible check code
kvn@855 4018 // after attemptUpdate() call. This code could be transformed
kvn@855 4019 // into CMove node by loop optimizations.
kvn@855 4020 {
kvn@855 4021 RegionNode *r = new (C, 3) RegionNode(3);
kvn@855 4022 result = new (C, 3) PhiNode(r, TypeInt::BOOL);
kvn@855 4023
kvn@855 4024 Node *iff = create_and_xform_if(control(), bol, PROB_FAIR, COUNT_UNKNOWN);
kvn@855 4025 Node *iftrue = opt_iff(r, iff);
kvn@855 4026 r->init_req(1, iftrue);
kvn@855 4027 result->init_req(1, intcon(1));
kvn@855 4028 result->init_req(2, intcon(0));
kvn@855 4029
kvn@855 4030 set_control(_gvn.transform(r));
kvn@855 4031 record_for_igvn(r);
kvn@855 4032
kvn@855 4033 C->set_has_split_ifs(true); // Has chance for split-if optimization
kvn@855 4034 }
kvn@855 4035
kvn@855 4036 push(_gvn.transform(result));
duke@435 4037 return true;
duke@435 4038 }
duke@435 4039
duke@435 4040 bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) {
duke@435 4041 // restore the arguments
duke@435 4042 _sp += arg_size();
duke@435 4043
duke@435 4044 switch (id) {
duke@435 4045 case vmIntrinsics::_floatToRawIntBits:
duke@435 4046 push(_gvn.transform( new (C, 2) MoveF2INode(pop())));
duke@435 4047 break;
duke@435 4048
duke@435 4049 case vmIntrinsics::_intBitsToFloat:
duke@435 4050 push(_gvn.transform( new (C, 2) MoveI2FNode(pop())));
duke@435 4051 break;
duke@435 4052
duke@435 4053 case vmIntrinsics::_doubleToRawLongBits:
duke@435 4054 push_pair(_gvn.transform( new (C, 2) MoveD2LNode(pop_pair())));
duke@435 4055 break;
duke@435 4056
duke@435 4057 case vmIntrinsics::_longBitsToDouble:
duke@435 4058 push_pair(_gvn.transform( new (C, 2) MoveL2DNode(pop_pair())));
duke@435 4059 break;
duke@435 4060
duke@435 4061 case vmIntrinsics::_doubleToLongBits: {
duke@435 4062 Node* value = pop_pair();
duke@435 4063
duke@435 4064 // two paths (plus control) merge in a wood
duke@435 4065 RegionNode *r = new (C, 3) RegionNode(3);
duke@435 4066 Node *phi = new (C, 3) PhiNode(r, TypeLong::LONG);
duke@435 4067
duke@435 4068 Node *cmpisnan = _gvn.transform( new (C, 3) CmpDNode(value, value));
duke@435 4069 // Build the boolean node
duke@435 4070 Node *bolisnan = _gvn.transform( new (C, 2) BoolNode( cmpisnan, BoolTest::ne ) );
duke@435 4071
duke@435 4072 // Branch either way.
duke@435 4073 // NaN case is less traveled, which makes all the difference.
duke@435 4074 IfNode *ifisnan = create_and_xform_if(control(), bolisnan, PROB_STATIC_FREQUENT, COUNT_UNKNOWN);
duke@435 4075 Node *opt_isnan = _gvn.transform(ifisnan);
duke@435 4076 assert( opt_isnan->is_If(), "Expect an IfNode");
duke@435 4077 IfNode *opt_ifisnan = (IfNode*)opt_isnan;
duke@435 4078 Node *iftrue = _gvn.transform( new (C, 1) IfTrueNode(opt_ifisnan) );
duke@435 4079
duke@435 4080 set_control(iftrue);
duke@435 4081
duke@435 4082 static const jlong nan_bits = CONST64(0x7ff8000000000000);
duke@435 4083 Node *slow_result = longcon(nan_bits); // return NaN
duke@435 4084 phi->init_req(1, _gvn.transform( slow_result ));
duke@435 4085 r->init_req(1, iftrue);
duke@435 4086
duke@435 4087 // Else fall through
duke@435 4088 Node *iffalse = _gvn.transform( new (C, 1) IfFalseNode(opt_ifisnan) );
duke@435 4089 set_control(iffalse);
duke@435 4090
duke@435 4091 phi->init_req(2, _gvn.transform( new (C, 2) MoveD2LNode(value)));
duke@435 4092 r->init_req(2, iffalse);
duke@435 4093
duke@435 4094 // Post merge
duke@435 4095 set_control(_gvn.transform(r));
duke@435 4096 record_for_igvn(r);
duke@435 4097
duke@435 4098 Node* result = _gvn.transform(phi);
duke@435 4099 assert(result->bottom_type()->isa_long(), "must be");
duke@435 4100 push_pair(result);
duke@435 4101
duke@435 4102 C->set_has_split_ifs(true); // Has chance for split-if optimization
duke@435 4103
duke@435 4104 break;
duke@435 4105 }
duke@435 4106
duke@435 4107 case vmIntrinsics::_floatToIntBits: {
duke@435 4108 Node* value = pop();
duke@435 4109
duke@435 4110 // two paths (plus control) merge in a wood
duke@435 4111 RegionNode *r = new (C, 3) RegionNode(3);
duke@435 4112 Node *phi = new (C, 3) PhiNode(r, TypeInt::INT);
duke@435 4113
duke@435 4114 Node *cmpisnan = _gvn.transform( new (C, 3) CmpFNode(value, value));
duke@435 4115 // Build the boolean node
duke@435 4116 Node *bolisnan = _gvn.transform( new (C, 2) BoolNode( cmpisnan, BoolTest::ne ) );
duke@435 4117
duke@435 4118 // Branch either way.
duke@435 4119 // NaN case is less traveled, which makes all the difference.
duke@435 4120 IfNode *ifisnan = create_and_xform_if(control(), bolisnan, PROB_STATIC_FREQUENT, COUNT_UNKNOWN);
duke@435 4121 Node *opt_isnan = _gvn.transform(ifisnan);
duke@435 4122 assert( opt_isnan->is_If(), "Expect an IfNode");
duke@435 4123 IfNode *opt_ifisnan = (IfNode*)opt_isnan;
duke@435 4124 Node *iftrue = _gvn.transform( new (C, 1) IfTrueNode(opt_ifisnan) );
duke@435 4125
duke@435 4126 set_control(iftrue);
duke@435 4127
duke@435 4128 static const jint nan_bits = 0x7fc00000;
duke@435 4129 Node *slow_result = makecon(TypeInt::make(nan_bits)); // return NaN
duke@435 4130 phi->init_req(1, _gvn.transform( slow_result ));
duke@435 4131 r->init_req(1, iftrue);
duke@435 4132
duke@435 4133 // Else fall through
duke@435 4134 Node *iffalse = _gvn.transform( new (C, 1) IfFalseNode(opt_ifisnan) );
duke@435 4135 set_control(iffalse);
duke@435 4136
duke@435 4137 phi->init_req(2, _gvn.transform( new (C, 2) MoveF2INode(value)));
duke@435 4138 r->init_req(2, iffalse);
duke@435 4139
duke@435 4140 // Post merge
duke@435 4141 set_control(_gvn.transform(r));
duke@435 4142 record_for_igvn(r);
duke@435 4143
duke@435 4144 Node* result = _gvn.transform(phi);
duke@435 4145 assert(result->bottom_type()->isa_int(), "must be");
duke@435 4146 push(result);
duke@435 4147
duke@435 4148 C->set_has_split_ifs(true); // Has chance for split-if optimization
duke@435 4149
duke@435 4150 break;
duke@435 4151 }
duke@435 4152
duke@435 4153 default:
duke@435 4154 ShouldNotReachHere();
duke@435 4155 }
duke@435 4156
duke@435 4157 return true;
duke@435 4158 }
duke@435 4159
duke@435 4160 #ifdef _LP64
duke@435 4161 #define XTOP ,top() /*additional argument*/
duke@435 4162 #else //_LP64
duke@435 4163 #define XTOP /*no additional argument*/
duke@435 4164 #endif //_LP64
duke@435 4165
duke@435 4166 //----------------------inline_unsafe_copyMemory-------------------------
duke@435 4167 bool LibraryCallKit::inline_unsafe_copyMemory() {
duke@435 4168 if (callee()->is_static()) return false; // caller must have the capability!
duke@435 4169 int nargs = 1 + 5 + 3; // 5 args: (src: ptr,off, dst: ptr,off, size)
duke@435 4170 assert(signature()->size() == nargs-1, "copy has 5 arguments");
duke@435 4171 null_check_receiver(callee()); // check then ignore argument(0)
duke@435 4172 if (stopped()) return true;
duke@435 4173
duke@435 4174 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe".
duke@435 4175
duke@435 4176 Node* src_ptr = argument(1);
duke@435 4177 Node* src_off = ConvL2X(argument(2));
duke@435 4178 assert(argument(3)->is_top(), "2nd half of long");
duke@435 4179 Node* dst_ptr = argument(4);
duke@435 4180 Node* dst_off = ConvL2X(argument(5));
duke@435 4181 assert(argument(6)->is_top(), "2nd half of long");
duke@435 4182 Node* size = ConvL2X(argument(7));
duke@435 4183 assert(argument(8)->is_top(), "2nd half of long");
duke@435 4184
duke@435 4185 assert(Unsafe_field_offset_to_byte_offset(11) == 11,
duke@435 4186 "fieldOffset must be byte-scaled");
duke@435 4187
duke@435 4188 Node* src = make_unsafe_address(src_ptr, src_off);
duke@435 4189 Node* dst = make_unsafe_address(dst_ptr, dst_off);
duke@435 4190
duke@435 4191 // Conservatively insert a memory barrier on all memory slices.
duke@435 4192 // Do not let writes of the copy source or destination float below the copy.
duke@435 4193 insert_mem_bar(Op_MemBarCPUOrder);
duke@435 4194
duke@435 4195 // Call it. Note that the length argument is not scaled.
duke@435 4196 make_runtime_call(RC_LEAF|RC_NO_FP,
duke@435 4197 OptoRuntime::fast_arraycopy_Type(),
duke@435 4198 StubRoutines::unsafe_arraycopy(),
duke@435 4199 "unsafe_arraycopy",
duke@435 4200 TypeRawPtr::BOTTOM,
duke@435 4201 src, dst, size XTOP);
duke@435 4202
duke@435 4203 // Do not let reads of the copy destination float above the copy.
duke@435 4204 insert_mem_bar(Op_MemBarCPUOrder);
duke@435 4205
duke@435 4206 return true;
duke@435 4207 }
duke@435 4208
kvn@1268 4209 //------------------------clone_coping-----------------------------------
kvn@1268 4210 // Helper function for inline_native_clone.
kvn@1268 4211 void LibraryCallKit::copy_to_clone(Node* obj, Node* alloc_obj, Node* obj_size, bool is_array, bool card_mark) {
kvn@1268 4212 assert(obj_size != NULL, "");
kvn@1268 4213 Node* raw_obj = alloc_obj->in(1);
kvn@1268 4214 assert(alloc_obj->is_CheckCastPP() && raw_obj->is_Proj() && raw_obj->in(0)->is_Allocate(), "");
kvn@1268 4215
kvn@1268 4216 if (ReduceBulkZeroing) {
kvn@1268 4217 // We will be completely responsible for initializing this object -
kvn@1268 4218 // mark Initialize node as complete.
kvn@1268 4219 AllocateNode* alloc = AllocateNode::Ideal_allocation(alloc_obj, &_gvn);
kvn@1268 4220 // The object was just allocated - there should be no any stores!
kvn@1268 4221 guarantee(alloc != NULL && alloc->maybe_set_complete(&_gvn), "");
kvn@1268 4222 }
kvn@1268 4223
kvn@1268 4224 // Copy the fastest available way.
kvn@1268 4225 // TODO: generate fields copies for small objects instead.
kvn@1268 4226 Node* src = obj;
kvn@1393 4227 Node* dest = alloc_obj;
kvn@1268 4228 Node* size = _gvn.transform(obj_size);
kvn@1268 4229
kvn@1268 4230 // Exclude the header but include array length to copy by 8 bytes words.
kvn@1268 4231 // Can't use base_offset_in_bytes(bt) since basic type is unknown.
kvn@1268 4232 int base_off = is_array ? arrayOopDesc::length_offset_in_bytes() :
kvn@1268 4233 instanceOopDesc::base_offset_in_bytes();
kvn@1268 4234 // base_off:
kvn@1268 4235 // 8 - 32-bit VM
kvn@1268 4236 // 12 - 64-bit VM, compressed oops
kvn@1268 4237 // 16 - 64-bit VM, normal oops
kvn@1268 4238 if (base_off % BytesPerLong != 0) {
kvn@1268 4239 assert(UseCompressedOops, "");
kvn@1268 4240 if (is_array) {
kvn@1268 4241 // Exclude length to copy by 8 bytes words.
kvn@1268 4242 base_off += sizeof(int);
kvn@1268 4243 } else {
kvn@1268 4244 // Include klass to copy by 8 bytes words.
kvn@1268 4245 base_off = instanceOopDesc::klass_offset_in_bytes();
kvn@1268 4246 }
kvn@1268 4247 assert(base_off % BytesPerLong == 0, "expect 8 bytes alignment");
kvn@1268 4248 }
kvn@1268 4249 src = basic_plus_adr(src, base_off);
kvn@1268 4250 dest = basic_plus_adr(dest, base_off);
kvn@1268 4251
kvn@1268 4252 // Compute the length also, if needed:
kvn@1268 4253 Node* countx = size;
kvn@1268 4254 countx = _gvn.transform( new (C, 3) SubXNode(countx, MakeConX(base_off)) );
kvn@1268 4255 countx = _gvn.transform( new (C, 3) URShiftXNode(countx, intcon(LogBytesPerLong) ));
kvn@1268 4256
kvn@1268 4257 const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM;
kvn@1268 4258 bool disjoint_bases = true;
kvn@1268 4259 generate_unchecked_arraycopy(raw_adr_type, T_LONG, disjoint_bases,
iveresov@2606 4260 src, NULL, dest, NULL, countx,
iveresov@2606 4261 /*dest_uninitialized*/true);
kvn@1268 4262
kvn@1268 4263 // If necessary, emit some card marks afterwards. (Non-arrays only.)
kvn@1268 4264 if (card_mark) {
kvn@1268 4265 assert(!is_array, "");
kvn@1268 4266 // Put in store barrier for any and all oops we are sticking
kvn@1268 4267 // into this object. (We could avoid this if we could prove
kvn@1268 4268 // that the object type contains no oop fields at all.)
kvn@1268 4269 Node* no_particular_value = NULL;
kvn@1268 4270 Node* no_particular_field = NULL;
kvn@1268 4271 int raw_adr_idx = Compile::AliasIdxRaw;
kvn@1268 4272 post_barrier(control(),
kvn@1268 4273 memory(raw_adr_type),
kvn@1393 4274 alloc_obj,
kvn@1268 4275 no_particular_field,
kvn@1268 4276 raw_adr_idx,
kvn@1268 4277 no_particular_value,
kvn@1268 4278 T_OBJECT,
kvn@1268 4279 false);
kvn@1268 4280 }
kvn@1268 4281
kvn@1393 4282 // Do not let reads from the cloned object float above the arraycopy.
kvn@1393 4283 insert_mem_bar(Op_MemBarCPUOrder);
kvn@1268 4284 }
duke@435 4285
duke@435 4286 //------------------------inline_native_clone----------------------------
duke@435 4287 // Here are the simple edge cases:
duke@435 4288 // null receiver => normal trap
duke@435 4289 // virtual and clone was overridden => slow path to out-of-line clone
duke@435 4290 // not cloneable or finalizer => slow path to out-of-line Object.clone
duke@435 4291 //
duke@435 4292 // The general case has two steps, allocation and copying.
duke@435 4293 // Allocation has two cases, and uses GraphKit::new_instance or new_array.
duke@435 4294 //
duke@435 4295 // Copying also has two cases, oop arrays and everything else.
duke@435 4296 // Oop arrays use arrayof_oop_arraycopy (same as System.arraycopy).
duke@435 4297 // Everything else uses the tight inline loop supplied by CopyArrayNode.
duke@435 4298 //
duke@435 4299 // These steps fold up nicely if and when the cloned object's klass
duke@435 4300 // can be sharply typed as an object array, a type array, or an instance.
duke@435 4301 //
duke@435 4302 bool LibraryCallKit::inline_native_clone(bool is_virtual) {
duke@435 4303 int nargs = 1;
cfang@1337 4304 PhiNode* result_val;
duke@435 4305
cfang@1335 4306 //set the original stack and the reexecute bit for the interpreter to reexecute
cfang@1335 4307 //the bytecode that invokes Object.clone if deoptimization happens
cfang@1335 4308 { PreserveReexecuteState preexecs(this);
cfang@1337 4309 jvms()->set_should_reexecute(true);
cfang@1337 4310
cfang@1337 4311 //null_check_receiver will adjust _sp (push and pop)
cfang@1337 4312 Node* obj = null_check_receiver(callee());
cfang@1337 4313 if (stopped()) return true;
cfang@1337 4314
cfang@1335 4315 _sp += nargs;
cfang@1337 4316
cfang@1337 4317 Node* obj_klass = load_object_klass(obj);
cfang@1337 4318 const TypeKlassPtr* tklass = _gvn.type(obj_klass)->isa_klassptr();
cfang@1337 4319 const TypeOopPtr* toop = ((tklass != NULL)
cfang@1337 4320 ? tklass->as_instance_type()
cfang@1337 4321 : TypeInstPtr::NOTNULL);
cfang@1337 4322
cfang@1337 4323 // Conservatively insert a memory barrier on all memory slices.
cfang@1337 4324 // Do not let writes into the original float below the clone.
cfang@1337 4325 insert_mem_bar(Op_MemBarCPUOrder);
cfang@1337 4326
cfang@1337 4327 // paths into result_reg:
cfang@1337 4328 enum {
cfang@1337 4329 _slow_path = 1, // out-of-line call to clone method (virtual or not)
cfang@1337 4330 _objArray_path, // plain array allocation, plus arrayof_oop_arraycopy
cfang@1337 4331 _array_path, // plain array allocation, plus arrayof_long_arraycopy
cfang@1337 4332 _instance_path, // plain instance allocation, plus arrayof_long_arraycopy
cfang@1337 4333 PATH_LIMIT
cfang@1337 4334 };
cfang@1337 4335 RegionNode* result_reg = new(C, PATH_LIMIT) RegionNode(PATH_LIMIT);
cfang@1337 4336 result_val = new(C, PATH_LIMIT) PhiNode(result_reg,
cfang@1337 4337 TypeInstPtr::NOTNULL);
cfang@1337 4338 PhiNode* result_i_o = new(C, PATH_LIMIT) PhiNode(result_reg, Type::ABIO);
cfang@1337 4339 PhiNode* result_mem = new(C, PATH_LIMIT) PhiNode(result_reg, Type::MEMORY,
cfang@1337 4340 TypePtr::BOTTOM);
cfang@1337 4341 record_for_igvn(result_reg);
cfang@1337 4342
cfang@1337 4343 const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM;
cfang@1337 4344 int raw_adr_idx = Compile::AliasIdxRaw;
cfang@1337 4345 const bool raw_mem_only = true;
cfang@1337 4346
cfang@1335 4347
cfang@1335 4348 Node* array_ctl = generate_array_guard(obj_klass, (RegionNode*)NULL);
cfang@1335 4349 if (array_ctl != NULL) {
cfang@1335 4350 // It's an array.
cfang@1335 4351 PreserveJVMState pjvms(this);
cfang@1335 4352 set_control(array_ctl);
cfang@1335 4353 Node* obj_length = load_array_length(obj);
cfang@1335 4354 Node* obj_size = NULL;
cfang@1335 4355 Node* alloc_obj = new_array(obj_klass, obj_length, 0,
cfang@1335 4356 raw_mem_only, &obj_size);
cfang@1335 4357
cfang@1335 4358 if (!use_ReduceInitialCardMarks()) {
cfang@1335 4359 // If it is an oop array, it requires very special treatment,
cfang@1335 4360 // because card marking is required on each card of the array.
cfang@1335 4361 Node* is_obja = generate_objArray_guard(obj_klass, (RegionNode*)NULL);
cfang@1335 4362 if (is_obja != NULL) {
cfang@1335 4363 PreserveJVMState pjvms2(this);
cfang@1335 4364 set_control(is_obja);
cfang@1335 4365 // Generate a direct call to the right arraycopy function(s).
cfang@1335 4366 bool disjoint_bases = true;
cfang@1335 4367 bool length_never_negative = true;
cfang@1335 4368 generate_arraycopy(TypeAryPtr::OOPS, T_OBJECT,
cfang@1335 4369 obj, intcon(0), alloc_obj, intcon(0),
cfang@1335 4370 obj_length,
cfang@1335 4371 disjoint_bases, length_never_negative);
cfang@1335 4372 result_reg->init_req(_objArray_path, control());
cfang@1335 4373 result_val->init_req(_objArray_path, alloc_obj);
cfang@1335 4374 result_i_o ->set_req(_objArray_path, i_o());
cfang@1335 4375 result_mem ->set_req(_objArray_path, reset_memory());
cfang@1335 4376 }
cfang@1335 4377 }
cfang@1335 4378 // Otherwise, there are no card marks to worry about.
ysr@1462 4379 // (We can dispense with card marks if we know the allocation
ysr@1462 4380 // comes out of eden (TLAB)... In fact, ReduceInitialCardMarks
ysr@1462 4381 // causes the non-eden paths to take compensating steps to
ysr@1462 4382 // simulate a fresh allocation, so that no further
ysr@1462 4383 // card marks are required in compiled code to initialize
ysr@1462 4384 // the object.)
cfang@1335 4385
cfang@1335 4386 if (!stopped()) {
cfang@1335 4387 copy_to_clone(obj, alloc_obj, obj_size, true, false);
cfang@1335 4388
cfang@1335 4389 // Present the results of the copy.
cfang@1335 4390 result_reg->init_req(_array_path, control());
cfang@1335 4391 result_val->init_req(_array_path, alloc_obj);
cfang@1335 4392 result_i_o ->set_req(_array_path, i_o());
cfang@1335 4393 result_mem ->set_req(_array_path, reset_memory());
duke@435 4394 }
duke@435 4395 }
cfang@1335 4396
cfang@1335 4397 // We only go to the instance fast case code if we pass a number of guards.
cfang@1335 4398 // The paths which do not pass are accumulated in the slow_region.
cfang@1335 4399 RegionNode* slow_region = new (C, 1) RegionNode(1);
cfang@1335 4400 record_for_igvn(slow_region);
kvn@1268 4401 if (!stopped()) {
cfang@1335 4402 // It's an instance (we did array above). Make the slow-path tests.
cfang@1335 4403 // If this is a virtual call, we generate a funny guard. We grab
cfang@1335 4404 // the vtable entry corresponding to clone() from the target object.
cfang@1335 4405 // If the target method which we are calling happens to be the
cfang@1335 4406 // Object clone() method, we pass the guard. We do not need this
cfang@1335 4407 // guard for non-virtual calls; the caller is known to be the native
cfang@1335 4408 // Object clone().
cfang@1335 4409 if (is_virtual) {
cfang@1335 4410 generate_virtual_guard(obj_klass, slow_region);
cfang@1335 4411 }
cfang@1335 4412
cfang@1335 4413 // The object must be cloneable and must not have a finalizer.
cfang@1335 4414 // Both of these conditions may be checked in a single test.
cfang@1335 4415 // We could optimize the cloneable test further, but we don't care.
cfang@1335 4416 generate_access_flags_guard(obj_klass,
cfang@1335 4417 // Test both conditions:
cfang@1335 4418 JVM_ACC_IS_CLONEABLE | JVM_ACC_HAS_FINALIZER,
cfang@1335 4419 // Must be cloneable but not finalizer:
cfang@1335 4420 JVM_ACC_IS_CLONEABLE,
cfang@1335 4421 slow_region);
kvn@1268 4422 }
cfang@1335 4423
cfang@1335 4424 if (!stopped()) {
cfang@1335 4425 // It's an instance, and it passed the slow-path tests.
cfang@1335 4426 PreserveJVMState pjvms(this);
cfang@1335 4427 Node* obj_size = NULL;
cfang@1335 4428 Node* alloc_obj = new_instance(obj_klass, NULL, raw_mem_only, &obj_size);
cfang@1335 4429
cfang@1335 4430 copy_to_clone(obj, alloc_obj, obj_size, false, !use_ReduceInitialCardMarks());
cfang@1335 4431
cfang@1335 4432 // Present the results of the slow call.
cfang@1335 4433 result_reg->init_req(_instance_path, control());
cfang@1335 4434 result_val->init_req(_instance_path, alloc_obj);
cfang@1335 4435 result_i_o ->set_req(_instance_path, i_o());
cfang@1335 4436 result_mem ->set_req(_instance_path, reset_memory());
duke@435 4437 }
duke@435 4438
cfang@1335 4439 // Generate code for the slow case. We make a call to clone().
cfang@1335 4440 set_control(_gvn.transform(slow_region));
cfang@1335 4441 if (!stopped()) {
cfang@1335 4442 PreserveJVMState pjvms(this);
cfang@1335 4443 CallJavaNode* slow_call = generate_method_call(vmIntrinsics::_clone, is_virtual);
cfang@1335 4444 Node* slow_result = set_results_for_java_call(slow_call);
cfang@1335 4445 // this->control() comes from set_results_for_java_call
cfang@1335 4446 result_reg->init_req(_slow_path, control());
cfang@1335 4447 result_val->init_req(_slow_path, slow_result);
cfang@1335 4448 result_i_o ->set_req(_slow_path, i_o());
cfang@1335 4449 result_mem ->set_req(_slow_path, reset_memory());
cfang@1335 4450 }
cfang@1337 4451
cfang@1337 4452 // Return the combined state.
cfang@1337 4453 set_control( _gvn.transform(result_reg) );
cfang@1337 4454 set_i_o( _gvn.transform(result_i_o) );
cfang@1337 4455 set_all_memory( _gvn.transform(result_mem) );
cfang@1335 4456 } //original reexecute and sp are set back here
duke@435 4457
kvn@1268 4458 push(_gvn.transform(result_val));
duke@435 4459
duke@435 4460 return true;
duke@435 4461 }
duke@435 4462
duke@435 4463
duke@435 4464 // constants for computing the copy function
duke@435 4465 enum {
duke@435 4466 COPYFUNC_UNALIGNED = 0,
duke@435 4467 COPYFUNC_ALIGNED = 1, // src, dest aligned to HeapWordSize
duke@435 4468 COPYFUNC_CONJOINT = 0,
duke@435 4469 COPYFUNC_DISJOINT = 2 // src != dest, or transfer can descend
duke@435 4470 };
duke@435 4471
duke@435 4472 // Note: The condition "disjoint" applies also for overlapping copies
duke@435 4473 // where an descending copy is permitted (i.e., dest_offset <= src_offset).
duke@435 4474 static address
iveresov@2606 4475 select_arraycopy_function(BasicType t, bool aligned, bool disjoint, const char* &name, bool dest_uninitialized) {
duke@435 4476 int selector =
duke@435 4477 (aligned ? COPYFUNC_ALIGNED : COPYFUNC_UNALIGNED) +
duke@435 4478 (disjoint ? COPYFUNC_DISJOINT : COPYFUNC_CONJOINT);
duke@435 4479
duke@435 4480 #define RETURN_STUB(xxx_arraycopy) { \
duke@435 4481 name = #xxx_arraycopy; \
duke@435 4482 return StubRoutines::xxx_arraycopy(); }
duke@435 4483
iveresov@2606 4484 #define RETURN_STUB_PARM(xxx_arraycopy, parm) { \
iveresov@2606 4485 name = #xxx_arraycopy; \
iveresov@2606 4486 return StubRoutines::xxx_arraycopy(parm); }
iveresov@2606 4487
duke@435 4488 switch (t) {
duke@435 4489 case T_BYTE:
duke@435 4490 case T_BOOLEAN:
duke@435 4491 switch (selector) {
duke@435 4492 case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jbyte_arraycopy);
duke@435 4493 case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jbyte_arraycopy);
duke@435 4494 case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jbyte_disjoint_arraycopy);
duke@435 4495 case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jbyte_disjoint_arraycopy);
duke@435 4496 }
duke@435 4497 case T_CHAR:
duke@435 4498 case T_SHORT:
duke@435 4499 switch (selector) {
duke@435 4500 case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jshort_arraycopy);
duke@435 4501 case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jshort_arraycopy);
duke@435 4502 case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jshort_disjoint_arraycopy);
duke@435 4503 case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jshort_disjoint_arraycopy);
duke@435 4504 }
duke@435 4505 case T_INT:
duke@435 4506 case T_FLOAT:
duke@435 4507 switch (selector) {
duke@435 4508 case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jint_arraycopy);
duke@435 4509 case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jint_arraycopy);
duke@435 4510 case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jint_disjoint_arraycopy);
duke@435 4511 case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jint_disjoint_arraycopy);
duke@435 4512 }
duke@435 4513 case T_DOUBLE:
duke@435 4514 case T_LONG:
duke@435 4515 switch (selector) {
duke@435 4516 case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jlong_arraycopy);
duke@435 4517 case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jlong_arraycopy);
duke@435 4518 case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jlong_disjoint_arraycopy);
duke@435 4519 case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jlong_disjoint_arraycopy);
duke@435 4520 }
duke@435 4521 case T_ARRAY:
duke@435 4522 case T_OBJECT:
duke@435 4523 switch (selector) {
iveresov@2606 4524 case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED: RETURN_STUB_PARM(oop_arraycopy, dest_uninitialized);
iveresov@2606 4525 case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED: RETURN_STUB_PARM(arrayof_oop_arraycopy, dest_uninitialized);
iveresov@2606 4526 case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED: RETURN_STUB_PARM(oop_disjoint_arraycopy, dest_uninitialized);
iveresov@2606 4527 case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED: RETURN_STUB_PARM(arrayof_oop_disjoint_arraycopy, dest_uninitialized);
duke@435 4528 }
duke@435 4529 default:
duke@435 4530 ShouldNotReachHere();
duke@435 4531 return NULL;
duke@435 4532 }
duke@435 4533
duke@435 4534 #undef RETURN_STUB
iveresov@2606 4535 #undef RETURN_STUB_PARM
duke@435 4536 }
duke@435 4537
duke@435 4538 //------------------------------basictype2arraycopy----------------------------
duke@435 4539 address LibraryCallKit::basictype2arraycopy(BasicType t,
duke@435 4540 Node* src_offset,
duke@435 4541 Node* dest_offset,
duke@435 4542 bool disjoint_bases,
iveresov@2606 4543 const char* &name,
iveresov@2606 4544 bool dest_uninitialized) {
duke@435 4545 const TypeInt* src_offset_inttype = gvn().find_int_type(src_offset);;
duke@435 4546 const TypeInt* dest_offset_inttype = gvn().find_int_type(dest_offset);;
duke@435 4547
duke@435 4548 bool aligned = false;
duke@435 4549 bool disjoint = disjoint_bases;
duke@435 4550
duke@435 4551 // if the offsets are the same, we can treat the memory regions as
duke@435 4552 // disjoint, because either the memory regions are in different arrays,
duke@435 4553 // or they are identical (which we can treat as disjoint.) We can also
duke@435 4554 // treat a copy with a destination index less that the source index
duke@435 4555 // as disjoint since a low->high copy will work correctly in this case.
duke@435 4556 if (src_offset_inttype != NULL && src_offset_inttype->is_con() &&
duke@435 4557 dest_offset_inttype != NULL && dest_offset_inttype->is_con()) {
duke@435 4558 // both indices are constants
duke@435 4559 int s_offs = src_offset_inttype->get_con();
duke@435 4560 int d_offs = dest_offset_inttype->get_con();
kvn@464 4561 int element_size = type2aelembytes(t);
duke@435 4562 aligned = ((arrayOopDesc::base_offset_in_bytes(t) + s_offs * element_size) % HeapWordSize == 0) &&
duke@435 4563 ((arrayOopDesc::base_offset_in_bytes(t) + d_offs * element_size) % HeapWordSize == 0);
duke@435 4564 if (s_offs >= d_offs) disjoint = true;
duke@435 4565 } else if (src_offset == dest_offset && src_offset != NULL) {
duke@435 4566 // This can occur if the offsets are identical non-constants.
duke@435 4567 disjoint = true;
duke@435 4568 }
duke@435 4569
iveresov@2606 4570 return select_arraycopy_function(t, aligned, disjoint, name, dest_uninitialized);
duke@435 4571 }
duke@435 4572
duke@435 4573
duke@435 4574 //------------------------------inline_arraycopy-----------------------
duke@435 4575 bool LibraryCallKit::inline_arraycopy() {
duke@435 4576 // Restore the stack and pop off the arguments.
duke@435 4577 int nargs = 5; // 2 oops, 3 ints, no size_t or long
duke@435 4578 assert(callee()->signature()->size() == nargs, "copy has 5 arguments");
duke@435 4579
duke@435 4580 Node *src = argument(0);
duke@435 4581 Node *src_offset = argument(1);
duke@435 4582 Node *dest = argument(2);
duke@435 4583 Node *dest_offset = argument(3);
duke@435 4584 Node *length = argument(4);
duke@435 4585
duke@435 4586 // Compile time checks. If any of these checks cannot be verified at compile time,
duke@435 4587 // we do not make a fast path for this call. Instead, we let the call remain as it
duke@435 4588 // is. The checks we choose to mandate at compile time are:
duke@435 4589 //
duke@435 4590 // (1) src and dest are arrays.
duke@435 4591 const Type* src_type = src->Value(&_gvn);
duke@435 4592 const Type* dest_type = dest->Value(&_gvn);
duke@435 4593 const TypeAryPtr* top_src = src_type->isa_aryptr();
duke@435 4594 const TypeAryPtr* top_dest = dest_type->isa_aryptr();
duke@435 4595 if (top_src == NULL || top_src->klass() == NULL ||
duke@435 4596 top_dest == NULL || top_dest->klass() == NULL) {
duke@435 4597 // Conservatively insert a memory barrier on all memory slices.
duke@435 4598 // Do not let writes into the source float below the arraycopy.
duke@435 4599 insert_mem_bar(Op_MemBarCPUOrder);
duke@435 4600
duke@435 4601 // Call StubRoutines::generic_arraycopy stub.
duke@435 4602 generate_arraycopy(TypeRawPtr::BOTTOM, T_CONFLICT,
kvn@1268 4603 src, src_offset, dest, dest_offset, length);
duke@435 4604
duke@435 4605 // Do not let reads from the destination float above the arraycopy.
duke@435 4606 // Since we cannot type the arrays, we don't know which slices
duke@435 4607 // might be affected. We could restrict this barrier only to those
duke@435 4608 // memory slices which pertain to array elements--but don't bother.
duke@435 4609 if (!InsertMemBarAfterArraycopy)
duke@435 4610 // (If InsertMemBarAfterArraycopy, there is already one in place.)
duke@435 4611 insert_mem_bar(Op_MemBarCPUOrder);
duke@435 4612 return true;
duke@435 4613 }
duke@435 4614
duke@435 4615 // (2) src and dest arrays must have elements of the same BasicType
duke@435 4616 // Figure out the size and type of the elements we will be copying.
duke@435 4617 BasicType src_elem = top_src->klass()->as_array_klass()->element_type()->basic_type();
duke@435 4618 BasicType dest_elem = top_dest->klass()->as_array_klass()->element_type()->basic_type();
duke@435 4619 if (src_elem == T_ARRAY) src_elem = T_OBJECT;
duke@435 4620 if (dest_elem == T_ARRAY) dest_elem = T_OBJECT;
duke@435 4621
duke@435 4622 if (src_elem != dest_elem || dest_elem == T_VOID) {
duke@435 4623 // The component types are not the same or are not recognized. Punt.
duke@435 4624 // (But, avoid the native method wrapper to JVM_ArrayCopy.)
duke@435 4625 generate_slow_arraycopy(TypePtr::BOTTOM,
iveresov@2606 4626 src, src_offset, dest, dest_offset, length,
iveresov@2606 4627 /*dest_uninitialized*/false);
duke@435 4628 return true;
duke@435 4629 }
duke@435 4630
duke@435 4631 //---------------------------------------------------------------------------
duke@435 4632 // We will make a fast path for this call to arraycopy.
duke@435 4633
duke@435 4634 // We have the following tests left to perform:
duke@435 4635 //
duke@435 4636 // (3) src and dest must not be null.
duke@435 4637 // (4) src_offset must not be negative.
duke@435 4638 // (5) dest_offset must not be negative.
duke@435 4639 // (6) length must not be negative.
duke@435 4640 // (7) src_offset + length must not exceed length of src.
duke@435 4641 // (8) dest_offset + length must not exceed length of dest.
duke@435 4642 // (9) each element of an oop array must be assignable
duke@435 4643
duke@435 4644 RegionNode* slow_region = new (C, 1) RegionNode(1);
duke@435 4645 record_for_igvn(slow_region);
duke@435 4646
duke@435 4647 // (3) operands must not be null
duke@435 4648 // We currently perform our null checks with the do_null_check routine.
duke@435 4649 // This means that the null exceptions will be reported in the caller
duke@435 4650 // rather than (correctly) reported inside of the native arraycopy call.
duke@435 4651 // This should be corrected, given time. We do our null check with the
duke@435 4652 // stack pointer restored.
duke@435 4653 _sp += nargs;
duke@435 4654 src = do_null_check(src, T_ARRAY);
duke@435 4655 dest = do_null_check(dest, T_ARRAY);
duke@435 4656 _sp -= nargs;
duke@435 4657
duke@435 4658 // (4) src_offset must not be negative.
duke@435 4659 generate_negative_guard(src_offset, slow_region);
duke@435 4660
duke@435 4661 // (5) dest_offset must not be negative.
duke@435 4662 generate_negative_guard(dest_offset, slow_region);
duke@435 4663
duke@435 4664 // (6) length must not be negative (moved to generate_arraycopy()).
duke@435 4665 // generate_negative_guard(length, slow_region);
duke@435 4666
duke@435 4667 // (7) src_offset + length must not exceed length of src.
duke@435 4668 generate_limit_guard(src_offset, length,
duke@435 4669 load_array_length(src),
duke@435 4670 slow_region);
duke@435 4671
duke@435 4672 // (8) dest_offset + length must not exceed length of dest.
duke@435 4673 generate_limit_guard(dest_offset, length,
duke@435 4674 load_array_length(dest),
duke@435 4675 slow_region);
duke@435 4676
duke@435 4677 // (9) each element of an oop array must be assignable
duke@435 4678 // The generate_arraycopy subroutine checks this.
duke@435 4679
duke@435 4680 // This is where the memory effects are placed:
duke@435 4681 const TypePtr* adr_type = TypeAryPtr::get_array_body_type(dest_elem);
duke@435 4682 generate_arraycopy(adr_type, dest_elem,
duke@435 4683 src, src_offset, dest, dest_offset, length,
kvn@1268 4684 false, false, slow_region);
duke@435 4685
duke@435 4686 return true;
duke@435 4687 }
duke@435 4688
duke@435 4689 //-----------------------------generate_arraycopy----------------------
duke@435 4690 // Generate an optimized call to arraycopy.
duke@435 4691 // Caller must guard against non-arrays.
duke@435 4692 // Caller must determine a common array basic-type for both arrays.
duke@435 4693 // Caller must validate offsets against array bounds.
duke@435 4694 // The slow_region has already collected guard failure paths
duke@435 4695 // (such as out of bounds length or non-conformable array types).
duke@435 4696 // The generated code has this shape, in general:
duke@435 4697 //
duke@435 4698 // if (length == 0) return // via zero_path
duke@435 4699 // slowval = -1
duke@435 4700 // if (types unknown) {
duke@435 4701 // slowval = call generic copy loop
duke@435 4702 // if (slowval == 0) return // via checked_path
duke@435 4703 // } else if (indexes in bounds) {
duke@435 4704 // if ((is object array) && !(array type check)) {
duke@435 4705 // slowval = call checked copy loop
duke@435 4706 // if (slowval == 0) return // via checked_path
duke@435 4707 // } else {
duke@435 4708 // call bulk copy loop
duke@435 4709 // return // via fast_path
duke@435 4710 // }
duke@435 4711 // }
duke@435 4712 // // adjust params for remaining work:
duke@435 4713 // if (slowval != -1) {
duke@435 4714 // n = -1^slowval; src_offset += n; dest_offset += n; length -= n
duke@435 4715 // }
duke@435 4716 // slow_region:
duke@435 4717 // call slow arraycopy(src, src_offset, dest, dest_offset, length)
duke@435 4718 // return // via slow_call_path
duke@435 4719 //
duke@435 4720 // This routine is used from several intrinsics: System.arraycopy,
duke@435 4721 // Object.clone (the array subcase), and Arrays.copyOf[Range].
duke@435 4722 //
duke@435 4723 void
duke@435 4724 LibraryCallKit::generate_arraycopy(const TypePtr* adr_type,
duke@435 4725 BasicType basic_elem_type,
duke@435 4726 Node* src, Node* src_offset,
duke@435 4727 Node* dest, Node* dest_offset,
duke@435 4728 Node* copy_length,
duke@435 4729 bool disjoint_bases,
duke@435 4730 bool length_never_negative,
duke@435 4731 RegionNode* slow_region) {
duke@435 4732
duke@435 4733 if (slow_region == NULL) {
duke@435 4734 slow_region = new(C,1) RegionNode(1);
duke@435 4735 record_for_igvn(slow_region);
duke@435 4736 }
duke@435 4737
duke@435 4738 Node* original_dest = dest;
duke@435 4739 AllocateArrayNode* alloc = NULL; // used for zeroing, if needed
iveresov@2606 4740 bool dest_uninitialized = false;
duke@435 4741
duke@435 4742 // See if this is the initialization of a newly-allocated array.
duke@435 4743 // If so, we will take responsibility here for initializing it to zero.
duke@435 4744 // (Note: Because tightly_coupled_allocation performs checks on the
duke@435 4745 // out-edges of the dest, we need to avoid making derived pointers
duke@435 4746 // from it until we have checked its uses.)
duke@435 4747 if (ReduceBulkZeroing
duke@435 4748 && !ZeroTLAB // pointless if already zeroed
duke@435 4749 && basic_elem_type != T_CONFLICT // avoid corner case
duke@435 4750 && !_gvn.eqv_uncast(src, dest)
duke@435 4751 && ((alloc = tightly_coupled_allocation(dest, slow_region))
duke@435 4752 != NULL)
kvn@469 4753 && _gvn.find_int_con(alloc->in(AllocateNode::ALength), 1) > 0
duke@435 4754 && alloc->maybe_set_complete(&_gvn)) {
duke@435 4755 // "You break it, you buy it."
duke@435 4756 InitializeNode* init = alloc->initialization();
duke@435 4757 assert(init->is_complete(), "we just did this");
kvn@1268 4758 assert(dest->is_CheckCastPP(), "sanity");
duke@435 4759 assert(dest->in(0)->in(0) == init, "dest pinned");
duke@435 4760 adr_type = TypeRawPtr::BOTTOM; // all initializations are into raw memory
duke@435 4761 // From this point on, every exit path is responsible for
duke@435 4762 // initializing any non-copied parts of the object to zero.
iveresov@2606 4763 // Also, if this flag is set we make sure that arraycopy interacts properly
iveresov@2606 4764 // with G1, eliding pre-barriers. See CR 6627983.
iveresov@2606 4765 dest_uninitialized = true;
duke@435 4766 } else {
duke@435 4767 // No zeroing elimination here.
duke@435 4768 alloc = NULL;
duke@435 4769 //original_dest = dest;
iveresov@2606 4770 //dest_uninitialized = false;
duke@435 4771 }
duke@435 4772
duke@435 4773 // Results are placed here:
duke@435 4774 enum { fast_path = 1, // normal void-returning assembly stub
duke@435 4775 checked_path = 2, // special assembly stub with cleanup
duke@435 4776 slow_call_path = 3, // something went wrong; call the VM
duke@435 4777 zero_path = 4, // bypass when length of copy is zero
duke@435 4778 bcopy_path = 5, // copy primitive array by 64-bit blocks
duke@435 4779 PATH_LIMIT = 6
duke@435 4780 };
duke@435 4781 RegionNode* result_region = new(C, PATH_LIMIT) RegionNode(PATH_LIMIT);
duke@435 4782 PhiNode* result_i_o = new(C, PATH_LIMIT) PhiNode(result_region, Type::ABIO);
duke@435 4783 PhiNode* result_memory = new(C, PATH_LIMIT) PhiNode(result_region, Type::MEMORY, adr_type);
duke@435 4784 record_for_igvn(result_region);
duke@435 4785 _gvn.set_type_bottom(result_i_o);
duke@435 4786 _gvn.set_type_bottom(result_memory);
duke@435 4787 assert(adr_type != TypePtr::BOTTOM, "must be RawMem or a T[] slice");
duke@435 4788
duke@435 4789 // The slow_control path:
duke@435 4790 Node* slow_control;
duke@435 4791 Node* slow_i_o = i_o();
duke@435 4792 Node* slow_mem = memory(adr_type);
duke@435 4793 debug_only(slow_control = (Node*) badAddress);
duke@435 4794
duke@435 4795 // Checked control path:
duke@435 4796 Node* checked_control = top();
duke@435 4797 Node* checked_mem = NULL;
duke@435 4798 Node* checked_i_o = NULL;
duke@435 4799 Node* checked_value = NULL;
duke@435 4800
duke@435 4801 if (basic_elem_type == T_CONFLICT) {
iveresov@2606 4802 assert(!dest_uninitialized, "");
duke@435 4803 Node* cv = generate_generic_arraycopy(adr_type,
duke@435 4804 src, src_offset, dest, dest_offset,
iveresov@2606 4805 copy_length, dest_uninitialized);
duke@435 4806 if (cv == NULL) cv = intcon(-1); // failure (no stub available)
duke@435 4807 checked_control = control();
duke@435 4808 checked_i_o = i_o();
duke@435 4809 checked_mem = memory(adr_type);
duke@435 4810 checked_value = cv;
duke@435 4811 set_control(top()); // no fast path
duke@435 4812 }
duke@435 4813
duke@435 4814 Node* not_pos = generate_nonpositive_guard(copy_length, length_never_negative);
duke@435 4815 if (not_pos != NULL) {
duke@435 4816 PreserveJVMState pjvms(this);
duke@435 4817 set_control(not_pos);
duke@435 4818
duke@435 4819 // (6) length must not be negative.
duke@435 4820 if (!length_never_negative) {
duke@435 4821 generate_negative_guard(copy_length, slow_region);
duke@435 4822 }
duke@435 4823
kvn@1271 4824 // copy_length is 0.
iveresov@2606 4825 if (!stopped() && dest_uninitialized) {
duke@435 4826 Node* dest_length = alloc->in(AllocateNode::ALength);
duke@435 4827 if (_gvn.eqv_uncast(copy_length, dest_length)
duke@435 4828 || _gvn.find_int_con(dest_length, 1) <= 0) {
kvn@1271 4829 // There is no zeroing to do. No need for a secondary raw memory barrier.
duke@435 4830 } else {
duke@435 4831 // Clear the whole thing since there are no source elements to copy.
duke@435 4832 generate_clear_array(adr_type, dest, basic_elem_type,
duke@435 4833 intcon(0), NULL,
duke@435 4834 alloc->in(AllocateNode::AllocSize));
kvn@1271 4835 // Use a secondary InitializeNode as raw memory barrier.
kvn@1271 4836 // Currently it is needed only on this path since other
kvn@1271 4837 // paths have stub or runtime calls as raw memory barriers.
kvn@1271 4838 InitializeNode* init = insert_mem_bar_volatile(Op_Initialize,
kvn@1271 4839 Compile::AliasIdxRaw,
kvn@1271 4840 top())->as_Initialize();
kvn@1271 4841 init->set_complete(&_gvn); // (there is no corresponding AllocateNode)
duke@435 4842 }
duke@435 4843 }
duke@435 4844
duke@435 4845 // Present the results of the fast call.
duke@435 4846 result_region->init_req(zero_path, control());
duke@435 4847 result_i_o ->init_req(zero_path, i_o());
duke@435 4848 result_memory->init_req(zero_path, memory(adr_type));
duke@435 4849 }
duke@435 4850
iveresov@2606 4851 if (!stopped() && dest_uninitialized) {
duke@435 4852 // We have to initialize the *uncopied* part of the array to zero.
duke@435 4853 // The copy destination is the slice dest[off..off+len]. The other slices
duke@435 4854 // are dest_head = dest[0..off] and dest_tail = dest[off+len..dest.length].
duke@435 4855 Node* dest_size = alloc->in(AllocateNode::AllocSize);
duke@435 4856 Node* dest_length = alloc->in(AllocateNode::ALength);
duke@435 4857 Node* dest_tail = _gvn.transform( new(C,3) AddINode(dest_offset,
duke@435 4858 copy_length) );
duke@435 4859
duke@435 4860 // If there is a head section that needs zeroing, do it now.
duke@435 4861 if (find_int_con(dest_offset, -1) != 0) {
duke@435 4862 generate_clear_array(adr_type, dest, basic_elem_type,
duke@435 4863 intcon(0), dest_offset,
duke@435 4864 NULL);
duke@435 4865 }
duke@435 4866
duke@435 4867 // Next, perform a dynamic check on the tail length.
duke@435 4868 // It is often zero, and we can win big if we prove this.
duke@435 4869 // There are two wins: Avoid generating the ClearArray
duke@435 4870 // with its attendant messy index arithmetic, and upgrade
duke@435 4871 // the copy to a more hardware-friendly word size of 64 bits.
duke@435 4872 Node* tail_ctl = NULL;
duke@435 4873 if (!stopped() && !_gvn.eqv_uncast(dest_tail, dest_length)) {
duke@435 4874 Node* cmp_lt = _gvn.transform( new(C,3) CmpINode(dest_tail, dest_length) );
duke@435 4875 Node* bol_lt = _gvn.transform( new(C,2) BoolNode(cmp_lt, BoolTest::lt) );
duke@435 4876 tail_ctl = generate_slow_guard(bol_lt, NULL);
duke@435 4877 assert(tail_ctl != NULL || !stopped(), "must be an outcome");
duke@435 4878 }
duke@435 4879
duke@435 4880 // At this point, let's assume there is no tail.
duke@435 4881 if (!stopped() && alloc != NULL && basic_elem_type != T_OBJECT) {
duke@435 4882 // There is no tail. Try an upgrade to a 64-bit copy.
duke@435 4883 bool didit = false;
duke@435 4884 { PreserveJVMState pjvms(this);
duke@435 4885 didit = generate_block_arraycopy(adr_type, basic_elem_type, alloc,
duke@435 4886 src, src_offset, dest, dest_offset,
iveresov@2606 4887 dest_size, dest_uninitialized);
duke@435 4888 if (didit) {
duke@435 4889 // Present the results of the block-copying fast call.
duke@435 4890 result_region->init_req(bcopy_path, control());
duke@435 4891 result_i_o ->init_req(bcopy_path, i_o());
duke@435 4892 result_memory->init_req(bcopy_path, memory(adr_type));
duke@435 4893 }
duke@435 4894 }
duke@435 4895 if (didit)
duke@435 4896 set_control(top()); // no regular fast path
duke@435 4897 }
duke@435 4898
duke@435 4899 // Clear the tail, if any.
duke@435 4900 if (tail_ctl != NULL) {
duke@435 4901 Node* notail_ctl = stopped() ? NULL : control();
duke@435 4902 set_control(tail_ctl);
duke@435 4903 if (notail_ctl == NULL) {
duke@435 4904 generate_clear_array(adr_type, dest, basic_elem_type,
duke@435 4905 dest_tail, NULL,
duke@435 4906 dest_size);
duke@435 4907 } else {
duke@435 4908 // Make a local merge.
duke@435 4909 Node* done_ctl = new(C,3) RegionNode(3);
duke@435 4910 Node* done_mem = new(C,3) PhiNode(done_ctl, Type::MEMORY, adr_type);
duke@435 4911 done_ctl->init_req(1, notail_ctl);
duke@435 4912 done_mem->init_req(1, memory(adr_type));
duke@435 4913 generate_clear_array(adr_type, dest, basic_elem_type,
duke@435 4914 dest_tail, NULL,
duke@435 4915 dest_size);
duke@435 4916 done_ctl->init_req(2, control());
duke@435 4917 done_mem->init_req(2, memory(adr_type));
duke@435 4918 set_control( _gvn.transform(done_ctl) );
duke@435 4919 set_memory( _gvn.transform(done_mem), adr_type );
duke@435 4920 }
duke@435 4921 }
duke@435 4922 }
duke@435 4923
duke@435 4924 BasicType copy_type = basic_elem_type;
duke@435 4925 assert(basic_elem_type != T_ARRAY, "caller must fix this");
duke@435 4926 if (!stopped() && copy_type == T_OBJECT) {
duke@435 4927 // If src and dest have compatible element types, we can copy bits.
duke@435 4928 // Types S[] and D[] are compatible if D is a supertype of S.
duke@435 4929 //
duke@435 4930 // If they are not, we will use checked_oop_disjoint_arraycopy,
duke@435 4931 // which performs a fast optimistic per-oop check, and backs off
duke@435 4932 // further to JVM_ArrayCopy on the first per-oop check that fails.
duke@435 4933 // (Actually, we don't move raw bits only; the GC requires card marks.)
duke@435 4934
duke@435 4935 // Get the klassOop for both src and dest
duke@435 4936 Node* src_klass = load_object_klass(src);
duke@435 4937 Node* dest_klass = load_object_klass(dest);
duke@435 4938
duke@435 4939 // Generate the subtype check.
duke@435 4940 // This might fold up statically, or then again it might not.
duke@435 4941 //
duke@435 4942 // Non-static example: Copying List<String>.elements to a new String[].
duke@435 4943 // The backing store for a List<String> is always an Object[],
duke@435 4944 // but its elements are always type String, if the generic types
duke@435 4945 // are correct at the source level.
duke@435 4946 //
duke@435 4947 // Test S[] against D[], not S against D, because (probably)
duke@435 4948 // the secondary supertype cache is less busy for S[] than S.
duke@435 4949 // This usually only matters when D is an interface.
duke@435 4950 Node* not_subtype_ctrl = gen_subtype_check(src_klass, dest_klass);
duke@435 4951 // Plug failing path into checked_oop_disjoint_arraycopy
duke@435 4952 if (not_subtype_ctrl != top()) {
duke@435 4953 PreserveJVMState pjvms(this);
duke@435 4954 set_control(not_subtype_ctrl);
duke@435 4955 // (At this point we can assume disjoint_bases, since types differ.)
duke@435 4956 int ek_offset = objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc);
duke@435 4957 Node* p1 = basic_plus_adr(dest_klass, ek_offset);
kvn@599 4958 Node* n1 = LoadKlassNode::make(_gvn, immutable_memory(), p1, TypeRawPtr::BOTTOM);
duke@435 4959 Node* dest_elem_klass = _gvn.transform(n1);
duke@435 4960 Node* cv = generate_checkcast_arraycopy(adr_type,
duke@435 4961 dest_elem_klass,
duke@435 4962 src, src_offset, dest, dest_offset,
iveresov@2606 4963 ConvI2X(copy_length), dest_uninitialized);
duke@435 4964 if (cv == NULL) cv = intcon(-1); // failure (no stub available)
duke@435 4965 checked_control = control();
duke@435 4966 checked_i_o = i_o();
duke@435 4967 checked_mem = memory(adr_type);
duke@435 4968 checked_value = cv;
duke@435 4969 }
duke@435 4970 // At this point we know we do not need type checks on oop stores.
duke@435 4971
duke@435 4972 // Let's see if we need card marks:
duke@435 4973 if (alloc != NULL && use_ReduceInitialCardMarks()) {
duke@435 4974 // If we do not need card marks, copy using the jint or jlong stub.
coleenp@548 4975 copy_type = LP64_ONLY(UseCompressedOops ? T_INT : T_LONG) NOT_LP64(T_INT);
kvn@464 4976 assert(type2aelembytes(basic_elem_type) == type2aelembytes(copy_type),
duke@435 4977 "sizes agree");
duke@435 4978 }
duke@435 4979 }
duke@435 4980
duke@435 4981 if (!stopped()) {
duke@435 4982 // Generate the fast path, if possible.
duke@435 4983 PreserveJVMState pjvms(this);
duke@435 4984 generate_unchecked_arraycopy(adr_type, copy_type, disjoint_bases,
duke@435 4985 src, src_offset, dest, dest_offset,
iveresov@2606 4986 ConvI2X(copy_length), dest_uninitialized);
duke@435 4987
duke@435 4988 // Present the results of the fast call.
duke@435 4989 result_region->init_req(fast_path, control());
duke@435 4990 result_i_o ->init_req(fast_path, i_o());
duke@435 4991 result_memory->init_req(fast_path, memory(adr_type));
duke@435 4992 }
duke@435 4993
duke@435 4994 // Here are all the slow paths up to this point, in one bundle:
duke@435 4995 slow_control = top();
duke@435 4996 if (slow_region != NULL)
duke@435 4997 slow_control = _gvn.transform(slow_region);
duke@435 4998 debug_only(slow_region = (RegionNode*)badAddress);
duke@435 4999
duke@435 5000 set_control(checked_control);
duke@435 5001 if (!stopped()) {
duke@435 5002 // Clean up after the checked call.
duke@435 5003 // The returned value is either 0 or -1^K,
duke@435 5004 // where K = number of partially transferred array elements.
duke@435 5005 Node* cmp = _gvn.transform( new(C, 3) CmpINode(checked_value, intcon(0)) );
duke@435 5006 Node* bol = _gvn.transform( new(C, 2) BoolNode(cmp, BoolTest::eq) );
duke@435 5007 IfNode* iff = create_and_map_if(control(), bol, PROB_MAX, COUNT_UNKNOWN);
duke@435 5008
duke@435 5009 // If it is 0, we are done, so transfer to the end.
duke@435 5010 Node* checks_done = _gvn.transform( new(C, 1) IfTrueNode(iff) );
duke@435 5011 result_region->init_req(checked_path, checks_done);
duke@435 5012 result_i_o ->init_req(checked_path, checked_i_o);
duke@435 5013 result_memory->init_req(checked_path, checked_mem);
duke@435 5014
duke@435 5015 // If it is not zero, merge into the slow call.
duke@435 5016 set_control( _gvn.transform( new(C, 1) IfFalseNode(iff) ));
duke@435 5017 RegionNode* slow_reg2 = new(C, 3) RegionNode(3);
duke@435 5018 PhiNode* slow_i_o2 = new(C, 3) PhiNode(slow_reg2, Type::ABIO);
duke@435 5019 PhiNode* slow_mem2 = new(C, 3) PhiNode(slow_reg2, Type::MEMORY, adr_type);
duke@435 5020 record_for_igvn(slow_reg2);
duke@435 5021 slow_reg2 ->init_req(1, slow_control);
duke@435 5022 slow_i_o2 ->init_req(1, slow_i_o);
duke@435 5023 slow_mem2 ->init_req(1, slow_mem);
duke@435 5024 slow_reg2 ->init_req(2, control());
kvn@1268 5025 slow_i_o2 ->init_req(2, checked_i_o);
kvn@1268 5026 slow_mem2 ->init_req(2, checked_mem);
duke@435 5027
duke@435 5028 slow_control = _gvn.transform(slow_reg2);
duke@435 5029 slow_i_o = _gvn.transform(slow_i_o2);
duke@435 5030 slow_mem = _gvn.transform(slow_mem2);
duke@435 5031
duke@435 5032 if (alloc != NULL) {
duke@435 5033 // We'll restart from the very beginning, after zeroing the whole thing.
duke@435 5034 // This can cause double writes, but that's OK since dest is brand new.
duke@435 5035 // So we ignore the low 31 bits of the value returned from the stub.
duke@435 5036 } else {
duke@435 5037 // We must continue the copy exactly where it failed, or else
duke@435 5038 // another thread might see the wrong number of writes to dest.
duke@435 5039 Node* checked_offset = _gvn.transform( new(C, 3) XorINode(checked_value, intcon(-1)) );
duke@435 5040 Node* slow_offset = new(C, 3) PhiNode(slow_reg2, TypeInt::INT);
duke@435 5041 slow_offset->init_req(1, intcon(0));
duke@435 5042 slow_offset->init_req(2, checked_offset);
duke@435 5043 slow_offset = _gvn.transform(slow_offset);
duke@435 5044
duke@435 5045 // Adjust the arguments by the conditionally incoming offset.
duke@435 5046 Node* src_off_plus = _gvn.transform( new(C, 3) AddINode(src_offset, slow_offset) );
duke@435 5047 Node* dest_off_plus = _gvn.transform( new(C, 3) AddINode(dest_offset, slow_offset) );
duke@435 5048 Node* length_minus = _gvn.transform( new(C, 3) SubINode(copy_length, slow_offset) );
duke@435 5049
duke@435 5050 // Tweak the node variables to adjust the code produced below:
duke@435 5051 src_offset = src_off_plus;
duke@435 5052 dest_offset = dest_off_plus;
duke@435 5053 copy_length = length_minus;
duke@435 5054 }
duke@435 5055 }
duke@435 5056
duke@435 5057 set_control(slow_control);
duke@435 5058 if (!stopped()) {
duke@435 5059 // Generate the slow path, if needed.
duke@435 5060 PreserveJVMState pjvms(this); // replace_in_map may trash the map
duke@435 5061
duke@435 5062 set_memory(slow_mem, adr_type);
duke@435 5063 set_i_o(slow_i_o);
duke@435 5064
iveresov@2606 5065 if (dest_uninitialized) {
duke@435 5066 generate_clear_array(adr_type, dest, basic_elem_type,
duke@435 5067 intcon(0), NULL,
duke@435 5068 alloc->in(AllocateNode::AllocSize));
duke@435 5069 }
duke@435 5070
duke@435 5071 generate_slow_arraycopy(adr_type,
duke@435 5072 src, src_offset, dest, dest_offset,
iveresov@2606 5073 copy_length, /*dest_uninitialized*/false);
duke@435 5074
duke@435 5075 result_region->init_req(slow_call_path, control());
duke@435 5076 result_i_o ->init_req(slow_call_path, i_o());
duke@435 5077 result_memory->init_req(slow_call_path, memory(adr_type));
duke@435 5078 }
duke@435 5079
duke@435 5080 // Remove unused edges.
duke@435 5081 for (uint i = 1; i < result_region->req(); i++) {
duke@435 5082 if (result_region->in(i) == NULL)
duke@435 5083 result_region->init_req(i, top());
duke@435 5084 }
duke@435 5085
duke@435 5086 // Finished; return the combined state.
duke@435 5087 set_control( _gvn.transform(result_region) );
duke@435 5088 set_i_o( _gvn.transform(result_i_o) );
duke@435 5089 set_memory( _gvn.transform(result_memory), adr_type );
duke@435 5090
duke@435 5091 // The memory edges above are precise in order to model effects around
twisti@1040 5092 // array copies accurately to allow value numbering of field loads around
duke@435 5093 // arraycopy. Such field loads, both before and after, are common in Java
duke@435 5094 // collections and similar classes involving header/array data structures.
duke@435 5095 //
duke@435 5096 // But with low number of register or when some registers are used or killed
duke@435 5097 // by arraycopy calls it causes registers spilling on stack. See 6544710.
duke@435 5098 // The next memory barrier is added to avoid it. If the arraycopy can be
duke@435 5099 // optimized away (which it can, sometimes) then we can manually remove
duke@435 5100 // the membar also.
kvn@1393 5101 //
kvn@1393 5102 // Do not let reads from the cloned object float above the arraycopy.
kvn@1393 5103 if (InsertMemBarAfterArraycopy || alloc != NULL)
duke@435 5104 insert_mem_bar(Op_MemBarCPUOrder);
duke@435 5105 }
duke@435 5106
duke@435 5107
duke@435 5108 // Helper function which determines if an arraycopy immediately follows
duke@435 5109 // an allocation, with no intervening tests or other escapes for the object.
duke@435 5110 AllocateArrayNode*
duke@435 5111 LibraryCallKit::tightly_coupled_allocation(Node* ptr,
duke@435 5112 RegionNode* slow_region) {
duke@435 5113 if (stopped()) return NULL; // no fast path
duke@435 5114 if (C->AliasLevel() == 0) return NULL; // no MergeMems around
duke@435 5115
duke@435 5116 AllocateArrayNode* alloc = AllocateArrayNode::Ideal_array_allocation(ptr, &_gvn);
duke@435 5117 if (alloc == NULL) return NULL;
duke@435 5118
duke@435 5119 Node* rawmem = memory(Compile::AliasIdxRaw);
duke@435 5120 // Is the allocation's memory state untouched?
duke@435 5121 if (!(rawmem->is_Proj() && rawmem->in(0)->is_Initialize())) {
duke@435 5122 // Bail out if there have been raw-memory effects since the allocation.
duke@435 5123 // (Example: There might have been a call or safepoint.)
duke@435 5124 return NULL;
duke@435 5125 }
duke@435 5126 rawmem = rawmem->in(0)->as_Initialize()->memory(Compile::AliasIdxRaw);
duke@435 5127 if (!(rawmem->is_Proj() && rawmem->in(0) == alloc)) {
duke@435 5128 return NULL;
duke@435 5129 }
duke@435 5130
duke@435 5131 // There must be no unexpected observers of this allocation.
duke@435 5132 for (DUIterator_Fast imax, i = ptr->fast_outs(imax); i < imax; i++) {
duke@435 5133 Node* obs = ptr->fast_out(i);
duke@435 5134 if (obs != this->map()) {
duke@435 5135 return NULL;
duke@435 5136 }
duke@435 5137 }
duke@435 5138
duke@435 5139 // This arraycopy must unconditionally follow the allocation of the ptr.
duke@435 5140 Node* alloc_ctl = ptr->in(0);
duke@435 5141 assert(just_allocated_object(alloc_ctl) == ptr, "most recent allo");
duke@435 5142
duke@435 5143 Node* ctl = control();
duke@435 5144 while (ctl != alloc_ctl) {
duke@435 5145 // There may be guards which feed into the slow_region.
duke@435 5146 // Any other control flow means that we might not get a chance
duke@435 5147 // to finish initializing the allocated object.
duke@435 5148 if ((ctl->is_IfFalse() || ctl->is_IfTrue()) && ctl->in(0)->is_If()) {
duke@435 5149 IfNode* iff = ctl->in(0)->as_If();
duke@435 5150 Node* not_ctl = iff->proj_out(1 - ctl->as_Proj()->_con);
duke@435 5151 assert(not_ctl != NULL && not_ctl != ctl, "found alternate");
duke@435 5152 if (slow_region != NULL && slow_region->find_edge(not_ctl) >= 1) {
duke@435 5153 ctl = iff->in(0); // This test feeds the known slow_region.
duke@435 5154 continue;
duke@435 5155 }
duke@435 5156 // One more try: Various low-level checks bottom out in
duke@435 5157 // uncommon traps. If the debug-info of the trap omits
duke@435 5158 // any reference to the allocation, as we've already
duke@435 5159 // observed, then there can be no objection to the trap.
duke@435 5160 bool found_trap = false;
duke@435 5161 for (DUIterator_Fast jmax, j = not_ctl->fast_outs(jmax); j < jmax; j++) {
duke@435 5162 Node* obs = not_ctl->fast_out(j);
duke@435 5163 if (obs->in(0) == not_ctl && obs->is_Call() &&
twisti@2103 5164 (obs->as_Call()->entry_point() == SharedRuntime::uncommon_trap_blob()->entry_point())) {
duke@435 5165 found_trap = true; break;
duke@435 5166 }
duke@435 5167 }
duke@435 5168 if (found_trap) {
duke@435 5169 ctl = iff->in(0); // This test feeds a harmless uncommon trap.
duke@435 5170 continue;
duke@435 5171 }
duke@435 5172 }
duke@435 5173 return NULL;
duke@435 5174 }
duke@435 5175
duke@435 5176 // If we get this far, we have an allocation which immediately
duke@435 5177 // precedes the arraycopy, and we can take over zeroing the new object.
duke@435 5178 // The arraycopy will finish the initialization, and provide
duke@435 5179 // a new control state to which we will anchor the destination pointer.
duke@435 5180
duke@435 5181 return alloc;
duke@435 5182 }
duke@435 5183
duke@435 5184 // Helper for initialization of arrays, creating a ClearArray.
duke@435 5185 // It writes zero bits in [start..end), within the body of an array object.
duke@435 5186 // The memory effects are all chained onto the 'adr_type' alias category.
duke@435 5187 //
duke@435 5188 // Since the object is otherwise uninitialized, we are free
duke@435 5189 // to put a little "slop" around the edges of the cleared area,
duke@435 5190 // as long as it does not go back into the array's header,
duke@435 5191 // or beyond the array end within the heap.
duke@435 5192 //
duke@435 5193 // The lower edge can be rounded down to the nearest jint and the
duke@435 5194 // upper edge can be rounded up to the nearest MinObjAlignmentInBytes.
duke@435 5195 //
duke@435 5196 // Arguments:
duke@435 5197 // adr_type memory slice where writes are generated
duke@435 5198 // dest oop of the destination array
duke@435 5199 // basic_elem_type element type of the destination
duke@435 5200 // slice_idx array index of first element to store
duke@435 5201 // slice_len number of elements to store (or NULL)
duke@435 5202 // dest_size total size in bytes of the array object
duke@435 5203 //
duke@435 5204 // Exactly one of slice_len or dest_size must be non-NULL.
duke@435 5205 // If dest_size is non-NULL, zeroing extends to the end of the object.
duke@435 5206 // If slice_len is non-NULL, the slice_idx value must be a constant.
duke@435 5207 void
duke@435 5208 LibraryCallKit::generate_clear_array(const TypePtr* adr_type,
duke@435 5209 Node* dest,
duke@435 5210 BasicType basic_elem_type,
duke@435 5211 Node* slice_idx,
duke@435 5212 Node* slice_len,
duke@435 5213 Node* dest_size) {
duke@435 5214 // one or the other but not both of slice_len and dest_size:
duke@435 5215 assert((slice_len != NULL? 1: 0) + (dest_size != NULL? 1: 0) == 1, "");
duke@435 5216 if (slice_len == NULL) slice_len = top();
duke@435 5217 if (dest_size == NULL) dest_size = top();
duke@435 5218
duke@435 5219 // operate on this memory slice:
duke@435 5220 Node* mem = memory(adr_type); // memory slice to operate on
duke@435 5221
duke@435 5222 // scaling and rounding of indexes:
kvn@464 5223 int scale = exact_log2(type2aelembytes(basic_elem_type));
duke@435 5224 int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type);
duke@435 5225 int clear_low = (-1 << scale) & (BytesPerInt - 1);
duke@435 5226 int bump_bit = (-1 << scale) & BytesPerInt;
duke@435 5227
duke@435 5228 // determine constant starts and ends
duke@435 5229 const intptr_t BIG_NEG = -128;
duke@435 5230 assert(BIG_NEG + 2*abase < 0, "neg enough");
duke@435 5231 intptr_t slice_idx_con = (intptr_t) find_int_con(slice_idx, BIG_NEG);
duke@435 5232 intptr_t slice_len_con = (intptr_t) find_int_con(slice_len, BIG_NEG);
duke@435 5233 if (slice_len_con == 0) {
duke@435 5234 return; // nothing to do here
duke@435 5235 }
duke@435 5236 intptr_t start_con = (abase + (slice_idx_con << scale)) & ~clear_low;
duke@435 5237 intptr_t end_con = find_intptr_t_con(dest_size, -1);
duke@435 5238 if (slice_idx_con >= 0 && slice_len_con >= 0) {
duke@435 5239 assert(end_con < 0, "not two cons");
duke@435 5240 end_con = round_to(abase + ((slice_idx_con + slice_len_con) << scale),
duke@435 5241 BytesPerLong);
duke@435 5242 }
duke@435 5243
duke@435 5244 if (start_con >= 0 && end_con >= 0) {
duke@435 5245 // Constant start and end. Simple.
duke@435 5246 mem = ClearArrayNode::clear_memory(control(), mem, dest,
duke@435 5247 start_con, end_con, &_gvn);
duke@435 5248 } else if (start_con >= 0 && dest_size != top()) {
duke@435 5249 // Constant start, pre-rounded end after the tail of the array.
duke@435 5250 Node* end = dest_size;
duke@435 5251 mem = ClearArrayNode::clear_memory(control(), mem, dest,
duke@435 5252 start_con, end, &_gvn);
duke@435 5253 } else if (start_con >= 0 && slice_len != top()) {
duke@435 5254 // Constant start, non-constant end. End needs rounding up.
duke@435 5255 // End offset = round_up(abase + ((slice_idx_con + slice_len) << scale), 8)
duke@435 5256 intptr_t end_base = abase + (slice_idx_con << scale);
duke@435 5257 int end_round = (-1 << scale) & (BytesPerLong - 1);
duke@435 5258 Node* end = ConvI2X(slice_len);
duke@435 5259 if (scale != 0)
duke@435 5260 end = _gvn.transform( new(C,3) LShiftXNode(end, intcon(scale) ));
duke@435 5261 end_base += end_round;
duke@435 5262 end = _gvn.transform( new(C,3) AddXNode(end, MakeConX(end_base)) );
duke@435 5263 end = _gvn.transform( new(C,3) AndXNode(end, MakeConX(~end_round)) );
duke@435 5264 mem = ClearArrayNode::clear_memory(control(), mem, dest,
duke@435 5265 start_con, end, &_gvn);
duke@435 5266 } else if (start_con < 0 && dest_size != top()) {
duke@435 5267 // Non-constant start, pre-rounded end after the tail of the array.
duke@435 5268 // This is almost certainly a "round-to-end" operation.
duke@435 5269 Node* start = slice_idx;
duke@435 5270 start = ConvI2X(start);
duke@435 5271 if (scale != 0)
duke@435 5272 start = _gvn.transform( new(C,3) LShiftXNode( start, intcon(scale) ));
duke@435 5273 start = _gvn.transform( new(C,3) AddXNode(start, MakeConX(abase)) );
duke@435 5274 if ((bump_bit | clear_low) != 0) {
duke@435 5275 int to_clear = (bump_bit | clear_low);
duke@435 5276 // Align up mod 8, then store a jint zero unconditionally
duke@435 5277 // just before the mod-8 boundary.
coleenp@548 5278 if (((abase + bump_bit) & ~to_clear) - bump_bit
coleenp@548 5279 < arrayOopDesc::length_offset_in_bytes() + BytesPerInt) {
coleenp@548 5280 bump_bit = 0;
coleenp@548 5281 assert((abase & to_clear) == 0, "array base must be long-aligned");
coleenp@548 5282 } else {
coleenp@548 5283 // Bump 'start' up to (or past) the next jint boundary:
coleenp@548 5284 start = _gvn.transform( new(C,3) AddXNode(start, MakeConX(bump_bit)) );
coleenp@548 5285 assert((abase & clear_low) == 0, "array base must be int-aligned");
coleenp@548 5286 }
duke@435 5287 // Round bumped 'start' down to jlong boundary in body of array.
duke@435 5288 start = _gvn.transform( new(C,3) AndXNode(start, MakeConX(~to_clear)) );
coleenp@548 5289 if (bump_bit != 0) {
coleenp@548 5290 // Store a zero to the immediately preceding jint:
coleenp@548 5291 Node* x1 = _gvn.transform( new(C,3) AddXNode(start, MakeConX(-bump_bit)) );
coleenp@548 5292 Node* p1 = basic_plus_adr(dest, x1);
coleenp@548 5293 mem = StoreNode::make(_gvn, control(), mem, p1, adr_type, intcon(0), T_INT);
coleenp@548 5294 mem = _gvn.transform(mem);
coleenp@548 5295 }
duke@435 5296 }
duke@435 5297 Node* end = dest_size; // pre-rounded
duke@435 5298 mem = ClearArrayNode::clear_memory(control(), mem, dest,
duke@435 5299 start, end, &_gvn);
duke@435 5300 } else {
duke@435 5301 // Non-constant start, unrounded non-constant end.
duke@435 5302 // (Nobody zeroes a random midsection of an array using this routine.)
duke@435 5303 ShouldNotReachHere(); // fix caller
duke@435 5304 }
duke@435 5305
duke@435 5306 // Done.
duke@435 5307 set_memory(mem, adr_type);
duke@435 5308 }
duke@435 5309
duke@435 5310
duke@435 5311 bool
duke@435 5312 LibraryCallKit::generate_block_arraycopy(const TypePtr* adr_type,
duke@435 5313 BasicType basic_elem_type,
duke@435 5314 AllocateNode* alloc,
duke@435 5315 Node* src, Node* src_offset,
duke@435 5316 Node* dest, Node* dest_offset,
iveresov@2606 5317 Node* dest_size, bool dest_uninitialized) {
duke@435 5318 // See if there is an advantage from block transfer.
kvn@464 5319 int scale = exact_log2(type2aelembytes(basic_elem_type));
duke@435 5320 if (scale >= LogBytesPerLong)
duke@435 5321 return false; // it is already a block transfer
duke@435 5322
duke@435 5323 // Look at the alignment of the starting offsets.
duke@435 5324 int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type);
duke@435 5325 const intptr_t BIG_NEG = -128;
duke@435 5326 assert(BIG_NEG + 2*abase < 0, "neg enough");
duke@435 5327
duke@435 5328 intptr_t src_off = abase + ((intptr_t) find_int_con(src_offset, -1) << scale);
duke@435 5329 intptr_t dest_off = abase + ((intptr_t) find_int_con(dest_offset, -1) << scale);
duke@435 5330 if (src_off < 0 || dest_off < 0)
duke@435 5331 // At present, we can only understand constants.
duke@435 5332 return false;
duke@435 5333
duke@435 5334 if (((src_off | dest_off) & (BytesPerLong-1)) != 0) {
duke@435 5335 // Non-aligned; too bad.
duke@435 5336 // One more chance: Pick off an initial 32-bit word.
duke@435 5337 // This is a common case, since abase can be odd mod 8.
duke@435 5338 if (((src_off | dest_off) & (BytesPerLong-1)) == BytesPerInt &&
duke@435 5339 ((src_off ^ dest_off) & (BytesPerLong-1)) == 0) {
duke@435 5340 Node* sptr = basic_plus_adr(src, src_off);
duke@435 5341 Node* dptr = basic_plus_adr(dest, dest_off);
duke@435 5342 Node* sval = make_load(control(), sptr, TypeInt::INT, T_INT, adr_type);
duke@435 5343 store_to_memory(control(), dptr, sval, T_INT, adr_type);
duke@435 5344 src_off += BytesPerInt;
duke@435 5345 dest_off += BytesPerInt;
duke@435 5346 } else {
duke@435 5347 return false;
duke@435 5348 }
duke@435 5349 }
duke@435 5350 assert(src_off % BytesPerLong == 0, "");
duke@435 5351 assert(dest_off % BytesPerLong == 0, "");
duke@435 5352
duke@435 5353 // Do this copy by giant steps.
duke@435 5354 Node* sptr = basic_plus_adr(src, src_off);
duke@435 5355 Node* dptr = basic_plus_adr(dest, dest_off);
duke@435 5356 Node* countx = dest_size;
duke@435 5357 countx = _gvn.transform( new (C, 3) SubXNode(countx, MakeConX(dest_off)) );
duke@435 5358 countx = _gvn.transform( new (C, 3) URShiftXNode(countx, intcon(LogBytesPerLong)) );
duke@435 5359
duke@435 5360 bool disjoint_bases = true; // since alloc != NULL
duke@435 5361 generate_unchecked_arraycopy(adr_type, T_LONG, disjoint_bases,
iveresov@2606 5362 sptr, NULL, dptr, NULL, countx, dest_uninitialized);
duke@435 5363
duke@435 5364 return true;
duke@435 5365 }
duke@435 5366
duke@435 5367
duke@435 5368 // Helper function; generates code for the slow case.
duke@435 5369 // We make a call to a runtime method which emulates the native method,
duke@435 5370 // but without the native wrapper overhead.
duke@435 5371 void
duke@435 5372 LibraryCallKit::generate_slow_arraycopy(const TypePtr* adr_type,
duke@435 5373 Node* src, Node* src_offset,
duke@435 5374 Node* dest, Node* dest_offset,
iveresov@2606 5375 Node* copy_length, bool dest_uninitialized) {
iveresov@2606 5376 assert(!dest_uninitialized, "Invariant");
duke@435 5377 Node* call = make_runtime_call(RC_NO_LEAF | RC_UNCOMMON,
duke@435 5378 OptoRuntime::slow_arraycopy_Type(),
duke@435 5379 OptoRuntime::slow_arraycopy_Java(),
duke@435 5380 "slow_arraycopy", adr_type,
duke@435 5381 src, src_offset, dest, dest_offset,
duke@435 5382 copy_length);
duke@435 5383
duke@435 5384 // Handle exceptions thrown by this fellow:
duke@435 5385 make_slow_call_ex(call, env()->Throwable_klass(), false);
duke@435 5386 }
duke@435 5387
duke@435 5388 // Helper function; generates code for cases requiring runtime checks.
duke@435 5389 Node*
duke@435 5390 LibraryCallKit::generate_checkcast_arraycopy(const TypePtr* adr_type,
duke@435 5391 Node* dest_elem_klass,
duke@435 5392 Node* src, Node* src_offset,
duke@435 5393 Node* dest, Node* dest_offset,
iveresov@2606 5394 Node* copy_length, bool dest_uninitialized) {
duke@435 5395 if (stopped()) return NULL;
duke@435 5396
iveresov@2606 5397 address copyfunc_addr = StubRoutines::checkcast_arraycopy(dest_uninitialized);
duke@435 5398 if (copyfunc_addr == NULL) { // Stub was not generated, go slow path.
duke@435 5399 return NULL;
duke@435 5400 }
duke@435 5401
duke@435 5402 // Pick out the parameters required to perform a store-check
duke@435 5403 // for the target array. This is an optimistic check. It will
duke@435 5404 // look in each non-null element's class, at the desired klass's
duke@435 5405 // super_check_offset, for the desired klass.
duke@435 5406 int sco_offset = Klass::super_check_offset_offset_in_bytes() + sizeof(oopDesc);
duke@435 5407 Node* p3 = basic_plus_adr(dest_elem_klass, sco_offset);
kvn@1964 5408 Node* n3 = new(C, 3) LoadINode(NULL, memory(p3), p3, _gvn.type(p3)->is_ptr());
never@2199 5409 Node* check_offset = ConvI2X(_gvn.transform(n3));
duke@435 5410 Node* check_value = dest_elem_klass;
duke@435 5411
duke@435 5412 Node* src_start = array_element_address(src, src_offset, T_OBJECT);
duke@435 5413 Node* dest_start = array_element_address(dest, dest_offset, T_OBJECT);
duke@435 5414
duke@435 5415 // (We know the arrays are never conjoint, because their types differ.)
duke@435 5416 Node* call = make_runtime_call(RC_LEAF|RC_NO_FP,
duke@435 5417 OptoRuntime::checkcast_arraycopy_Type(),
duke@435 5418 copyfunc_addr, "checkcast_arraycopy", adr_type,
duke@435 5419 // five arguments, of which two are
duke@435 5420 // intptr_t (jlong in LP64)
duke@435 5421 src_start, dest_start,
duke@435 5422 copy_length XTOP,
duke@435 5423 check_offset XTOP,
duke@435 5424 check_value);
duke@435 5425
duke@435 5426 return _gvn.transform(new (C, 1) ProjNode(call, TypeFunc::Parms));
duke@435 5427 }
duke@435 5428
duke@435 5429
duke@435 5430 // Helper function; generates code for cases requiring runtime checks.
duke@435 5431 Node*
duke@435 5432 LibraryCallKit::generate_generic_arraycopy(const TypePtr* adr_type,
duke@435 5433 Node* src, Node* src_offset,
duke@435 5434 Node* dest, Node* dest_offset,
iveresov@2606 5435 Node* copy_length, bool dest_uninitialized) {
iveresov@2606 5436 assert(!dest_uninitialized, "Invariant");
duke@435 5437 if (stopped()) return NULL;
duke@435 5438 address copyfunc_addr = StubRoutines::generic_arraycopy();
duke@435 5439 if (copyfunc_addr == NULL) { // Stub was not generated, go slow path.
duke@435 5440 return NULL;
duke@435 5441 }
duke@435 5442
duke@435 5443 Node* call = make_runtime_call(RC_LEAF|RC_NO_FP,
duke@435 5444 OptoRuntime::generic_arraycopy_Type(),
duke@435 5445 copyfunc_addr, "generic_arraycopy", adr_type,
duke@435 5446 src, src_offset, dest, dest_offset, copy_length);
duke@435 5447
duke@435 5448 return _gvn.transform(new (C, 1) ProjNode(call, TypeFunc::Parms));
duke@435 5449 }
duke@435 5450
duke@435 5451 // Helper function; generates the fast out-of-line call to an arraycopy stub.
duke@435 5452 void
duke@435 5453 LibraryCallKit::generate_unchecked_arraycopy(const TypePtr* adr_type,
duke@435 5454 BasicType basic_elem_type,
duke@435 5455 bool disjoint_bases,
duke@435 5456 Node* src, Node* src_offset,
duke@435 5457 Node* dest, Node* dest_offset,
iveresov@2606 5458 Node* copy_length, bool dest_uninitialized) {
duke@435 5459 if (stopped()) return; // nothing to do
duke@435 5460
duke@435 5461 Node* src_start = src;
duke@435 5462 Node* dest_start = dest;
duke@435 5463 if (src_offset != NULL || dest_offset != NULL) {
duke@435 5464 assert(src_offset != NULL && dest_offset != NULL, "");
duke@435 5465 src_start = array_element_address(src, src_offset, basic_elem_type);
duke@435 5466 dest_start = array_element_address(dest, dest_offset, basic_elem_type);
duke@435 5467 }
duke@435 5468
duke@435 5469 // Figure out which arraycopy runtime method to call.
duke@435 5470 const char* copyfunc_name = "arraycopy";
duke@435 5471 address copyfunc_addr =
duke@435 5472 basictype2arraycopy(basic_elem_type, src_offset, dest_offset,
iveresov@2606 5473 disjoint_bases, copyfunc_name, dest_uninitialized);
duke@435 5474
duke@435 5475 // Call it. Note that the count_ix value is not scaled to a byte-size.
duke@435 5476 make_runtime_call(RC_LEAF|RC_NO_FP,
duke@435 5477 OptoRuntime::fast_arraycopy_Type(),
duke@435 5478 copyfunc_addr, copyfunc_name, adr_type,
duke@435 5479 src_start, dest_start, copy_length XTOP);
duke@435 5480 }
johnc@2781 5481
johnc@2781 5482 //----------------------------inline_reference_get----------------------------
johnc@2781 5483
johnc@2781 5484 bool LibraryCallKit::inline_reference_get() {
johnc@2781 5485 const int nargs = 1; // self
johnc@2781 5486
johnc@2781 5487 guarantee(java_lang_ref_Reference::referent_offset > 0,
johnc@2781 5488 "should have already been set");
johnc@2781 5489
johnc@2781 5490 int referent_offset = java_lang_ref_Reference::referent_offset;
johnc@2781 5491
johnc@2781 5492 // Restore the stack and pop off the argument
johnc@2781 5493 _sp += nargs;
johnc@2781 5494 Node *reference_obj = pop();
johnc@2781 5495
johnc@2781 5496 // Null check on self without removing any arguments.
johnc@2781 5497 _sp += nargs;
johnc@2781 5498 reference_obj = do_null_check(reference_obj, T_OBJECT);
johnc@2781 5499 _sp -= nargs;;
johnc@2781 5500
johnc@2781 5501 if (stopped()) return true;
johnc@2781 5502
johnc@2781 5503 Node *adr = basic_plus_adr(reference_obj, reference_obj, referent_offset);
johnc@2781 5504
johnc@2781 5505 ciInstanceKlass* klass = env()->Object_klass();
johnc@2781 5506 const TypeOopPtr* object_type = TypeOopPtr::make_from_klass(klass);
johnc@2781 5507
johnc@2781 5508 Node* no_ctrl = NULL;
johnc@2781 5509 Node *result = make_load(no_ctrl, adr, object_type, T_OBJECT);
johnc@2781 5510
johnc@2781 5511 // Use the pre-barrier to record the value in the referent field
johnc@2781 5512 pre_barrier(false /* do_load */,
johnc@2781 5513 control(),
johnc@2781 5514 NULL /* obj */, NULL /* adr */, -1 /* alias_idx */, NULL /* val */, NULL /* val_type */,
johnc@2781 5515 result /* pre_val */,
johnc@2781 5516 T_OBJECT);
johnc@2781 5517
johnc@2781 5518 push(result);
johnc@2781 5519 return true;
johnc@2781 5520 }
johnc@2781 5521

mercurial