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 Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel