From: Jakub Jelinek Date: Mon, 2 May 2016 22:12:54 +0000 (+0200) Subject: re PR target/49244 (__sync or __atomic builtins will not emit 'lock bts/btr/btc') X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fd39794afaedab9f102cede19852ec74e8a1ee17;p=gcc.git re PR target/49244 (__sync or __atomic builtins will not emit 'lock bts/btr/btc') 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 951512028c6..028f43aeb24 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-05-02 Jakub Jelinek + + 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 * config/i386/predicates.md (register_ssemem_operand): New predicate. diff --git a/gcc/gimple.c b/gcc/gimple.c index b0e19d515cf..25d965cead2 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -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); }