Mercurial > hg > truffle
comparison src/share/vm/opto/matcher.cpp @ 1579:e9ff18c4ace7
Merge
author | jrose |
---|---|
date | Wed, 02 Jun 2010 22:45:42 -0700 |
parents | c18cbe5936b8 3657cb01ffc5 |
children | f55c4f82ab9d |
comparison
equal
deleted
inserted
replaced
1562:dfe27f03244a | 1579:e9ff18c4ace7 |
---|---|
1332 break; // m->in(0)? If so, we can use it | 1332 break; // m->in(0)? If so, we can use it |
1333 } | 1333 } |
1334 if( j == max_scan ) // No post-domination before scan end? | 1334 if( j == max_scan ) // No post-domination before scan end? |
1335 return true; // Then break the match tree up | 1335 return true; // Then break the match tree up |
1336 } | 1336 } |
1337 if (m->is_DecodeN() && Matcher::clone_shift_expressions) { | 1337 if (m->is_DecodeN() && Matcher::narrow_oop_use_complex_address()) { |
1338 // These are commonly used in address expressions and can | 1338 // These are commonly used in address expressions and can |
1339 // efficiently fold into them on X64 in some cases. | 1339 // efficiently fold into them on X64 in some cases. |
1340 return false; | 1340 return false; |
1341 } | 1341 } |
1342 } | 1342 } |
2108 } | 2108 } |
2109 if( push_it ) { | 2109 if( push_it ) { |
2110 _null_check_tests.push(proj); | 2110 _null_check_tests.push(proj); |
2111 Node* val = cmp->in(1); | 2111 Node* val = cmp->in(1); |
2112 #ifdef _LP64 | 2112 #ifdef _LP64 |
2113 if (UseCompressedOops && !Matcher::clone_shift_expressions && | 2113 if (val->bottom_type()->isa_narrowoop() && |
2114 val->bottom_type()->isa_narrowoop()) { | 2114 !Matcher::narrow_oop_use_complex_address()) { |
2115 // | 2115 // |
2116 // Look for DecodeN node which should be pinned to orig_proj. | 2116 // Look for DecodeN node which should be pinned to orig_proj. |
2117 // On platforms (Sparc) which can not handle 2 adds | 2117 // On platforms (Sparc) which can not handle 2 adds |
2118 // in addressing mode we have to keep a DecodeN node and | 2118 // in addressing mode we have to keep a DecodeN node and |
2119 // use it to do implicit NULL check in address. | 2119 // use it to do implicit NULL check in address. |
2125 for (uint i = 0; i < orig_proj->outcnt(); i++) { | 2125 for (uint i = 0; i < orig_proj->outcnt(); i++) { |
2126 Node* d = orig_proj->raw_out(i); | 2126 Node* d = orig_proj->raw_out(i); |
2127 if (d->is_DecodeN() && d->in(1) == val) { | 2127 if (d->is_DecodeN() && d->in(1) == val) { |
2128 val = d; | 2128 val = d; |
2129 val->set_req(0, NULL); // Unpin now. | 2129 val->set_req(0, NULL); // Unpin now. |
2130 // Mark this as special case to distinguish from | |
2131 // a regular case: CmpP(DecodeN, NULL). | |
2132 val = (Node*)(((intptr_t)val) | 1); | |
2130 break; | 2133 break; |
2131 } | 2134 } |
2132 } | 2135 } |
2133 } | 2136 } |
2134 #endif | 2137 #endif |
2144 void Matcher::validate_null_checks( ) { | 2147 void Matcher::validate_null_checks( ) { |
2145 uint cnt = _null_check_tests.size(); | 2148 uint cnt = _null_check_tests.size(); |
2146 for( uint i=0; i < cnt; i+=2 ) { | 2149 for( uint i=0; i < cnt; i+=2 ) { |
2147 Node *test = _null_check_tests[i]; | 2150 Node *test = _null_check_tests[i]; |
2148 Node *val = _null_check_tests[i+1]; | 2151 Node *val = _null_check_tests[i+1]; |
2152 bool is_decoden = ((intptr_t)val) & 1; | |
2153 val = (Node*)(((intptr_t)val) & ~1); | |
2149 if (has_new_node(val)) { | 2154 if (has_new_node(val)) { |
2155 Node* new_val = new_node(val); | |
2156 if (is_decoden) { | |
2157 assert(val->is_DecodeN() && val->in(0) == NULL, "sanity"); | |
2158 // Note: new_val may have a control edge if | |
2159 // the original ideal node DecodeN was matched before | |
2160 // it was unpinned in Matcher::collect_null_checks(). | |
2161 // Unpin the mach node and mark it. | |
2162 new_val->set_req(0, NULL); | |
2163 new_val = (Node*)(((intptr_t)new_val) | 1); | |
2164 } | |
2150 // Is a match-tree root, so replace with the matched value | 2165 // Is a match-tree root, so replace with the matched value |
2151 _null_check_tests.map(i+1, new_node(val)); | 2166 _null_check_tests.map(i+1, new_val); |
2152 } else { | 2167 } else { |
2153 // Yank from candidate list | 2168 // Yank from candidate list |
2154 _null_check_tests.map(i+1,_null_check_tests[--cnt]); | 2169 _null_check_tests.map(i+1,_null_check_tests[--cnt]); |
2155 _null_check_tests.map(i,_null_check_tests[--cnt]); | 2170 _null_check_tests.map(i,_null_check_tests[--cnt]); |
2156 _null_check_tests.pop(); | 2171 _null_check_tests.pop(); |