@@ -691,17 +691,17 @@ bool LibraryCallKit::try_to_inline(int predicate) {
691691 case vmIntrinsics::_max:
692692 case vmIntrinsics::_min_strict:
693693 case vmIntrinsics::_max_strict:
694- return inline_min_max (intrinsic_id ());
695-
696- case vmIntrinsics::_maxF:
694+ case vmIntrinsics::_minL:
695+ case vmIntrinsics::_maxL:
697696 case vmIntrinsics::_minF:
698- case vmIntrinsics::_maxD :
697+ case vmIntrinsics::_maxF :
699698 case vmIntrinsics::_minD:
700- case vmIntrinsics::_maxF_strict :
699+ case vmIntrinsics::_maxD :
701700 case vmIntrinsics::_minF_strict:
702- case vmIntrinsics::_maxD_strict :
701+ case vmIntrinsics::_maxF_strict :
703702 case vmIntrinsics::_minD_strict:
704- return inline_fp_min_max (intrinsic_id ());
703+ case vmIntrinsics::_maxD_strict:
704+ return inline_min_max (intrinsic_id ());
705705
706706 case vmIntrinsics::_VectorUnaryOp:
707707 return inline_vector_nary_operation (1 );
@@ -1942,7 +1942,78 @@ bool LibraryCallKit::inline_notify(vmIntrinsics::ID id) {
19421942
19431943// ----------------------------inline_min_max-----------------------------------
19441944bool LibraryCallKit::inline_min_max (vmIntrinsics::ID id) {
1945- set_result (generate_min_max (id, argument (0 ), argument (1 )));
1945+ Node* a = nullptr ;
1946+ Node* b = nullptr ;
1947+ Node* n = nullptr ;
1948+ switch (id) {
1949+ case vmIntrinsics::_min:
1950+ case vmIntrinsics::_max:
1951+ case vmIntrinsics::_minF:
1952+ case vmIntrinsics::_maxF:
1953+ case vmIntrinsics::_minF_strict:
1954+ case vmIntrinsics::_maxF_strict:
1955+ case vmIntrinsics::_min_strict:
1956+ case vmIntrinsics::_max_strict:
1957+ assert (callee ()->signature ()->size () == 2 , " minF/maxF has 2 parameters of size 1 each." );
1958+ a = argument (0 );
1959+ b = argument (1 );
1960+ break ;
1961+ case vmIntrinsics::_minD:
1962+ case vmIntrinsics::_maxD:
1963+ case vmIntrinsics::_minD_strict:
1964+ case vmIntrinsics::_maxD_strict:
1965+ assert (callee ()->signature ()->size () == 4 , " minD/maxD has 2 parameters of size 2 each." );
1966+ a = round_double_node (argument (0 ));
1967+ b = round_double_node (argument (2 ));
1968+ break ;
1969+ case vmIntrinsics::_minL:
1970+ case vmIntrinsics::_maxL:
1971+ assert (callee ()->signature ()->size () == 4 , " minL/maxL has 2 parameters of size 2 each." );
1972+ a = argument (0 );
1973+ b = argument (2 );
1974+ break ;
1975+ default :
1976+ fatal_unexpected_iid (id);
1977+ break ;
1978+ }
1979+
1980+ switch (id) {
1981+ case vmIntrinsics::_min:
1982+ case vmIntrinsics::_min_strict:
1983+ n = new MinINode (a, b);
1984+ break ;
1985+ case vmIntrinsics::_max:
1986+ case vmIntrinsics::_max_strict:
1987+ n = new MaxINode (a, b);
1988+ break ;
1989+ case vmIntrinsics::_minF:
1990+ case vmIntrinsics::_minF_strict:
1991+ n = new MinFNode (a, b);
1992+ break ;
1993+ case vmIntrinsics::_maxF:
1994+ case vmIntrinsics::_maxF_strict:
1995+ n = new MaxFNode (a, b);
1996+ break ;
1997+ case vmIntrinsics::_minD:
1998+ case vmIntrinsics::_minD_strict:
1999+ n = new MinDNode (a, b);
2000+ break ;
2001+ case vmIntrinsics::_maxD:
2002+ case vmIntrinsics::_maxD_strict:
2003+ n = new MaxDNode (a, b);
2004+ break ;
2005+ case vmIntrinsics::_minL:
2006+ n = new MinLNode (_gvn.C , a, b);
2007+ break ;
2008+ case vmIntrinsics::_maxL:
2009+ n = new MaxLNode (_gvn.C , a, b);
2010+ break ;
2011+ default :
2012+ fatal_unexpected_iid (id);
2013+ break ;
2014+ }
2015+
2016+ set_result (_gvn.transform (n));
19462017 return true ;
19472018}
19482019
@@ -2021,25 +2092,6 @@ bool LibraryCallKit::inline_math_unsignedMultiplyHigh() {
20212092 return true ;
20222093}
20232094
2024- Node*
2025- LibraryCallKit::generate_min_max (vmIntrinsics::ID id, Node* x0, Node* y0) {
2026- Node* result_val = nullptr ;
2027- switch (id) {
2028- case vmIntrinsics::_min:
2029- case vmIntrinsics::_min_strict:
2030- result_val = _gvn.transform (new MinINode (x0, y0));
2031- break ;
2032- case vmIntrinsics::_max:
2033- case vmIntrinsics::_max_strict:
2034- result_val = _gvn.transform (new MaxINode (x0, y0));
2035- break ;
2036- default :
2037- fatal_unexpected_iid (id);
2038- break ;
2039- }
2040- return result_val;
2041- }
2042-
20432095inline int
20442096LibraryCallKit::classify_unsafe_addr (Node* &base, Node* &offset, BasicType type) {
20452097 const TypePtr* base_type = TypePtr::NULL_PTR;
@@ -4456,7 +4508,7 @@ bool LibraryCallKit::inline_array_copyOf(bool is_copyOfRange) {
44564508 if (!stopped ()) {
44574509 // How many elements will we copy from the original?
44584510 // The answer is MinI(orig_tail, length).
4459- Node* moved = generate_min_max (vmIntrinsics::_min, orig_tail, length);
4511+ Node* moved = _gvn. transform ( new MinINode ( orig_tail, length) );
44604512
44614513 // Generate a direct call to the right arraycopy function(s).
44624514 // We know the copy is disjoint but we might not know if the
@@ -8477,91 +8529,6 @@ bool LibraryCallKit::inline_character_compare(vmIntrinsics::ID id) {
84778529 return true ;
84788530}
84798531
8480- // ------------------------------inline_fp_min_max------------------------------
8481- bool LibraryCallKit::inline_fp_min_max (vmIntrinsics::ID id) {
8482- /* DISABLED BECAUSE METHOD DATA ISN'T COLLECTED PER CALL-SITE, SEE JDK-8015416.
8483-
8484- // The intrinsic should be used only when the API branches aren't predictable,
8485- // the last one performing the most important comparison. The following heuristic
8486- // uses the branch statistics to eventually bail out if necessary.
8487-
8488- ciMethodData *md = callee()->method_data();
8489-
8490- if ( md != nullptr && md->is_mature() && md->invocation_count() > 0 ) {
8491- ciCallProfile cp = caller()->call_profile_at_bci(bci());
8492-
8493- if ( ((double)cp.count()) / ((double)md->invocation_count()) < 0.8 ) {
8494- // Bail out if the call-site didn't contribute enough to the statistics.
8495- return false;
8496- }
8497-
8498- uint taken = 0, not_taken = 0;
8499-
8500- for (ciProfileData *p = md->first_data(); md->is_valid(p); p = md->next_data(p)) {
8501- if (p->is_BranchData()) {
8502- taken = ((ciBranchData*)p)->taken();
8503- not_taken = ((ciBranchData*)p)->not_taken();
8504- }
8505- }
8506-
8507- double balance = (((double)taken) - ((double)not_taken)) / ((double)md->invocation_count());
8508- balance = balance < 0 ? -balance : balance;
8509- if ( balance > 0.2 ) {
8510- // Bail out if the most important branch is predictable enough.
8511- return false;
8512- }
8513- }
8514- */
8515-
8516- Node *a = nullptr ;
8517- Node *b = nullptr ;
8518- Node *n = nullptr ;
8519- switch (id) {
8520- case vmIntrinsics::_maxF:
8521- case vmIntrinsics::_minF:
8522- case vmIntrinsics::_maxF_strict:
8523- case vmIntrinsics::_minF_strict:
8524- assert (callee ()->signature ()->size () == 2 , " minF/maxF has 2 parameters of size 1 each." );
8525- a = argument (0 );
8526- b = argument (1 );
8527- break ;
8528- case vmIntrinsics::_maxD:
8529- case vmIntrinsics::_minD:
8530- case vmIntrinsics::_maxD_strict:
8531- case vmIntrinsics::_minD_strict:
8532- assert (callee ()->signature ()->size () == 4 , " minD/maxD has 2 parameters of size 2 each." );
8533- a = round_double_node (argument (0 ));
8534- b = round_double_node (argument (2 ));
8535- break ;
8536- default :
8537- fatal_unexpected_iid (id);
8538- break ;
8539- }
8540- switch (id) {
8541- case vmIntrinsics::_maxF:
8542- case vmIntrinsics::_maxF_strict:
8543- n = new MaxFNode (a, b);
8544- break ;
8545- case vmIntrinsics::_minF:
8546- case vmIntrinsics::_minF_strict:
8547- n = new MinFNode (a, b);
8548- break ;
8549- case vmIntrinsics::_maxD:
8550- case vmIntrinsics::_maxD_strict:
8551- n = new MaxDNode (a, b);
8552- break ;
8553- case vmIntrinsics::_minD:
8554- case vmIntrinsics::_minD_strict:
8555- n = new MinDNode (a, b);
8556- break ;
8557- default :
8558- fatal_unexpected_iid (id);
8559- break ;
8560- }
8561- set_result (_gvn.transform (n));
8562- return true ;
8563- }
8564-
85658532bool LibraryCallKit::inline_profileBoolean () {
85668533 Node* counts = argument (1 );
85678534 const TypeAryPtr* ary = nullptr ;
0 commit comments