Mercurial > hg > graal-jvmci-8
comparison src/share/vm/opto/loopopts.cpp @ 2445:08eb13460b3a
7004535: Clone loop predicate during loop unswitch
Summary: Clone loop predicate for clonned loops
Reviewed-by: never
author | kvn |
---|---|
date | Sat, 02 Apr 2011 10:54:15 -0700 |
parents | 9dc311b8473e |
children | 6c97c830fb6f |
comparison
equal
deleted
inserted
replaced
2444:07acc51c1d2a | 2445:08eb13460b3a |
---|---|
2137 // Step 4: update the dominator tree and recompute the | 2137 // Step 4: update the dominator tree and recompute the |
2138 // dominator depth. | 2138 // dominator depth. |
2139 // | 2139 // |
2140 // orig | 2140 // orig |
2141 // | 2141 // |
2142 // stmt1 | 2142 // stmt1 |
2143 // | | 2143 // | |
2144 // v | 2144 // v |
2145 // loop predicate | |
2146 // | | |
2147 // v | |
2145 // loop<----+ | 2148 // loop<----+ |
2146 // | | | 2149 // | | |
2147 // stmt2 | | 2150 // stmt2 | |
2148 // | | | 2151 // | | |
2149 // v | | 2152 // v | |
2170 // | 2173 // |
2171 // | 2174 // |
2172 // after clone loop | 2175 // after clone loop |
2173 // | 2176 // |
2174 // stmt1 | 2177 // stmt1 |
2178 // | | |
2179 // v | |
2180 // loop predicate | |
2175 // / \ | 2181 // / \ |
2176 // clone / \ orig | 2182 // clone / \ orig |
2177 // / \ | 2183 // / \ |
2178 // / \ | 2184 // / \ |
2179 // v v | 2185 // v v |
2208 // | 2214 // |
2209 // | 2215 // |
2210 // after partial peel | 2216 // after partial peel |
2211 // | 2217 // |
2212 // stmt1 | 2218 // stmt1 |
2219 // | | |
2220 // v | |
2221 // loop predicate | |
2213 // / | 2222 // / |
2214 // clone / orig | 2223 // clone / orig |
2215 // / TOP | 2224 // / TOP |
2216 // / \ | 2225 // / \ |
2217 // v v | 2226 // v v |
2218 // TOP->region region----+ | 2227 // TOP->loop loop----+ |
2219 // | | | | 2228 // | | | |
2220 // stmt2 stmt2 | | 2229 // stmt2 stmt2 | |
2221 // | | | | 2230 // | | | |
2222 // v v | | 2231 // v v | |
2223 // ifA ifA | | 2232 // ifA ifA | |
2251 // final graph | 2260 // final graph |
2252 // | 2261 // |
2253 // stmt1 | 2262 // stmt1 |
2254 // | | 2263 // | |
2255 // v | 2264 // v |
2265 // stmt2 clone | |
2266 // | | |
2267 // v | |
2256 // ........> ifA clone | 2268 // ........> ifA clone |
2257 // : / | | 2269 // : / | |
2258 // dom / | | 2270 // dom / | |
2259 // : v v | 2271 // : v v |
2260 // : false true | 2272 // : false true |
2261 // : | | | 2273 // : | | |
2262 // : | stmt2 clone | 2274 // : | v |
2275 // : | loop predicate | |
2263 // : | | | 2276 // : | | |
2264 // : | v | 2277 // : | v |
2265 // : | newloop<-----+ | 2278 // : | newloop<-----+ |
2266 // : | | | | 2279 // : | | | |
2267 // : | stmt3 clone | | 2280 // : | stmt3 clone | |
2287 // v | 2300 // v |
2288 // exitA | 2301 // exitA |
2289 // | 2302 // |
2290 bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) { | 2303 bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) { |
2291 | 2304 |
2305 assert(!loop->_head->is_CountedLoop(), "Non-counted loop only"); | |
2292 if (!loop->_head->is_Loop()) { | 2306 if (!loop->_head->is_Loop()) { |
2293 return false; } | 2307 return false; } |
2294 | 2308 |
2295 LoopNode *head = loop->_head->as_Loop(); | 2309 LoopNode *head = loop->_head->as_Loop(); |
2296 | 2310 |
2314 #endif | 2328 #endif |
2315 return false; | 2329 return false; |
2316 } | 2330 } |
2317 } | 2331 } |
2318 | 2332 |
2333 Node* entry = head->in(LoopNode::EntryControl); | |
2319 int dd = dom_depth(head); | 2334 int dd = dom_depth(head); |
2320 | 2335 |
2321 // Step 1: find cut point | 2336 // Step 1: find cut point |
2322 | 2337 |
2323 // Walk up dominators to loop head looking for first loop exit | 2338 // Walk up dominators to loop head looking for first loop exit |
2610 } | 2625 } |
2611 } | 2626 } |
2612 | 2627 |
2613 // Backedge of the surviving new_head (the clone) is original last_peel | 2628 // Backedge of the surviving new_head (the clone) is original last_peel |
2614 _igvn.hash_delete(new_head_clone); | 2629 _igvn.hash_delete(new_head_clone); |
2630 Node* new_entry = move_loop_predicates(entry, new_head_clone->in(LoopNode::EntryControl)); | |
2631 new_head_clone->set_req(LoopNode::EntryControl, new_entry); | |
2615 new_head_clone->set_req(LoopNode::LoopBackControl, last_peel); | 2632 new_head_clone->set_req(LoopNode::LoopBackControl, last_peel); |
2616 _igvn._worklist.push(new_head_clone); | 2633 _igvn._worklist.push(new_head_clone); |
2617 | 2634 |
2618 // Cut first node in original not_peel set | 2635 // Cut first node in original not_peel set |
2619 _igvn.hash_delete(new_head); | 2636 _igvn.hash_delete(new_head); |