mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8223347: Integration of Vector API (Incubator)
Co-authored-by: Vivek Deshpande <vdeshpande@openjdk.org> Co-authored-by: Qi Feng <qfeng@openjdk.org> Co-authored-by: Ian Graves <igraves@openjdk.org> Co-authored-by: Jean-Philippe Halimi <jphalimi@openjdk.org> Co-authored-by: Vladimir Ivanov <vlivanov@openjdk.org> Co-authored-by: Ningsheng Jian <njian@openjdk.org> Co-authored-by: Razvan Lupusoru <rlupusoru@openjdk.org> Co-authored-by: Smita Kamath <svkamath@openjdk.org> Co-authored-by: Rahul Kandu <rkandu@openjdk.org> Co-authored-by: Kishor Kharbas <kkharbas@openjdk.org> Co-authored-by: Eric Liu <Eric.Liu2@arm.com> Co-authored-by: Aaloan Miftah <someusername3@gmail.com> Co-authored-by: John R Rose <jrose@openjdk.org> Co-authored-by: Shravya Rukmannagari <srukmannagar@openjdk.org> Co-authored-by: Paul Sandoz <psandoz@openjdk.org> Co-authored-by: Sandhya Viswanathan <sviswanathan@openjdk.org> Co-authored-by: Lauren Walkowski <lauren.walkowski@arm.com> Co-authored-by: Yang Zang <Yang.Zhang@arm.com> Co-authored-by: Joshua Zhu <jzhu@openjdk.org> Co-authored-by: Wang Zhuo <wzhuo@openjdk.org> Co-authored-by: Jatin Bhateja <jbhateja@openjdk.org> Reviewed-by: erikj, chegar, kvn, darcy, forax, briangoetz, aph, epavlova, coleenp
This commit is contained in:
parent
386e7e8b73
commit
0c99b19258
336 changed files with 293978 additions and 2083 deletions
|
@ -68,6 +68,7 @@
|
|||
#include "opto/runtime.hpp"
|
||||
#include "opto/stringopts.hpp"
|
||||
#include "opto/type.hpp"
|
||||
#include "opto/vector.hpp"
|
||||
#include "opto/vectornode.hpp"
|
||||
#include "runtime/arguments.hpp"
|
||||
#include "runtime/globals_extension.hpp"
|
||||
|
@ -412,6 +413,7 @@ void Compile::remove_useless_nodes(Unique_Node_List &useful) {
|
|||
remove_useless_late_inlines(&_string_late_inlines, useful);
|
||||
remove_useless_late_inlines(&_boxing_late_inlines, useful);
|
||||
remove_useless_late_inlines(&_late_inlines, useful);
|
||||
remove_useless_late_inlines(&_vector_reboxing_late_inlines, useful);
|
||||
debug_only(verify_graph_edges(true/*check for no_dead_code*/);)
|
||||
}
|
||||
|
||||
|
@ -545,6 +547,7 @@ Compile::Compile( ciEnv* ci_env, ciMethod* target, int osr_bci,
|
|||
_late_inlines(comp_arena(), 2, 0, NULL),
|
||||
_string_late_inlines(comp_arena(), 2, 0, NULL),
|
||||
_boxing_late_inlines(comp_arena(), 2, 0, NULL),
|
||||
_vector_reboxing_late_inlines(comp_arena(), 2, 0, NULL),
|
||||
_late_inlines_pos(0),
|
||||
_number_of_mh_late_inlines(0),
|
||||
_print_inlining_stream(NULL),
|
||||
|
@ -1962,6 +1965,8 @@ void Compile::inline_incrementally(PhaseIterGVN& igvn) {
|
|||
|
||||
inline_incrementally_cleanup(igvn);
|
||||
|
||||
print_method(PHASE_INCREMENTAL_INLINE_STEP, 3);
|
||||
|
||||
if (failing()) return;
|
||||
}
|
||||
assert( igvn._worklist.size() == 0, "should be done with igvn" );
|
||||
|
@ -2096,6 +2101,16 @@ void Compile::Optimize() {
|
|||
// so keep only the actual candidates for optimizations.
|
||||
cleanup_expensive_nodes(igvn);
|
||||
|
||||
assert(EnableVectorSupport || !has_vbox_nodes(), "sanity");
|
||||
if (EnableVectorSupport && has_vbox_nodes()) {
|
||||
TracePhase tp("", &timers[_t_vector]);
|
||||
PhaseVector pv(igvn);
|
||||
pv.optimize_vector_boxes();
|
||||
|
||||
print_method(PHASE_ITER_GVN_AFTER_VECTOR, 2);
|
||||
}
|
||||
assert(!has_vbox_nodes(), "sanity");
|
||||
|
||||
if (!failing() && RenumberLiveNodes && live_nodes() + NodeLimitFudgeFactor < unique()) {
|
||||
Compile::TracePhase tp("", &timers[_t_renumberLive]);
|
||||
initial_gvn()->replace_with(&igvn);
|
||||
|
@ -2272,6 +2287,35 @@ void Compile::Optimize() {
|
|||
DEBUG_ONLY(set_phase_optimize_finished();)
|
||||
}
|
||||
|
||||
void Compile::inline_vector_reboxing_calls() {
|
||||
if (C->_vector_reboxing_late_inlines.length() > 0) {
|
||||
PhaseGVN* gvn = C->initial_gvn();
|
||||
|
||||
_late_inlines_pos = C->_late_inlines.length();
|
||||
while (_vector_reboxing_late_inlines.length() > 0) {
|
||||
CallGenerator* cg = _vector_reboxing_late_inlines.pop();
|
||||
cg->do_late_inline();
|
||||
if (failing()) return;
|
||||
print_method(PHASE_INLINE_VECTOR_REBOX, cg->call_node());
|
||||
}
|
||||
_vector_reboxing_late_inlines.trunc_to(0);
|
||||
}
|
||||
}
|
||||
|
||||
bool Compile::has_vbox_nodes() {
|
||||
if (C->_vector_reboxing_late_inlines.length() > 0) {
|
||||
return true;
|
||||
}
|
||||
for (int macro_idx = C->macro_count() - 1; macro_idx >= 0; macro_idx--) {
|
||||
Node * n = C->macro_node(macro_idx);
|
||||
assert(n->is_macro(), "only macro nodes expected here");
|
||||
if (n->Opcode() == Op_VectorUnbox || n->Opcode() == Op_VectorBox || n->Opcode() == Op_VectorBoxAllocate) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//---------------------------- Bitwise operation packing optimization ---------------------------
|
||||
|
||||
static bool is_vector_unary_bitwise_op(Node* n) {
|
||||
|
@ -2618,8 +2662,8 @@ void Compile::Code_Gen() {
|
|||
if (failing()) {
|
||||
return;
|
||||
}
|
||||
print_method(PHASE_AFTER_MATCHING, 3);
|
||||
}
|
||||
|
||||
// In debug mode can dump m._nodes.dump() for mapping of ideal to machine
|
||||
// nodes. Mapping is only valid at the root of each matched subtree.
|
||||
NOT_PRODUCT( verify_graph_edges(); )
|
||||
|
@ -2798,7 +2842,8 @@ void Compile::final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc) {
|
|||
// Check for commutative opcode
|
||||
switch( nop ) {
|
||||
case Op_AddI: case Op_AddF: case Op_AddD: case Op_AddL:
|
||||
case Op_MaxI: case Op_MinI:
|
||||
case Op_MaxI: case Op_MaxL: case Op_MaxF: case Op_MaxD:
|
||||
case Op_MinI: case Op_MinL: case Op_MinF: case Op_MinD:
|
||||
case Op_MulI: case Op_MulF: case Op_MulD: case Op_MulL:
|
||||
case Op_AndL: case Op_XorL: case Op_OrL:
|
||||
case Op_AndI: case Op_XorI: case Op_OrI: {
|
||||
|
@ -3348,6 +3393,8 @@ void Compile::final_graph_reshaping_main_switch(Node* n, Final_Reshape_Counts& f
|
|||
|
||||
case Op_LoadVector:
|
||||
case Op_StoreVector:
|
||||
case Op_LoadVectorGather:
|
||||
case Op_StoreVectorScatter:
|
||||
break;
|
||||
|
||||
case Op_AddReductionVI:
|
||||
|
@ -4568,26 +4615,43 @@ void Compile::sort_macro_nodes() {
|
|||
}
|
||||
}
|
||||
|
||||
void Compile::print_method(CompilerPhaseType cpt, int level, int idx) {
|
||||
void Compile::print_method(CompilerPhaseType cpt, const char *name, int level, int idx) {
|
||||
EventCompilerPhase event;
|
||||
if (event.should_commit()) {
|
||||
CompilerEvent::PhaseEvent::post(event, C->_latest_stage_start_counter, cpt, C->_compile_id, level);
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
if (should_print(level)) {
|
||||
char output[1024];
|
||||
if (idx != 0) {
|
||||
jio_snprintf(output, sizeof(output), "%s:%d", CompilerPhaseTypeHelper::to_string(cpt), idx);
|
||||
} else {
|
||||
jio_snprintf(output, sizeof(output), "%s", CompilerPhaseTypeHelper::to_string(cpt));
|
||||
}
|
||||
_printer->print_method(output, level);
|
||||
_printer->print_method(name, level);
|
||||
}
|
||||
#endif
|
||||
C->_latest_stage_start_counter.stamp();
|
||||
}
|
||||
|
||||
void Compile::print_method(CompilerPhaseType cpt, int level, int idx) {
|
||||
char output[1024];
|
||||
#ifndef PRODUCT
|
||||
if (idx != 0) {
|
||||
jio_snprintf(output, sizeof(output), "%s:%d", CompilerPhaseTypeHelper::to_string(cpt), idx);
|
||||
} else {
|
||||
jio_snprintf(output, sizeof(output), "%s", CompilerPhaseTypeHelper::to_string(cpt));
|
||||
}
|
||||
#endif
|
||||
print_method(cpt, output, level, idx);
|
||||
}
|
||||
|
||||
void Compile::print_method(CompilerPhaseType cpt, Node* n, int level) {
|
||||
ResourceMark rm;
|
||||
stringStream ss;
|
||||
ss.print_raw(CompilerPhaseTypeHelper::to_string(cpt));
|
||||
if (n != NULL) {
|
||||
ss.print(": %d %s ", n->_idx, NodeClassNames[n->Opcode()]);
|
||||
} else {
|
||||
ss.print_raw(": NULL");
|
||||
}
|
||||
C->print_method(cpt, ss.as_string(), level);
|
||||
}
|
||||
|
||||
void Compile::end_method(int level) {
|
||||
EventCompilerPhase event;
|
||||
if (event.should_commit()) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue