Mercurial > hg > truffle
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() { |