re PR target/49244 (__sync or __atomic builtins will not emit 'lock bts/btr/btc')
authorJakub Jelinek <jakub@redhat.com>
Mon, 2 May 2016 22:12:54 +0000 (00:12 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 2 May 2016 22:12:54 +0000 (00:12 +0200)
PR target/49244
* gimple.c (gimple_builtin_call_types_compatible_p): Allow
char/short arguments promoted to int because of promote_prototypes.

From-SVN: r235792

gcc/ChangeLog
gcc/gimple.c

index 9515120..028f43a 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-02  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/49244
+       * gimple.c (gimple_builtin_call_types_compatible_p): Allow
+       char/short arguments promoted to int because of promote_prototypes.
+
 2016-05-02  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/predicates.md (register_ssemem_operand): New predicate.
index b0e19d5..25d965c 100644 (file)
@@ -2486,7 +2486,16 @@ gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl)
       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);
     }