$subject, applied.

Richard.

2014-08-06  Richard Biener  <rguent...@suse.de>

        * gimple-fold.h (gimple_simplify): Add two-parameter builtin
        function overload.
        * gimple-match-head.c (gimple_simplify): Implement it.

Index: gcc/gimple-fold.h
===================================================================
--- gcc/gimple-fold.h   (revision 213651)
+++ gcc/gimple-fold.h   (working copy)
@@ -117,6 +117,8 @@ tree gimple_simplify (enum tree_code, tr
                      gimple_seq *, tree (*)(tree));
 tree gimple_simplify (enum built_in_function, tree, tree,
                      gimple_seq *, tree (*)(tree));
+tree gimple_simplify (enum built_in_function, tree, tree, tree,
+                     gimple_seq *, tree (*)(tree));
 /* The following two APIs are an artifact and should vanish in favor
    of the existing gimple_fold_stmt_to_constant and fold_stmt APIs.  */
 tree gimple_simplify (tree, gimple_seq *, tree (*)(tree));
Index: gcc/gimple-match-head.c
===================================================================
--- gcc/gimple-match-head.c     (revision 213655)
+++ gcc/gimple-match-head.c     (working copy)
@@ -464,6 +464,37 @@ gimple_simplify (enum built_in_function
   return maybe_push_res_to_seq (rcode, type, ops, seq);
 }
 
+tree
+gimple_simplify (enum built_in_function fn, tree type,
+                tree arg0, tree arg1,
+                gimple_seq *seq, tree (*valueize)(tree))
+{
+  if (constant_for_folding (arg0)
+      && constant_for_folding (arg1))
+    {
+      tree decl = builtin_decl_implicit (fn);
+      if (decl)
+       {
+         tree res = fold_builtin_n (UNKNOWN_LOCATION, decl, &arg0, 2, false);
+         if (res)
+           {
+             /* fold_builtin_n wraps the result inside a NOP_EXPR.  */
+             STRIP_NOPS (res);
+             res = fold_convert (type, res);
+             if (CONSTANT_CLASS_P (res))
+               return res;
+           }
+       }
+    }
+
+  code_helper rcode;
+  tree ops[3] = {};
+  if (!gimple_simplify (&rcode, ops, seq, valueize,
+                       fn, type, arg0, arg1))
+    return NULL_TREE;
+  return maybe_push_res_to_seq (rcode, type, ops, seq);
+}
+
 static bool
 gimple_simplify (gimple stmt,
                 code_helper *rcode, tree *ops,

Reply via email to