This patch looks fine to me. Please go ahead.

2011/6/25 Xiaohua Zhang <xiaohua_zh...@yahoo.com>:
> Hi,
>
> Could a gatekeeper help to review the fix for bug 799?
>
> Thanks,
> -Xiaohua
>
> The small test case is:
>
> #include <stdio.h>
> int rval = 0;
> typedef struct S { double i; } S;
> S f(void);
> typedef struct {
>     int f1;
>     struct S f2;
> } S1;
> S1 m;
> struct S t =  { 0.0 };
> int main(void)
> {
>         t.i = 12.345;
>         m.f2 = f();   // return value should be in xmm0
>         if (m.f2.i != t.i) {
>            rval = -1;
>            printf("Failed!\n");
>         }
>         return rval;
> }
> struct S f(void)
> {
>         return t;
> }
>
> The WHIRL tree for "m.f2 = f()" looks like:
>
> MCALL 126 <1,53,f> # flags 0x7e {line: 1/20}
>   MMLDID -1 <1,49,.preg_return_val> T<53,S,8>
> MSTID 8 <1,54,m> T<55,.anonymous.1,8> <field_id:2> {line: 0/0}
>
> After the RETURN_VAL & MLDID/MSTID lowering:
>
>  MCALL 126 <1,53,f> # flags 0x7e {line: 1/20}
>   I8I8LDID 1 <1,5,.preg_I8> T<5,.predef_I8,8> # $r1
>  I8STID 8 <1,54,m> T<5,.predef_I8,8> {line: 0/0}
>   F8F8LDID 17 <1,11,.preg_F8> T<11,.predef_F8,8> # $f0
>  F8STID 16 <1,54,m> T<11,.predef_F8,8> {line: 0/0}
>
> The return value (S) is returned by two register: $r1 and $f0.
> By the ABI, the f()'s return value (type struct S) should be returned by one
> floating register $f0.
> The problem is in lower_return_mstid(), which takes MSTID's type (S1) as
> return type, didn't consider the field (f2) it accessed. So it used the
> wrong type (S1)to get return info, and the return value for S2 is by
> register $r1 and $f0.
>
> The fix is to get the accessed field type as return type.
>
>
>
>
>
> ----------------------
>
> Index: be/com/wn_lower.cxx
> ===================================================================
> --- be/com/wn_lower.cxx (revision 3659)
> +++ be/com/wn_lower.cxx (working copy)
> @@ -7239,7 +7239,12 @@
>    ST *preg_st;
>    WN *n_rhs;
>    WN *wn = NULL;       // init to prevent upward-exposed use
> -  RETURN_INFO return_info = Get_Return_Info(WN_ty(tree),
> Complex_Not_Simulated
> +  TY_IDX ty_idx  = WN_ty(tree);
> +
> +  if (WN_field_id (tree) != 0)
> +    ty_idx = get_field_type (ty_idx, WN_field_id (tree));
> +
> +  RETURN_INFO return_info = Get_Return_Info(ty_idx, Complex_Not_Simulated
>  #ifdef TARG_X8664
>                                             , last_call_ff2c_abi
>  #endif
> @@ -7260,7 +7265,7 @@
>  #endif
>      WN *awn = WN_CreateLda(OPR_LDA, Pointer_Mtype, MTYPE_V,
>                            WN_store_offset(tree),
> -                          Make_Pointer_Type(WN_ty(tree)), WN_st_idx(tree));
> +                          Make_Pointer_Type(ty_idx), WN_st_idx(tree));
>      awn = lower_expr(block, awn, actions);
>      WN *n_call = add_fake_parm(call, awn, WN_ty(awn));
>      WN_DELETE_FromBlock(block, call);
> @@ -7277,9 +7282,9 @@
>        mtype = RETURN_INFO_mtype(return_info, i);
>        desc = mtype;
>  #ifdef KEY
> -      if (MTYPE_byte_size(mtype) > TY_size(WN_ty(tree)) &&
> !MTYPE_float(mtype)){
> +      if (MTYPE_byte_size(mtype) > TY_size(ty_idx) && !MTYPE_float(mtype)){
>         desc = Mtype_AlignmentClass(1, MTYPE_type_class(mtype));
> -       while (MTYPE_byte_size(desc) < TY_size(WN_ty(tree)))
> +       while (MTYPE_byte_size(desc) < TY_size(ty_idx))
>           desc = Mtype_next_alignment(desc);
>        }
>  #endif
> @@ -7287,7 +7292,7 @@
>
>  #if defined(TARG_PPC32)
>        if (preg_st == Int_Preg) {
> -        UINT rem = TY_size(WN_ty(tree)) - i * 4;
> +        UINT rem = TY_size(ty_idx) - i * 4;
>          if (1 == rem) desc = MTYPE_I1;
>          if (2 == rem) desc = MTYPE_I2;
>        }
>
>
>
> ------------------------------------------------------------------------------
> All the data continuously generated in your IT infrastructure contains a
> definitive record of customers, application performance, security
> threats, fraudulent activity and more. Splunk takes this data and makes
> sense of it. Business sense. IT sense. Common sense..
> http://p.sf.net/sfu/splunk-d2d-c1
> _______________________________________________
> Open64-devel mailing list
> Open64-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/open64-devel
>
>



-- 
Regards,
Lai Jian-Xin

------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security 
threats, fraudulent activity, and more. Splunk takes this data and makes 
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to