@@ -535,7 +535,7 @@ bool SuperWord::SLP_extract() {
535
535
536
536
construct_my_pack_map ();
537
537
if (UseVectorCmov) {
538
- merge_packs_to_cmovd ();
538
+ merge_packs_to_cmove ();
539
539
}
540
540
541
541
filter_packs ();
@@ -1411,7 +1411,7 @@ int SuperWord::data_size(Node* s) {
1411
1411
if (use != NULL ) {
1412
1412
return data_size (use);
1413
1413
}
1414
- use = _cmovev_kit.is_CmpD_candidate (s);
1414
+ use = _cmovev_kit.is_Cmp_candidate (s);
1415
1415
if (use != NULL ) {
1416
1416
return data_size (use);
1417
1417
}
@@ -1845,33 +1845,19 @@ void SuperWord::filter_packs() {
1845
1845
#endif
1846
1846
}
1847
1847
1848
- // Clear the unused cmove pack and its related packs from superword candidate packset.
1849
- void SuperWord::remove_cmove_and_related_packs (Node_List* cmove_pk) {
1850
- Node* cmove = cmove_pk->at (0 );
1851
- Node* bol = cmove->as_CMove ()->in (CMoveNode::Condition);
1852
- if (my_pack (bol)) {
1853
- remove_pack (my_pack (bol));
1854
- }
1855
- Node* cmp = bol->in (1 );
1856
- if (my_pack (cmp)) {
1857
- remove_pack (my_pack (cmp));
1858
- }
1859
- remove_pack (cmove_pk);
1860
- }
1861
-
1862
- // ------------------------------merge_packs_to_cmovd---------------------------
1863
- // Merge qualified CMoveD into new vector-nodes
1864
- // We want to catch this pattern and subsume CmpD and Bool into CMoveD
1848
+ // ------------------------------merge_packs_to_cmove---------------------------
1849
+ // Merge qualified CMove into new vector-nodes
1850
+ // We want to catch this pattern and subsume Cmp and Bool into CMove
1865
1851
//
1866
- // SubD ConD
1852
+ // Sub Con
1867
1853
// / | /
1868
1854
// / | / /
1869
1855
// / | / /
1870
1856
// / | / /
1871
1857
// / / /
1872
1858
// / / | /
1873
1859
// v / | /
1874
- // CmpD | /
1860
+ // Cmp | /
1875
1861
// | | /
1876
1862
// v | /
1877
1863
// Bool | /
@@ -1880,25 +1866,20 @@ void SuperWord::remove_cmove_and_related_packs(Node_List* cmove_pk) {
1880
1866
// \ | /
1881
1867
// \ | /
1882
1868
// \ v /
1883
- // CMoveD
1869
+ // CMove
1884
1870
//
1885
- // Also delete unqualified CMove pack from the packset and clear all info.
1886
1871
1887
- void SuperWord::merge_packs_to_cmovd () {
1872
+ void SuperWord::merge_packs_to_cmove () {
1888
1873
for (int i = _packset.length () - 1 ; i >= 0 ; i--) {
1889
1874
Node_List* pk = _packset.at (i);
1890
- if (_cmovev_kit.is_cmove_pack_candidate (pk)) {
1891
- if (_cmovev_kit.can_merge_cmove_pack (pk)) {
1892
- _cmovev_kit.make_cmove_pack (pk);
1893
- } else {
1894
- remove_cmove_and_related_packs (pk);
1895
- }
1875
+ if (_cmovev_kit.can_merge_cmove_pack (pk)) {
1876
+ _cmovev_kit.make_cmove_pack (pk);
1896
1877
}
1897
1878
}
1898
1879
1899
1880
#ifndef PRODUCT
1900
1881
if (TraceSuperWord) {
1901
- tty->print_cr (" \n SuperWord::merge_packs_to_cmovd (): After merge" );
1882
+ tty->print_cr (" \n SuperWord::merge_packs_to_cmove (): After merge" );
1902
1883
print_packset ();
1903
1884
tty->cr ();
1904
1885
}
@@ -1919,7 +1900,7 @@ Node* CMoveKit::is_Bool_candidate(Node* def) const {
1919
1900
return use;
1920
1901
}
1921
1902
1922
- Node* CMoveKit::is_CmpD_candidate (Node* def) const {
1903
+ Node* CMoveKit::is_Cmp_candidate (Node* def) const {
1923
1904
Node* use = NULL ;
1924
1905
if (!def->is_Cmp () || def->in (0 ) != NULL || def->outcnt () != 1 ) {
1925
1906
return NULL ;
@@ -1933,32 +1914,28 @@ Node* CMoveKit::is_CmpD_candidate(Node* def) const {
1933
1914
return use;
1934
1915
}
1935
1916
1936
- bool CMoveKit::is_cmove_pack_candidate (Node_List* cmove_pk) {
1937
- Node* cmove = cmove_pk->at (0 );
1938
- if ((cmove->Opcode () != Op_CMoveF && cmove->Opcode () != Op_CMoveD) ||
1939
- pack (cmove) != NULL /* already in the cmove pack */ ) {
1940
- return false ;
1941
- }
1942
- return true ;
1943
- }
1944
-
1945
1917
// Determine if the current pack is an ideal cmove pack, and if its related packs,
1946
1918
// i.e. bool node pack and cmp node pack, can be successfully merged for vectorization.
1947
1919
bool CMoveKit::can_merge_cmove_pack (Node_List* cmove_pk) {
1948
1920
Node* cmove = cmove_pk->at (0 );
1949
1921
1922
+ if (!SuperWord::is_cmove_fp_opcode (cmove->Opcode ()) ||
1923
+ pack (cmove) != NULL /* already in the cmove pack */ ) {
1924
+ return false ;
1925
+ }
1926
+
1950
1927
if (cmove->in (0 ) != NULL ) {
1951
- NOT_PRODUCT (if (_sw->is_trace_cmov ()) {tty->print (" CMoveKit::make_cmove_pack : CMove %d has control flow, escaping..." , cmove->_idx ); cmove->dump ();})
1928
+ NOT_PRODUCT (if (_sw->is_trace_cmov ()) {tty->print (" CMoveKit::can_merge_cmove_pack : CMove %d has control flow, escaping..." , cmove->_idx ); cmove->dump ();})
1952
1929
return false ;
1953
1930
}
1954
1931
1955
1932
Node* bol = cmove->as_CMove ()->in (CMoveNode::Condition);
1956
1933
if (!bol->is_Bool () ||
1957
1934
bol->outcnt () != 1 ||
1958
1935
!_sw->same_generation (bol, cmove) ||
1959
- bol->in (0 ) != NULL || // BoolNode has control flow!!
1936
+ bol->in (0 ) != NULL || // Bool node has control flow!!
1960
1937
_sw->my_pack (bol) == NULL ) {
1961
- NOT_PRODUCT (if (_sw->is_trace_cmov ()) {tty->print (" CMoveKit::make_cmove_pack : Bool %d does not fit CMove %d for building vector, escaping..." , bol->_idx , cmove->_idx ); bol->dump ();})
1938
+ NOT_PRODUCT (if (_sw->is_trace_cmov ()) {tty->print (" CMoveKit::can_merge_cmove_pack : Bool %d does not fit CMove %d for building vector, escaping..." , bol->_idx , cmove->_idx ); bol->dump ();})
1962
1939
return false ;
1963
1940
}
1964
1941
Node_List* bool_pk = _sw->my_pack (bol);
@@ -1970,18 +1947,18 @@ bool CMoveKit::can_merge_cmove_pack(Node_List* cmove_pk) {
1970
1947
if (!cmp->is_Cmp () ||
1971
1948
cmp->outcnt () != 1 ||
1972
1949
!_sw->same_generation (cmp, cmove) ||
1973
- cmp->in (0 ) != NULL || // CmpNode has control flow!!
1950
+ cmp->in (0 ) != NULL || // Cmp node has control flow!!
1974
1951
_sw->my_pack (cmp) == NULL ) {
1975
- NOT_PRODUCT (if (_sw->is_trace_cmov ()) {tty->print (" CMoveKit::make_cmove_pack : Cmp %d does not fit CMove %d for building vector, escaping..." , cmp->_idx , cmove->_idx ); cmp->dump ();})
1952
+ NOT_PRODUCT (if (_sw->is_trace_cmov ()) {tty->print (" CMoveKit::can_merge_cmove_pack : Cmp %d does not fit CMove %d for building vector, escaping..." , cmp->_idx , cmove->_idx ); cmp->dump ();})
1976
1953
return false ;
1977
1954
}
1978
1955
Node_List* cmp_pk = _sw->my_pack (cmp);
1979
1956
if (cmp_pk->size () != cmove_pk->size () ) {
1980
1957
return false ;
1981
1958
}
1982
1959
1983
- if (!test_cmpd_pack (cmp_pk, cmove_pk)) {
1984
- NOT_PRODUCT (if (_sw->is_trace_cmov ()) {tty->print (" CMoveKit::make_cmove_pack : cmp pack for Cmp %d failed vectorization test" , cmp->_idx ); cmp->dump ();})
1960
+ if (!test_cmp_pack (cmp_pk, cmove_pk)) {
1961
+ NOT_PRODUCT (if (_sw->is_trace_cmov ()) {tty->print (" CMoveKit::can_merge_cmove_pack : cmp pack for Cmp %d failed vectorization test" , cmp->_idx ); cmp->dump ();})
1985
1962
return false ;
1986
1963
}
1987
1964
@@ -2019,59 +1996,59 @@ void CMoveKit::make_cmove_pack(Node_List* cmove_pk) {
2019
1996
NOT_PRODUCT (if (_sw->is_trace_cmov ()) {tty->print_cr (" CMoveKit::make_cmove_pack: added syntactic CMove pack" ); _sw->print_pack (new_cmove_pk);})
2020
1997
}
2021
1998
2022
- bool CMoveKit::test_cmpd_pack (Node_List* cmpd_pk , Node_List* cmovd_pk ) {
2023
- Node* cmpd0 = cmpd_pk ->at (0 );
2024
- assert (cmpd0 ->is_Cmp (), " CMoveKit::test_cmpd_pack : should be CmpDNode " );
2025
- assert (cmovd_pk ->at (0 )->is_CMove (), " CMoveKit::test_cmpd_pack : should be CMoveD " );
2026
- assert (cmpd_pk ->size () == cmovd_pk ->size (), " CMoveKit::test_cmpd_pack : should be same size" );
2027
- Node* in1 = cmpd0 ->in (1 );
2028
- Node* in2 = cmpd0 ->in (2 );
1999
+ bool CMoveKit::test_cmp_pack (Node_List* cmp_pk , Node_List* cmove_pk ) {
2000
+ Node* cmp0 = cmp_pk ->at (0 );
2001
+ assert (cmp0 ->is_Cmp (), " CMoveKit::test_cmp_pack : should be Cmp Node " );
2002
+ assert (cmove_pk ->at (0 )->is_CMove (), " CMoveKit::test_cmp_pack : should be CMove " );
2003
+ assert (cmp_pk ->size () == cmove_pk ->size (), " CMoveKit::test_cmp_pack : should be same size" );
2004
+ Node* in1 = cmp0 ->in (1 );
2005
+ Node* in2 = cmp0 ->in (2 );
2029
2006
Node_List* in1_pk = _sw->my_pack (in1);
2030
2007
Node_List* in2_pk = _sw->my_pack (in2);
2031
2008
2032
- if ( (in1_pk != NULL && in1_pk->size () != cmpd_pk ->size ())
2033
- || (in2_pk != NULL && in2_pk->size () != cmpd_pk ->size ()) ) {
2009
+ if ( (in1_pk != NULL && in1_pk->size () != cmp_pk ->size ())
2010
+ || (in2_pk != NULL && in2_pk->size () != cmp_pk ->size ()) ) {
2034
2011
return false ;
2035
2012
}
2036
2013
2037
2014
// test if "all" in1 are in the same pack or the same node
2038
2015
if (in1_pk == NULL ) {
2039
- for (uint j = 1 ; j < cmpd_pk ->size (); j++) {
2040
- if (cmpd_pk ->at (j)->in (1 ) != in1) {
2016
+ for (uint j = 1 ; j < cmp_pk ->size (); j++) {
2017
+ if (cmp_pk ->at (j)->in (1 ) != in1) {
2041
2018
return false ;
2042
2019
}
2043
- }// for: in1_pk is not pack but all CmpD nodes in the pack have the same in(1)
2020
+ }// for: in1_pk is not pack but all Cmp nodes in the pack have the same in(1)
2044
2021
}
2045
2022
// test if "all" in2 are in the same pack or the same node
2046
2023
if (in2_pk == NULL ) {
2047
- for (uint j = 1 ; j < cmpd_pk ->size (); j++) {
2048
- if (cmpd_pk ->at (j)->in (2 ) != in2) {
2024
+ for (uint j = 1 ; j < cmp_pk ->size (); j++) {
2025
+ if (cmp_pk ->at (j)->in (2 ) != in2) {
2049
2026
return false ;
2050
2027
}
2051
- }// for: in2_pk is not pack but all CmpD nodes in the pack have the same in(2)
2052
- }
2053
- // now check if cmpd_pk may be subsumed in vector built for cmovd_pk
2054
- int cmovd_ind1, cmovd_ind2 ;
2055
- if (cmpd_pk ->at (0 )->in (1 ) == cmovd_pk ->at (0 )->as_CMove ()->in (CMoveNode::IfFalse)
2056
- && cmpd_pk ->at (0 )->in (2 ) == cmovd_pk ->at (0 )->as_CMove ()->in (CMoveNode::IfTrue)) {
2057
- cmovd_ind1 = CMoveNode::IfFalse;
2058
- cmovd_ind2 = CMoveNode::IfTrue;
2059
- } else if (cmpd_pk ->at (0 )->in (2 ) == cmovd_pk ->at (0 )->as_CMove ()->in (CMoveNode::IfFalse)
2060
- && cmpd_pk ->at (0 )->in (1 ) == cmovd_pk ->at (0 )->as_CMove ()->in (CMoveNode::IfTrue)) {
2061
- cmovd_ind2 = CMoveNode::IfFalse;
2062
- cmovd_ind1 = CMoveNode::IfTrue;
2028
+ }// for: in2_pk is not pack but all Cmp nodes in the pack have the same in(2)
2029
+ }
2030
+ // now check if cmp_pk may be subsumed in vector built for cmove_pk
2031
+ int cmove_ind1, cmove_ind2 ;
2032
+ if (cmp_pk ->at (0 )->in (1 ) == cmove_pk ->at (0 )->as_CMove ()->in (CMoveNode::IfFalse)
2033
+ && cmp_pk ->at (0 )->in (2 ) == cmove_pk ->at (0 )->as_CMove ()->in (CMoveNode::IfTrue)) {
2034
+ cmove_ind1 = CMoveNode::IfFalse;
2035
+ cmove_ind2 = CMoveNode::IfTrue;
2036
+ } else if (cmp_pk ->at (0 )->in (2 ) == cmove_pk ->at (0 )->as_CMove ()->in (CMoveNode::IfFalse)
2037
+ && cmp_pk ->at (0 )->in (1 ) == cmove_pk ->at (0 )->as_CMove ()->in (CMoveNode::IfTrue)) {
2038
+ cmove_ind2 = CMoveNode::IfFalse;
2039
+ cmove_ind1 = CMoveNode::IfTrue;
2063
2040
}
2064
2041
else {
2065
2042
return false ;
2066
2043
}
2067
2044
2068
- for (uint j = 1 ; j < cmpd_pk ->size (); j++) {
2069
- if (cmpd_pk ->at (j)->in (1 ) != cmovd_pk ->at (j)->as_CMove ()->in (cmovd_ind1 )
2070
- || cmpd_pk ->at (j)->in (2 ) != cmovd_pk ->at (j)->as_CMove ()->in (cmovd_ind2 )) {
2045
+ for (uint j = 1 ; j < cmp_pk ->size (); j++) {
2046
+ if (cmp_pk ->at (j)->in (1 ) != cmove_pk ->at (j)->as_CMove ()->in (cmove_ind1 )
2047
+ || cmp_pk ->at (j)->in (2 ) != cmove_pk ->at (j)->as_CMove ()->in (cmove_ind2 )) {
2071
2048
return false ;
2072
2049
}// if
2073
2050
}
2074
- NOT_PRODUCT (if (_sw->is_trace_cmov ()) { tty->print (" CMoveKit::test_cmpd_pack: cmpd pack for 1st CmpD %d is OK for vectorization: " , cmpd0 ->_idx ); cmpd0 ->dump (); })
2051
+ NOT_PRODUCT (if (_sw->is_trace_cmov ()) { tty->print (" CMoveKit::test_cmp_pack: cmp pack for 1st Cmp %d is OK for vectorization: " , cmp0 ->_idx ); cmp0 ->dump (); })
2075
2052
return true ;
2076
2053
}
2077
2054
@@ -2099,6 +2076,9 @@ bool SuperWord::implemented(Node_List* p) {
2099
2076
// integer subword types with superword vectorization.
2100
2077
// See JDK-8294816 for miscompilation issues with shorts.
2101
2078
return false ;
2079
+ } else if (is_cmove_fp_opcode (opc)) {
2080
+ retValue = is_cmov_pack (p) && VectorNode::implemented (opc, size, velt_basic_type (p0));
2081
+ NOT_PRODUCT (if (retValue && is_trace_cmov ()) {tty->print_cr (" SWPointer::implemented: found cmove pack" ); print_pack (p);})
2102
2082
} else {
2103
2083
// Vector unsigned right shift for signed subword types behaves differently
2104
2084
// from Java Spec. But when the shift amount is a constant not greater than
@@ -2108,7 +2088,6 @@ bool SuperWord::implemented(Node_List* p) {
2108
2088
opc = Op_RShiftI;
2109
2089
}
2110
2090
retValue = VectorNode::implemented (opc, size, velt_basic_type (p0));
2111
- NOT_PRODUCT (if (retValue && is_trace_cmov () && is_cmov_pack (p)) {tty->print_cr (" SWPointer::implemented: found cmpd pack" ); print_pack (p);})
2112
2091
}
2113
2092
}
2114
2093
return retValue;
@@ -3719,16 +3698,6 @@ void SuperWord::remove_pack_at(int pos) {
3719
3698
_packset.remove_at (pos);
3720
3699
}
3721
3700
3722
- // ------------------------------remove_pack------------------------------
3723
- // Remove the pack in the packset
3724
- void SuperWord::remove_pack (Node_List* p) {
3725
- for (uint i = 0 ; i < p->size (); i++) {
3726
- Node* s = p->at (i);
3727
- set_my_pack (s, NULL );
3728
- }
3729
- _packset.remove (p);
3730
- }
3731
-
3732
3701
void SuperWord::packset_sort (int n) {
3733
3702
// simple bubble sort so that we capitalize with O(n) when its already sorted
3734
3703
while (n != 0 ) {
0 commit comments