6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "classfile/vmClasses.hpp"
26 #include "compiler/compilationMemoryStatistic.hpp"
27 #include "compiler/compilerDefinitions.inline.hpp"
28 #include "jfr/support/jfrIntrinsics.hpp"
29 #include "opto/c2compiler.hpp"
30 #include "opto/compile.hpp"
31 #include "opto/optoreg.hpp"
32 #include "opto/output.hpp"
33 #include "opto/runtime.hpp"
34 #include "runtime/globals_extension.hpp"
35 #include "runtime/handles.inline.hpp"
36 #include "runtime/stubRoutines.hpp"
37 #include "utilities/macros.hpp"
38
39
40 // register information defined by ADLC
41 extern const char register_save_policy[];
42 extern const int register_save_type[];
43
44 const char* C2Compiler::retry_no_subsuming_loads() {
45 return "retry without subsuming loads";
112 // There is a race possible once at startup and then we're fine
113
114 // Note that this is being called from a compiler thread not the
115 // main startup thread.
116 if (should_perform_init()) {
117 bool successful = C2Compiler::init_c2_runtime();
118 int new_state = (successful) ? initialized : failed;
119 set_state(new_state);
120 }
121 }
122
123 void C2Compiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci, bool install_code, DirectiveSet* directive) {
124 assert(is_initialized(), "Compiler thread must be initialized");
125
126 CompilationMemoryStatisticMark cmsm(directive);
127
128 bool subsume_loads = SubsumeLoads;
129 bool do_escape_analysis = DoEscapeAnalysis;
130 bool do_iterative_escape_analysis = DoEscapeAnalysis;
131 bool do_reduce_allocation_merges = ReduceAllocationMerges && EliminateAllocations;
132 bool eliminate_boxing = EliminateAutoBox;
133 bool do_locks_coarsening = EliminateLocks;
134 bool do_superword = UseSuperWord;
135
136 while (!env->failing()) {
137 ResourceMark rm;
138 // Attempt to compile while subsuming loads into machine instructions.
139 Options options(subsume_loads,
140 do_escape_analysis,
141 do_iterative_escape_analysis,
142 do_reduce_allocation_merges,
143 eliminate_boxing,
144 do_locks_coarsening,
145 do_superword,
146 install_code);
147 Compile C(env, target, entry_bci, options, directive);
148
149 // Check result and retry if appropriate.
150 if (C.failure_reason() != nullptr) {
151 if (C.failure_reason_is(retry_no_subsuming_loads())) {
152 assert(subsume_loads, "must make progress");
641 case vmIntrinsics::_max:
642 case vmIntrinsics::_min_strict:
643 case vmIntrinsics::_max_strict:
644 case vmIntrinsics::_maxL:
645 case vmIntrinsics::_minL:
646 case vmIntrinsics::_arraycopy:
647 case vmIntrinsics::_arraySort:
648 case vmIntrinsics::_arrayPartition:
649 case vmIntrinsics::_indexOfL:
650 case vmIntrinsics::_indexOfU:
651 case vmIntrinsics::_indexOfUL:
652 case vmIntrinsics::_indexOfIL:
653 case vmIntrinsics::_indexOfIU:
654 case vmIntrinsics::_indexOfIUL:
655 case vmIntrinsics::_indexOfU_char:
656 case vmIntrinsics::_indexOfL_char:
657 case vmIntrinsics::_toBytesStringU:
658 case vmIntrinsics::_getCharsStringU:
659 case vmIntrinsics::_getCharStringU:
660 case vmIntrinsics::_putCharStringU:
661 case vmIntrinsics::_getReference:
662 case vmIntrinsics::_getBoolean:
663 case vmIntrinsics::_getByte:
664 case vmIntrinsics::_getShort:
665 case vmIntrinsics::_getChar:
666 case vmIntrinsics::_getInt:
667 case vmIntrinsics::_getLong:
668 case vmIntrinsics::_getFloat:
669 case vmIntrinsics::_getDouble:
670 case vmIntrinsics::_putReference:
671 case vmIntrinsics::_putBoolean:
672 case vmIntrinsics::_putByte:
673 case vmIntrinsics::_putShort:
674 case vmIntrinsics::_putChar:
675 case vmIntrinsics::_putInt:
676 case vmIntrinsics::_putLong:
677 case vmIntrinsics::_putFloat:
678 case vmIntrinsics::_putDouble:
679 case vmIntrinsics::_getReferenceVolatile:
680 case vmIntrinsics::_getBooleanVolatile:
681 case vmIntrinsics::_getByteVolatile:
682 case vmIntrinsics::_getShortVolatile:
683 case vmIntrinsics::_getCharVolatile:
684 case vmIntrinsics::_getIntVolatile:
685 case vmIntrinsics::_getLongVolatile:
686 case vmIntrinsics::_getFloatVolatile:
687 case vmIntrinsics::_getDoubleVolatile:
688 case vmIntrinsics::_putReferenceVolatile:
689 case vmIntrinsics::_putBooleanVolatile:
690 case vmIntrinsics::_putByteVolatile:
691 case vmIntrinsics::_putShortVolatile:
692 case vmIntrinsics::_putCharVolatile:
693 case vmIntrinsics::_putIntVolatile:
694 case vmIntrinsics::_putLongVolatile:
695 case vmIntrinsics::_putFloatVolatile:
696 case vmIntrinsics::_putDoubleVolatile:
697 case vmIntrinsics::_getReferenceAcquire:
698 case vmIntrinsics::_getBooleanAcquire:
742 case vmIntrinsics::_storeFence:
743 case vmIntrinsics::_storeStoreFence:
744 case vmIntrinsics::_fullFence:
745 case vmIntrinsics::_currentCarrierThread:
746 case vmIntrinsics::_currentThread:
747 case vmIntrinsics::_setCurrentThread:
748 case vmIntrinsics::_scopedValueCache:
749 case vmIntrinsics::_setScopedValueCache:
750 case vmIntrinsics::_Continuation_pin:
751 case vmIntrinsics::_Continuation_unpin:
752 #ifdef JFR_HAVE_INTRINSICS
753 case vmIntrinsics::_counterTime:
754 case vmIntrinsics::_getEventWriter:
755 case vmIntrinsics::_jvm_commit:
756 #endif
757 case vmIntrinsics::_currentTimeMillis:
758 case vmIntrinsics::_nanoTime:
759 case vmIntrinsics::_allocateInstance:
760 case vmIntrinsics::_allocateUninitializedArray:
761 case vmIntrinsics::_newArray:
762 case vmIntrinsics::_getLength:
763 case vmIntrinsics::_copyOf:
764 case vmIntrinsics::_copyOfRange:
765 case vmIntrinsics::_clone:
766 case vmIntrinsics::_isAssignableFrom:
767 case vmIntrinsics::_isInstance:
768 case vmIntrinsics::_isHidden:
769 case vmIntrinsics::_getSuperclass:
770 case vmIntrinsics::_floatToRawIntBits:
771 case vmIntrinsics::_floatToIntBits:
772 case vmIntrinsics::_intBitsToFloat:
773 case vmIntrinsics::_doubleToRawLongBits:
774 case vmIntrinsics::_doubleToLongBits:
775 case vmIntrinsics::_longBitsToDouble:
776 case vmIntrinsics::_Reference_get0:
777 case vmIntrinsics::_Reference_refersTo0:
778 case vmIntrinsics::_PhantomReference_refersTo0:
779 case vmIntrinsics::_Reference_clear0:
780 case vmIntrinsics::_PhantomReference_clear0:
781 case vmIntrinsics::_Class_cast:
|
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "classfile/vmClasses.hpp"
26 #include "classfile/vmIntrinsics.hpp"
27 #include "compiler/compilationMemoryStatistic.hpp"
28 #include "compiler/compilerDefinitions.inline.hpp"
29 #include "jfr/support/jfrIntrinsics.hpp"
30 #include "opto/c2compiler.hpp"
31 #include "opto/compile.hpp"
32 #include "opto/optoreg.hpp"
33 #include "opto/output.hpp"
34 #include "opto/runtime.hpp"
35 #include "runtime/globals_extension.hpp"
36 #include "runtime/handles.inline.hpp"
37 #include "runtime/stubRoutines.hpp"
38 #include "utilities/macros.hpp"
39
40
41 // register information defined by ADLC
42 extern const char register_save_policy[];
43 extern const int register_save_type[];
44
45 const char* C2Compiler::retry_no_subsuming_loads() {
46 return "retry without subsuming loads";
113 // There is a race possible once at startup and then we're fine
114
115 // Note that this is being called from a compiler thread not the
116 // main startup thread.
117 if (should_perform_init()) {
118 bool successful = C2Compiler::init_c2_runtime();
119 int new_state = (successful) ? initialized : failed;
120 set_state(new_state);
121 }
122 }
123
124 void C2Compiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci, bool install_code, DirectiveSet* directive) {
125 assert(is_initialized(), "Compiler thread must be initialized");
126
127 CompilationMemoryStatisticMark cmsm(directive);
128
129 bool subsume_loads = SubsumeLoads;
130 bool do_escape_analysis = DoEscapeAnalysis;
131 bool do_iterative_escape_analysis = DoEscapeAnalysis;
132 bool do_reduce_allocation_merges = ReduceAllocationMerges && EliminateAllocations;
133 // TODO 8328675 Re-enable
134 bool eliminate_boxing = false; // EliminateAutoBox;
135 bool do_locks_coarsening = EliminateLocks;
136 bool do_superword = UseSuperWord;
137
138 while (!env->failing()) {
139 ResourceMark rm;
140 // Attempt to compile while subsuming loads into machine instructions.
141 Options options(subsume_loads,
142 do_escape_analysis,
143 do_iterative_escape_analysis,
144 do_reduce_allocation_merges,
145 eliminate_boxing,
146 do_locks_coarsening,
147 do_superword,
148 install_code);
149 Compile C(env, target, entry_bci, options, directive);
150
151 // Check result and retry if appropriate.
152 if (C.failure_reason() != nullptr) {
153 if (C.failure_reason_is(retry_no_subsuming_loads())) {
154 assert(subsume_loads, "must make progress");
643 case vmIntrinsics::_max:
644 case vmIntrinsics::_min_strict:
645 case vmIntrinsics::_max_strict:
646 case vmIntrinsics::_maxL:
647 case vmIntrinsics::_minL:
648 case vmIntrinsics::_arraycopy:
649 case vmIntrinsics::_arraySort:
650 case vmIntrinsics::_arrayPartition:
651 case vmIntrinsics::_indexOfL:
652 case vmIntrinsics::_indexOfU:
653 case vmIntrinsics::_indexOfUL:
654 case vmIntrinsics::_indexOfIL:
655 case vmIntrinsics::_indexOfIU:
656 case vmIntrinsics::_indexOfIUL:
657 case vmIntrinsics::_indexOfU_char:
658 case vmIntrinsics::_indexOfL_char:
659 case vmIntrinsics::_toBytesStringU:
660 case vmIntrinsics::_getCharsStringU:
661 case vmIntrinsics::_getCharStringU:
662 case vmIntrinsics::_putCharStringU:
663 case vmIntrinsics::_makePrivateBuffer:
664 case vmIntrinsics::_finishPrivateBuffer:
665 case vmIntrinsics::_getReference:
666 case vmIntrinsics::_getBoolean:
667 case vmIntrinsics::_getByte:
668 case vmIntrinsics::_getShort:
669 case vmIntrinsics::_getChar:
670 case vmIntrinsics::_getInt:
671 case vmIntrinsics::_getLong:
672 case vmIntrinsics::_getFloat:
673 case vmIntrinsics::_getDouble:
674 case vmIntrinsics::_getValue:
675 case vmIntrinsics::_getFlatValue:
676 case vmIntrinsics::_putReference:
677 case vmIntrinsics::_putBoolean:
678 case vmIntrinsics::_putByte:
679 case vmIntrinsics::_putShort:
680 case vmIntrinsics::_putChar:
681 case vmIntrinsics::_putInt:
682 case vmIntrinsics::_putLong:
683 case vmIntrinsics::_putFloat:
684 case vmIntrinsics::_putDouble:
685 case vmIntrinsics::_putValue:
686 case vmIntrinsics::_putFlatValue:
687 case vmIntrinsics::_getReferenceVolatile:
688 case vmIntrinsics::_getBooleanVolatile:
689 case vmIntrinsics::_getByteVolatile:
690 case vmIntrinsics::_getShortVolatile:
691 case vmIntrinsics::_getCharVolatile:
692 case vmIntrinsics::_getIntVolatile:
693 case vmIntrinsics::_getLongVolatile:
694 case vmIntrinsics::_getFloatVolatile:
695 case vmIntrinsics::_getDoubleVolatile:
696 case vmIntrinsics::_putReferenceVolatile:
697 case vmIntrinsics::_putBooleanVolatile:
698 case vmIntrinsics::_putByteVolatile:
699 case vmIntrinsics::_putShortVolatile:
700 case vmIntrinsics::_putCharVolatile:
701 case vmIntrinsics::_putIntVolatile:
702 case vmIntrinsics::_putLongVolatile:
703 case vmIntrinsics::_putFloatVolatile:
704 case vmIntrinsics::_putDoubleVolatile:
705 case vmIntrinsics::_getReferenceAcquire:
706 case vmIntrinsics::_getBooleanAcquire:
750 case vmIntrinsics::_storeFence:
751 case vmIntrinsics::_storeStoreFence:
752 case vmIntrinsics::_fullFence:
753 case vmIntrinsics::_currentCarrierThread:
754 case vmIntrinsics::_currentThread:
755 case vmIntrinsics::_setCurrentThread:
756 case vmIntrinsics::_scopedValueCache:
757 case vmIntrinsics::_setScopedValueCache:
758 case vmIntrinsics::_Continuation_pin:
759 case vmIntrinsics::_Continuation_unpin:
760 #ifdef JFR_HAVE_INTRINSICS
761 case vmIntrinsics::_counterTime:
762 case vmIntrinsics::_getEventWriter:
763 case vmIntrinsics::_jvm_commit:
764 #endif
765 case vmIntrinsics::_currentTimeMillis:
766 case vmIntrinsics::_nanoTime:
767 case vmIntrinsics::_allocateInstance:
768 case vmIntrinsics::_allocateUninitializedArray:
769 case vmIntrinsics::_newArray:
770 case vmIntrinsics::_newNullRestrictedNonAtomicArray:
771 case vmIntrinsics::_newNullRestrictedAtomicArray:
772 case vmIntrinsics::_newNullableAtomicArray:
773 case vmIntrinsics::_getLength:
774 case vmIntrinsics::_copyOf:
775 case vmIntrinsics::_copyOfRange:
776 case vmIntrinsics::_clone:
777 case vmIntrinsics::_isAssignableFrom:
778 case vmIntrinsics::_isInstance:
779 case vmIntrinsics::_isHidden:
780 case vmIntrinsics::_getSuperclass:
781 case vmIntrinsics::_floatToRawIntBits:
782 case vmIntrinsics::_floatToIntBits:
783 case vmIntrinsics::_intBitsToFloat:
784 case vmIntrinsics::_doubleToRawLongBits:
785 case vmIntrinsics::_doubleToLongBits:
786 case vmIntrinsics::_longBitsToDouble:
787 case vmIntrinsics::_Reference_get0:
788 case vmIntrinsics::_Reference_refersTo0:
789 case vmIntrinsics::_PhantomReference_refersTo0:
790 case vmIntrinsics::_Reference_clear0:
791 case vmIntrinsics::_PhantomReference_clear0:
792 case vmIntrinsics::_Class_cast:
|