We ran into a bug in lower_return_val handling of a MMILOAD.  The code is 
lowered to do multiple loads of kid0, and it currently uses kid0 directly for 
the first value, and then copies of it for the next value; but if the 
lower_expr that happens for each iteration deletes the original node, then the 
next copy of the original node will fail.  Solution is to make all iterations 
use a copy.  My sources are not in sync with the trunk, so these line numbers 
don't match exactly, but I wanted to report the fix in case others want to pick 
it up; the fix is in lower_return_val handling of MMILOAD and MLOAD:
==== //sw/compiler/gpgpu/open64/src/be/com/wn_lower.cxx#44 - c:\sw\compiler\gpgp
u\open64\src\be\com\wn_lower.cxx ====
***************
*** 11250,11258 ****
            mtype = RETURN_INFO_mtype(return_info, i);
          ty_idx_used = Be_Type_Tbl(mtype);
          Set_TY_align(ty_idx_used, algn);
!         if (i == 0)
!           n_rhs = WN_kid0(o_rhs);
!         else n_rhs = WN_COPY_Tree(WN_kid0(o_rhs));
          // use Mtype_comparison in case ret mtype is 1 or 2 bytes
          n_rhs = WN_CreateIload(OPR_ILOAD, Mtype_comparison(mtype), mtype,
                                 WN_load_offset(o_rhs)
--- 11250,11258 ----
            mtype = RETURN_INFO_mtype(return_info, i);
          ty_idx_used = Be_Type_Tbl(mtype);
          Set_TY_align(ty_idx_used, algn);
!           // lower_expr may delete original n_rhs, so make sure it is copy,
!           // else will lose original o_rhs.
!         n_rhs = WN_COPY_Tree(WN_kid0(o_rhs));
          // use Mtype_comparison in case ret mtype is 1 or 2 bytes
          n_rhs = WN_CreateIload(OPR_ILOAD, Mtype_comparison(mtype), mtype,
                                 WN_load_offset(o_rhs)
***************
*** 11276,11284 ****
            mtype = RETURN_INFO_mtype(return_info, i);
          ty_idx_used = Be_Type_Tbl(mtype);
          Set_TY_align(ty_idx_used, algn);
!         if (i == 0)
!           n_rhs = WN_kid0(o_rhs);
!         else n_rhs = WN_COPY_Tree(WN_kid0(o_rhs));
          n_rhs = WN_CreateIload(OPR_ILOAD, mtype, mtype,
                                 WN_load_offset(o_rhs)
                                   + i * MTYPE_byte_size(mtype),
--- 11276,11284 ----
            mtype = RETURN_INFO_mtype(return_info, i);
          ty_idx_used = Be_Type_Tbl(mtype);
          Set_TY_align(ty_idx_used, algn);
!           // lower_expr may delete original n_rhs, so make sure it is copy,
!           // else will lose original o_rhs.
!         n_rhs = WN_COPY_Tree(WN_kid0(o_rhs));
          n_rhs = WN_CreateIload(OPR_ILOAD, mtype, mtype,
                                 WN_load_offset(o_rhs)
                                   + i * MTYPE_byte_size(mtype),
-----------------------------------------------------------------------------------
This email message is for the sole use of the intended recipient(s) and may 
contain
confidential information.  Any unauthorized review, use, disclosure or 
distribution
is prohibited.  If you are not the intended recipient, please contact the 
sender by
reply email and destroy all copies of the original message.
-----------------------------------------------------------------------------------

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to