Hi!

Most of the builtins don't pass arguments in char/short types,
except for some sync/atomic builtins, some sanitizer builtins and
TM builtins.
On targets where targetm.calls.promote_prototypes returns true (e.g. always
on x86_64/i686), unfortunately this means that gimple_call_builtin_p
often returns false for those, e.g. on __sync_fetch_and_add_2, because
the second argument has been promoted to int from unsigned short.
We actually expand those right, because we don't check that during
expansion, but e.g. such atomics aren't instrumented with -fsanitize=thread
because of this etc.

The following patch allows those cases.  Bootstrapped/regtested on
x86_64-linux and i686-linux, ok for trunk?

2016-05-02  Jakub Jelinek  <ja...@redhat.com>

        PR target/49244
        * gimple.c (gimple_builtin_call_types_compatible_p): Allow
        char/short arguments promoted to int because of promote_prototypes.

--- gcc/gimple.c.jj     2016-03-11 17:37:43.000000000 +0100
+++ gcc/gimple.c        2016-05-02 12:20:16.490716014 +0200
@@ -2486,7 +2486,16 @@ gimple_builtin_call_types_compatible_p (
       if (!targs)
        return true;
       tree arg = gimple_call_arg (stmt, i);
-      if (!useless_type_conversion_p (TREE_VALUE (targs), TREE_TYPE (arg)))
+      tree type = TREE_VALUE (targs);
+      if (!useless_type_conversion_p (type, TREE_TYPE (arg))
+         /* char/short integral arguments are promoted to int
+            by several frontends if targetm.calls.promote_prototypes
+            is true.  Allow such promotion too.  */
+         && !(INTEGRAL_TYPE_P (type)
+              && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
+              && targetm.calls.promote_prototypes (TREE_TYPE (fndecl))
+              && useless_type_conversion_p (integer_type_node,
+                                            TREE_TYPE (arg))))
        return false;
       targs = TREE_CHAIN (targs);
     }


        Jakub

Reply via email to