Author: minz
Date: 2011-02-04 14:02:19 -0500 (Fri, 04 Feb 2011)
New Revision: 3472
Modified:
trunk/osprey/be/opt/opt_loop.cxx
Log:
Fix for bug 717:
Reset ISOP_INVARIANT_VISITED for the CK_IVAR (and its children) if
CK_IVAR is loop variant, since CK_OP can be a child of a CR_IVAR.
Not resetting ISOP_INVARIANT_VISITED will make CK_OP be treated as loop
invariant for another loop, in which CK_OP is loop variant.
Code Review: Sun Chan
Modified: trunk/osprey/be/opt/opt_loop.cxx
===================================================================
--- trunk/osprey/be/opt/opt_loop.cxx 2011-02-01 08:01:30 UTC (rev 3471)
+++ trunk/osprey/be/opt/opt_loop.cxx 2011-02-04 19:02:19 UTC (rev 3472)
@@ -564,26 +564,27 @@
case CK_IVAR:
{
- CODEREP *base =
- cr->Istr_base() ? cr->Istr_base() : cr->Ilod_base();
- if ( ! Invariant_cr_rec(base) )
- return FALSE;
- if ( cr->Opr() == OPR_MLOAD && ! Invariant_cr_rec( cr->Mload_size() ) )
- return FALSE;
- if ( cr->Opr() == OPR_ILOADX && ! Invariant_cr_rec( cr->Index() ) )
- return FALSE;
+ CODEREP *base = cr->Istr_base() ? cr->Istr_base() : cr->Ilod_base();
+
+ // volatile references are never loop invariant
+ if (cr->Is_ivar_volatile() ||
+ !Invariant_cr_rec(base) ||
+ (cr->Opr() == OPR_MLOAD && ! Invariant_cr_rec( cr->Mload_size())) ||
+ (cr->Opr() == OPR_ILOADX && ! Invariant_cr_rec( cr->Index()))) {
+ if ( WOPT_Enable_Prune )
+ cr->Reset_isop_visited( ISOP_INVARIANT_VISITED );
+ return FALSE;
+ }
MU_NODE *mnode = cr->Ivar_mu_node();
if ( mnode ) {
- CODEREP *opnd = mnode->OPND();
- if ( opnd && ! Invariant_cr_rec( opnd ) )
- return FALSE;
+ CODEREP *opnd = mnode->OPND();
+ if ( opnd && ! Invariant_cr_rec( opnd ) ) {
+ if ( WOPT_Enable_Prune )
+ cr->Reset_isop_visited( ISOP_INVARIANT_VISITED );
+ return FALSE;
+ }
}
- }
- // volatile references are never loop invariant
- if ( cr->Is_ivar_volatile() )
- return FALSE;
-
// no need to check Ivar_defstmt. It is NULL unless
// there is a ISTORE of the base address.
//
@@ -593,7 +594,7 @@
// return ( ! True_body_set()->MemberP( cr->Ivar_defstmt()->Bb() ) );
return TRUE;
-
+ }
case CK_OP:
{
if ( cr->Is_isop_flag_set( ISOP_INVARIANT_VISITED )
------------------------------------------------------------------------------
The modern datacenter depends on network connectivity to access resources
and provide services. The best practices for maximizing a physical server's
connectivity to a physical network are well understood - see how these
rules translate into the virtual world?
http://p.sf.net/sfu/oracle-sfdevnlfb
_______________________________________________
Open64-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/open64-devel