On May 2, 2016 6:29:55 PM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote: >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?
OK. Thanks, Richard. >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