comparison src/share/vm/opto/library_call.cpp @ 12330:29bdcf12457c

8014447: Object.hashCode intrinsic breaks inline caches Summary: Try to inline as normal method first, then fall back to intrinsic. Reviewed-by: kvn, twisti
author shade
date Fri, 27 Sep 2013 11:52:24 +0400
parents c9ccd7b85f20
children 3213ba4d3dff
comparison
equal deleted inserted replaced
12329:f2512d89ad0c 12330:29bdcf12457c
45 // Extend the set of intrinsics known to the runtime: 45 // Extend the set of intrinsics known to the runtime:
46 public: 46 public:
47 private: 47 private:
48 bool _is_virtual; 48 bool _is_virtual;
49 bool _is_predicted; 49 bool _is_predicted;
50 bool _does_virtual_dispatch;
50 vmIntrinsics::ID _intrinsic_id; 51 vmIntrinsics::ID _intrinsic_id;
51 52
52 public: 53 public:
53 LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, vmIntrinsics::ID id) 54 LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, bool does_virtual_dispatch, vmIntrinsics::ID id)
54 : InlineCallGenerator(m), 55 : InlineCallGenerator(m),
55 _is_virtual(is_virtual), 56 _is_virtual(is_virtual),
56 _is_predicted(is_predicted), 57 _is_predicted(is_predicted),
58 _does_virtual_dispatch(does_virtual_dispatch),
57 _intrinsic_id(id) 59 _intrinsic_id(id)
58 { 60 {
59 } 61 }
60 virtual bool is_intrinsic() const { return true; } 62 virtual bool is_intrinsic() const { return true; }
61 virtual bool is_virtual() const { return _is_virtual; } 63 virtual bool is_virtual() const { return _is_virtual; }
62 virtual bool is_predicted() const { return _is_predicted; } 64 virtual bool is_predicted() const { return _is_predicted; }
65 virtual bool does_virtual_dispatch() const { return _does_virtual_dispatch; }
63 virtual JVMState* generate(JVMState* jvms); 66 virtual JVMState* generate(JVMState* jvms);
64 virtual Node* generate_predicate(JVMState* jvms); 67 virtual Node* generate_predicate(JVMState* jvms);
65 vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; } 68 vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; }
66 }; 69 };
67 70
353 return NULL; 356 return NULL;
354 } 357 }
355 } 358 }
356 359
357 bool is_predicted = false; 360 bool is_predicted = false;
361 bool does_virtual_dispatch = false;
358 362
359 switch (id) { 363 switch (id) {
360 case vmIntrinsics::_compareTo: 364 case vmIntrinsics::_compareTo:
361 if (!SpecialStringCompareTo) return NULL; 365 if (!SpecialStringCompareTo) return NULL;
362 if (!Matcher::match_rule_supported(Op_StrComp)) return NULL; 366 if (!Matcher::match_rule_supported(Op_StrComp)) return NULL;
379 if (StubRoutines::unsafe_arraycopy() == NULL) return NULL; 383 if (StubRoutines::unsafe_arraycopy() == NULL) return NULL;
380 if (!InlineArrayCopy) return NULL; 384 if (!InlineArrayCopy) return NULL;
381 break; 385 break;
382 case vmIntrinsics::_hashCode: 386 case vmIntrinsics::_hashCode:
383 if (!InlineObjectHash) return NULL; 387 if (!InlineObjectHash) return NULL;
388 does_virtual_dispatch = true;
384 break; 389 break;
385 case vmIntrinsics::_clone: 390 case vmIntrinsics::_clone:
391 does_virtual_dispatch = true;
386 case vmIntrinsics::_copyOf: 392 case vmIntrinsics::_copyOf:
387 case vmIntrinsics::_copyOfRange: 393 case vmIntrinsics::_copyOfRange:
388 if (!InlineObjectCopy) return NULL; 394 if (!InlineObjectCopy) return NULL;
389 // These also use the arraycopy intrinsic mechanism: 395 // These also use the arraycopy intrinsic mechanism:
390 if (!InlineArrayCopy) return NULL; 396 if (!InlineArrayCopy) return NULL;
539 // -XX:-InlineUnsafeOps disables natives from the Unsafe class. 545 // -XX:-InlineUnsafeOps disables natives from the Unsafe class.
540 if (m->holder()->name() == ciSymbol::sun_misc_Unsafe()) { 546 if (m->holder()->name() == ciSymbol::sun_misc_Unsafe()) {
541 if (!InlineUnsafeOps) return NULL; 547 if (!InlineUnsafeOps) return NULL;
542 } 548 }
543 549
544 return new LibraryIntrinsic(m, is_virtual, is_predicted, (vmIntrinsics::ID) id); 550 return new LibraryIntrinsic(m, is_virtual, is_predicted, does_virtual_dispatch, (vmIntrinsics::ID) id);
545 } 551 }
546 552
547 //----------------------register_library_intrinsics----------------------- 553 //----------------------register_library_intrinsics-----------------------
548 // Initialize this file's data structures, for each Compile instance. 554 // Initialize this file's data structures, for each Compile instance.
549 void Compile::register_library_intrinsics() { 555 void Compile::register_library_intrinsics() {