Hi Sun,
I made a mistake in the previous patch. I only handled the case for
iload. I don't handle the istore. Could you please review the new
patch again:
Index: opt_htable.cxx
===================================================================
--- opt_htable.cxx (revision 3688)
+++ opt_htable.cxx (working copy)
@@ -2534,9 +2534,13 @@
CODEREP *retv;
OPERATOR oper = OPCODE_operator(opc);
+ // make sure the dtyp for constant base is Pointer_type
+ if (lbase != NULL && lbase->Kind() == CK_CONST
+ && lbase->Dtyp() != Pointer_type)
+ lbase->Set_dtyp_strictly(Pointer_type);
+ if (sbase != NULL && sbase->Kind() == CK_CONST
+ && sbase->Dtyp() != Pointer_type)
+ sbase->Set_dtyp_strictly(Pointer_type);
cr->Init_ivar(opc, dtyp, occ, dsctyp, lodty, lbase, sbase,
ofst, size, field_id);
2011/7/9 Sun Chan <[email protected]>:
> looks good
> Sun
>
> On Fri, Jul 8, 2011 at 8:11 PM, Jian-Xin Lai <[email protected]> wrote:
>> Hi,
>>
>> Can someone review the patch for bug #830. Thank you very much.
>>
>> For the ILOAD from address const 0xffffffffffff8001, the WHIRL IR is:
>> U8INTCONST -32767 (0xffffffffffff8001)
>> I4I4ILOAD 0 T<4,.predef_I4,4> T<53,anon_ptr.,8>
>>
>> when creating the CODEREP, after calling CANON_CR::Trim_to_16bits(),
>> the base of ILOAD will be trunk to 0 and -32767 will be stored to the
>> offset of the ILOAD. In current WOPT, the generated IR is:
>> U4INTCONST 0 (0x0)
>> I4I4ILOAD -32767 T<4,.predef_I4,4> T<53,anon_ptr.,8>
>>
>> We can find the type of the address is converted to U4. This is done
>> by CODEREP::Set_dtyp_const_val(MTYPE dt, INT64 v). When the constant
>> is in the range of U4, the dtyp will be set to U4. This will cause bad
>> code generation in CG. Since both the base and offset are 4 bytes, the
>> CG will generate ldc32 for the constant and finally generate the movl
>> instruction.
>>
>> Here is a patch to address this issue. The basic idea is to make sure
>> the dtyp for address is always Pointer_type.
>> Index: osprey/be/opt/opt_htable.cxx
>> ===================================================================
>> --- osprey/be/opt/opt_htable.cxx (revision 3648)
>> +++ osprey/be/opt/opt_htable.cxx (working copy)
>> @@ -2534,6 +2534,10 @@
>> CODEREP *retv;
>> OPERATOR oper = OPCODE_operator(opc);
>>
>> + // make sure the dtyp for address const is Pointer_type
>> + if (lbase->Kind() == CK_CONST && lbase->Dtyp() != Pointer_type)
>> + lbase->Set_dtyp_strictly(Pointer_type);
>> +
>> cr->Init_ivar(opc, dtyp, occ, dsctyp, lodty, lbase, sbase,
>> ofst, size, field_id);
>> // all IVAR codereps have a mu_node
>>
>>
>> --
>> 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
>> [email protected]
>> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/open64-devel