sorry for missing this. This change is not target independent is it?
Sun

On Tue, Jun 28, 2011 at 11:08 AM, Jian-Xin Lai <laij...@gmail.com> wrote:
> 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
>

------------------------------------------------------------------------------
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