Hi,

I have some simple questions I hope somebody can answer.

Given

WN* op1;
WN* op2;

With op1 being

  U8U8LDID
 U4U8CVT

and op2 being

  I4I4LDID
 INEG

I wrote

op2 = WN_Type_Conversion(op2, MTYPE_U4);
op1 = WN_Add(MTYPE_U4, op2, op1);

I was surprised to see the WHIRL as

   U8U8LDID
  U4U8CVT
  I4I4LDID
 I4SUB

I really wanted an unsigned since I want to zero-extend that to an MTYPE_U8
with a U8U4CVT, but with the I4SUB, my code trips into generating an U8I4CVT
which sign-extends, not zero-extends.

I even tried a WN_Type_Conversion after the WN_Add but that didn't do much.

Tracking it down, I have two questions/concerns:

- WN_Int_Type_Conversion (called from WN_Type_Conversion) pretty much treats I4s
and U4s as identical.  So when I called WN_Type_Conversion on 'op2', it just
returned the INEG node.

- WN_Add eventually calls simp_add_sub() inside wn_simp_code.h.  It
wants to fold
the INEG away by turning the ADD into a SUB.  No problem on the
surface, but I found
code near the top of simp_add_sub()

   if (issub) {
      subop = opc;
      addop = OPC_FROM_OPR(OPR_ADD,ty);
   } else {
      addop = opc;
      subop = OPC_FROM_OPR(OPR_SUB,ty);
#ifdef TARG_X8664 // bug 11400: if any operand is signed type, make SUB signed
      if (MTYPE_signed(SIMPNODE_rtype(k0)) || MTYPE_signed(SIMPNODE_rtype(k1)))
        subop = OPC_FROM_OPR(OPR_SUB, Mtype_TransferSign(MTYPE_I4, ty));
#endif

so later when the code simplifies the ADD/NEG into a SUB, you get a MTYPE_I4,
not the requested MTYPE_U4. (I'm on a X8664 target of course)

      } else if (SIMPNODE_operator(k1)==OPR_NEG) {
         SHOW_RULE(" x + (-y) ");
         r = SIMPNODE_SimpCreateExp2(subop,k0,SIMPNODE_kid0(k1));
         SIMP_DELETE(k1);


So finally to my questions:

Seems I cannot trust WN_Add to honor my MTYPE_U4 requests for X8664 targets?
Why just for X8664?  If it is a matter of algebraic correctness, why not all
targets?  If it is some assumption on the eventual generated code, seems risky.

WN_Int_Type_Conversion doesn't seem to help me out of this situation with its
I4/U4 equality.

I noticed what wgen avoids WN_Type_Conversion and calls WN_Cvt itself when
converts are needed.  Is WN_Type_Conversion only for certain situations and
not for general use?

Thanks!

John

------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to