From fd39794afaedab9f102cede19852ec74e8a1ee17 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 3 May 2016 00:12:54 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/gimple.c | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) 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); } -- 2.30.2