Handle internal_fn in operand_equal_p
authorTom de Vries <tom@codesourcery.com>
Fri, 17 Apr 2015 09:26:50 +0000 (09:26 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Fri, 17 Apr 2015 09:26:50 +0000 (09:26 +0000)
2015-04-17  Tom de Vries  <tom@codesourcery.com>

* fold-const.c (operand_equal_p): Handle INTERNAL_FNs.
* calls.c (call_expr_flags): Same.

From-SVN: r222172

gcc/ChangeLog
gcc/calls.c
gcc/fold-const.c

index b653b58c385f14828fdbc4291e48d1df3333091f..54c3ccfe1635bba48da42e1be28e5ba2e3c798f7 100644 (file)
@@ -1,3 +1,8 @@
+2015-04-17  Tom de Vries  <tom@codesourcery.com>
+
+       * fold-const.c (operand_equal_p): Handle INTERNAL_FNs.
+       * calls.c (call_expr_flags): Same.
+
 2015-04-17  Tom de Vries  <tom@codesourcery.com>
 
        * tree-stdarg.c (optimize_va_list_gpr_fpr_size): Factor out of ...
index 32ea4eb1f5404fddf94ba0002b2d74445556d2d8..3be7ca5f4a58ffeb2d3b1a34d10b01a3d520f71e 100644 (file)
@@ -847,6 +847,8 @@ call_expr_flags (const_tree t)
 
   if (decl)
     flags = flags_from_decl_or_type (decl);
+  else if (CALL_EXPR_FN (t) == NULL_TREE)
+    flags = internal_fn_flags (CALL_EXPR_IFN (t));
   else
     {
       t = TREE_TYPE (CALL_EXPR_FN (t));
index 6d085b185895f715d99a53a9e706295aa983d52a..3654fd670b064ff83788a9655c740532bce3449b 100644 (file)
@@ -3045,11 +3045,26 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
       switch (TREE_CODE (arg0))
        {
        case CALL_EXPR:
-         /* If the CALL_EXPRs call different functions, then they
-            clearly can not be equal.  */
-         if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
-                                flags))
+         if ((CALL_EXPR_FN (arg0) == NULL_TREE)
+             != (CALL_EXPR_FN (arg1) == NULL_TREE))
+           /* If not both CALL_EXPRs are either internal or normal function
+              functions, then they are not equal.  */
            return 0;
+         else if (CALL_EXPR_FN (arg0) == NULL_TREE)
+           {
+             /* If the CALL_EXPRs call different internal functions, then they
+                are not equal.  */
+             if (CALL_EXPR_IFN (arg0) != CALL_EXPR_IFN (arg1))
+               return 0;
+           }
+         else
+           {
+             /* If the CALL_EXPRs call different functions, then they are not
+                equal.  */
+             if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
+                                    flags))
+               return 0;
+           }
 
          {
            unsigned int cef = call_expr_flags (arg0);