Hi,

Would a gatekeeper please review my fix for bug629?

https://bugs.open64.net/show_bug.cgi?id=629



The assertion happens in opt_htable.h (#981), because Const_val expects a
CK_CONST.



The root cause for the problem is inside the simplifier (wn_simp_code.h).
Inside SIMPNODE_SimplifyExp2_h, SIMP_Is_Constant is used to detect whether
k1 is a constant or not. For example,

   5754    k0const = SIMP_Is_Constant(k0);

   5755    k1const = SIMP_Is_Constant(k1);

SIMP_Is_Constant was enhanced to return true for string constant as well.



While in the simplifying functions (e.g., simp_bxor, simp_bior), only
int_const is expected. For example,

   4040    if (k1const) {

   4041       c1 = SIMP_Int_ConstVal(k1);

   4042       ...

When k1 is a str constant, the assertion happens.



My fix is to add a function, SIMP_Int_Str_ConstVal, to handle both int and
string constant case. The uses of SIMP_Int_ConstVal inside simplifying
functions are changed to SIMP_Int_Str_ConstVal.

Thanks,



Min



Index: wn_simp_code.h

===================================================================

--- wn_simp_code.h      (revision 3444)

+++ wn_simp_code.h      (working copy)

@@ -530,6 +530,16 @@

 }

 #endif // KEY



+inline INT64 SIMP_Int_Str_ConstVal(simpnode x)

+{

+    if (SIMP_Is_Int_Constant (x))

+        return SIMP_Int_ConstVal(x);

+    else if (SIMP_Is_Str_Constant (x))

+        return Targ_To_Host(SIMP_Str_ConstVal(x));

+    else

+        Fail_FmtAssertion("Not a int/str constant");

+}

+

 #define IS_POWER_OF_2(x) (((x)!=0) && ((x) & ((x)-1))==0)



 /* Utility routine to create a 64 bit number with from 0 to 64 bits in it.

@@ -3644,7 +3654,7 @@

    ty = OPCODE_rtype(opc);



    if (k1const) {

-      c1 = SIMP_Int_ConstVal(k1);

+      c1 = SIMP_Int_Str_ConstVal(k1);

       if (c1 == 0) {

       SHOW_RULE("j&0");

       r = SIMP_INTCONST(ty,0);

@@ -3803,18 +3813,8 @@

    ty = OPCODE_rtype(opc);



    if (k1const) {

-#ifdef TARG_IA64

-      if (SIMP_Is_Int_Constant (k1)) {

-         c1 = SIMP_Int_ConstVal(k1);

-      } else if (SIMP_Is_Str_Constant (k1)) {

-         c1 = Targ_To_Host (SIMP_Str_ConstVal (k1));

-      } else {

-         Fail_FmtAssertion ("Not a int/str constant");

-      }

-#else

-       c1 = SIMP_Int_ConstVal(k1);

-#endif

-      if (c1 == 0) {

+     c1 = SIMP_Int_Str_ConstVal(k1);

+     if (c1 == 0) {

       SHOW_RULE("j|0");

       r = k0;

       SIMP_DELETE(k1);

@@ -4038,7 +4038,7 @@

    ty = OPCODE_rtype(opc);



    if (k1const) {

-      c1 = SIMP_Int_ConstVal(k1);

+      c1 = SIMP_Int_Str_ConstVal(k1);

       if (c1 == 0) {

       SHOW_RULE("j^0");

       r = k0;

@@ -4123,7 +4123,7 @@

    ty = OPCODE_rtype(opc);



    if (k1const) {

-      c1 = SIMP_Int_ConstVal(k1);

+      c1 = SIMP_Int_Str_ConstVal(k1);

       if (c1 == 0) {

       SHOW_RULE(" j&&0");

       r = SIMP_INTCONST(ty,0);

@@ -4195,7 +4195,7 @@

    ty = OPCODE_rtype(opc);



    if (k1const) {

-      c1 = SIMP_Int_ConstVal(k1);

+      c1 = SIMP_Int_Str_ConstVal(k1);

       if (c1 == 0) {

       SHOW_RULE("j||0");

       r = k0;

@@ -4253,7 +4253,7 @@

    INT64   c1;



    if (k0const) {

-     c1 = SIMP_Int_ConstVal(k0);

+     c1 = SIMP_Int_Str_ConstVal(k0);

      if (c1 == 0) {

        SHOW_RULE(" 0 c&& j");

        r = SIMP_INTCONST(OPCODE_rtype(opc),0);

@@ -4265,7 +4265,7 @@

      SIMP_DELETE(k0);

       }

    } else if (k1const) {

-     c1 = SIMP_Int_ConstVal(k1);

+     c1 = SIMP_Int_Str_ConstVal(k1);

      if (c1 != 0) {

        SHOW_RULE(" j c&& 1");

        r = k0;

@@ -4311,7 +4311,7 @@

 #endif



    if (k0const) {

-     c1 = SIMP_Int_ConstVal(k0);

+     c1 = SIMP_Int_Str_ConstVal(k0);

      if (c1 == 0) {

        SHOW_RULE("0 c|| j");

        r = k1;

@@ -4323,7 +4323,7 @@

        SIMP_DELETE_TREE(k1);

      }

    } else if (k1const) {

-     c1 = SIMP_Int_ConstVal(k1);

+     c1 = SIMP_Int_Str_ConstVal(k1);

       if (c1 == 0) {

      SHOW_RULE("j c|| 0");

      r = k0;
------------------------------------------------------------------------------
Forrester recently released a report on the Return on Investment (ROI) of
Google Apps. They found a 300% ROI, 38%-56% cost savings, and break-even
within 7 months.  Over 3 million businesses have gone Google with Google Apps:
an online email calendar, and document program that's accessible from your 
browser. Read the Forrester report: http://p.sf.net/sfu/googleapps-sfnew
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to