< prev index next >

src/hotspot/share/opto/loopopts.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 3027,3046 **** // bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) { assert(!loop->_head->is_CountedLoop(), "Non-counted loop only"); if (!loop->_head->is_Loop()) { ! return false; } ! LoopNode *head = loop->_head->as_Loop(); if (head->is_partial_peel_loop() || head->partial_peel_has_failed()) { return false; } // Check for complex exit control ! for(uint ii = 0; ii < loop->_body.size(); ii++ ) { Node *n = loop->_body.at(ii); int opc = n->Opcode(); if (n->is_Call() || opc == Op_Catch || opc == Op_CatchProj || --- 3027,3046 ---- // bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) { assert(!loop->_head->is_CountedLoop(), "Non-counted loop only"); if (!loop->_head->is_Loop()) { ! return false; ! } LoopNode *head = loop->_head->as_Loop(); if (head->is_partial_peel_loop() || head->partial_peel_has_failed()) { return false; } // Check for complex exit control ! for (uint ii = 0; ii < loop->_body.size(); ii++) { Node *n = loop->_body.at(ii); int opc = n->Opcode(); if (n->is_Call() || opc == Op_Catch || opc == Op_CatchProj ||
*** 3063,3078 **** // which is executed on every path thru loop. IfNode *peel_if = NULL; IfNode *peel_if_cmpu = NULL; Node *iff = loop->tail(); ! while( iff != head ) { ! if( iff->is_If() ) { Node *ctrl = get_ctrl(iff->in(1)); if (ctrl->is_top()) return false; // Dead test on live IF. // If loop-varying exit-test, check for induction variable ! if( loop->is_member(get_loop(ctrl)) && loop->is_loop_exit(iff) && is_possible_iv_test(iff)) { Node* cmp = iff->in(1)->in(1); if (cmp->Opcode() == Op_CmpI) { peel_if = iff->as_If(); --- 3063,3078 ---- // which is executed on every path thru loop. IfNode *peel_if = NULL; IfNode *peel_if_cmpu = NULL; Node *iff = loop->tail(); ! while (iff != head) { ! if (iff->is_If()) { Node *ctrl = get_ctrl(iff->in(1)); if (ctrl->is_top()) return false; // Dead test on live IF. // If loop-varying exit-test, check for induction variable ! if (loop->is_member(get_loop(ctrl)) && loop->is_loop_exit(iff) && is_possible_iv_test(iff)) { Node* cmp = iff->in(1)->in(1); if (cmp->Opcode() == Op_CmpI) { peel_if = iff->as_If();
*** 3082,3091 **** --- 3082,3092 ---- } } } iff = idom(iff); } + // Prefer signed compare over unsigned compare. IfNode* new_peel_if = NULL; if (peel_if == NULL) { if (!PartialPeelAtUnsignedTests || peel_if_cmpu == NULL) { return false; // No peel point found
*** 3129,3139 **** VectorSet not_peel(area); Node_List peel_list(area); Node_List worklist(area); Node_List sink_list(area); ! if (!may_require_nodes(est_loop_clone_sz(2, loop->_body.size()))) { return false; } // Set of cfg nodes to peel are those that are executable from // the head through last_peel. --- 3130,3140 ---- VectorSet not_peel(area); Node_List peel_list(area); Node_List worklist(area); Node_List sink_list(area); ! if (!may_require_nodes(loop->est_loop_clone_sz(2))) { return false; } // Set of cfg nodes to peel are those that are executable from // the head through last_peel.
< prev index next >