2009 // Do match stores, despite no ideal reg
2010 mem_op = true;
2011 break;
2012 }
2013 if( n->is_Mem() ) { // Loads and LoadStores
2014 mem_op = true;
2015 // Loads must be root of match tree due to prior load conflict
2016 if( C->subsume_loads() == false )
2017 set_shared(n);
2018 }
2019 // Fall into default case
2020 if( !n->ideal_reg() )
2021 set_dontcare(n); // Unmatchable Nodes
2022 } // end_switch
2023
2024 for(int i = n->req() - 1; i >= 0; --i) { // For my children
2025 Node *m = n->in(i); // Get ith input
2026 if (m == NULL) continue; // Ignore NULLs
2027 uint mop = m->Opcode();
2028
2029 // Must clone all producers of flags, or we will not match correctly.
2030 // Suppose a compare setting int-flags is shared (e.g., a switch-tree)
2031 // then it will match into an ideal Op_RegFlags. Alas, the fp-flags
2032 // are also there, so we may match a float-branch to int-flags and
2033 // expect the allocator to haul the flags from the int-side to the
2034 // fp-side. No can do.
2035 if( _must_clone[mop] ) {
2036 mstack.push(m, Visit);
2037 continue; // for(int i = ...)
2038 }
2039
2040 if( mop == Op_AddP && m->in(AddPNode::Base)->is_DecodeNarrowPtr()) {
2041 // Bases used in addresses must be shared but since
2042 // they are shared through a DecodeN they may appear
2043 // to have a single use so force sharing here.
2044 set_shared(m->in(AddPNode::Base)->in(1));
2045 }
2046
2047 // Clone addressing expressions as they are "free" in memory access instructions
2048 if( mem_op && i == MemNode::Address && mop == Op_AddP ) {
|
2009 // Do match stores, despite no ideal reg
2010 mem_op = true;
2011 break;
2012 }
2013 if( n->is_Mem() ) { // Loads and LoadStores
2014 mem_op = true;
2015 // Loads must be root of match tree due to prior load conflict
2016 if( C->subsume_loads() == false )
2017 set_shared(n);
2018 }
2019 // Fall into default case
2020 if( !n->ideal_reg() )
2021 set_dontcare(n); // Unmatchable Nodes
2022 } // end_switch
2023
2024 for(int i = n->req() - 1; i >= 0; --i) { // For my children
2025 Node *m = n->in(i); // Get ith input
2026 if (m == NULL) continue; // Ignore NULLs
2027 uint mop = m->Opcode();
2028
2029 // Only push the input of a FlagsProj if it only has the FlagsProj
2030 // as output. Otherwise all inputs to the node that produces FlagsProj
2031 // will be marked as shared.
2032 if (n->is_FlagsProj()) {
2033 if (m->outcnt() == 1) {
2034 mstack.push(m, Visit);
2035 }
2036 continue; // for(int i = ...)
2037 }
2038 // Must clone all producers of flags, or we will not match correctly.
2039 // Suppose a compare setting int-flags is shared (e.g., a switch-tree)
2040 // then it will match into an ideal Op_RegFlags. Alas, the fp-flags
2041 // are also there, so we may match a float-branch to int-flags and
2042 // expect the allocator to haul the flags from the int-side to the
2043 // fp-side. No can do.
2044 if( _must_clone[mop] ) {
2045 mstack.push(m, Visit);
2046 continue; // for(int i = ...)
2047 }
2048
2049 if( mop == Op_AddP && m->in(AddPNode::Base)->is_DecodeNarrowPtr()) {
2050 // Bases used in addresses must be shared but since
2051 // they are shared through a DecodeN they may appear
2052 // to have a single use so force sharing here.
2053 set_shared(m->in(AddPNode::Base)->in(1));
2054 }
2055
2056 // Clone addressing expressions as they are "free" in memory access instructions
2057 if( mem_op && i == MemNode::Address && mop == Op_AddP ) {
|