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