On Tue, Aug 3, 2021 at 9:11 AM Jakub Jelinek via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > Hi! > > The following testcase ICEs because DECL_FUNCTION_CODE asserts the builtin > is BUILT_IN_NORMAL, but it sees a backend (MD) builtin instead. > The FE, normal and MD builtin numbers overlap, so one should always > check what kind of builtin it is before looking at specific codes. > > Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for > trunk?
OK. > On the other side, region-model.cc has: > if (fndecl_built_in_p (callee_fndecl, BUILT_IN_NORMAL) > && gimple_builtin_call_types_compatible_p (call, callee_fndecl)) > switch (DECL_UNCHECKED_FUNCTION_CODE (callee_fndecl)) > which IMO should use DECL_FUNCTION_CODE instead, it checked first it is > a normal builtin... > > 2021-08-03 Jakub Jelinek <ja...@redhat.com> > > PR analyzer/101721 > * sm-malloc.cc (known_allocator_p): Only check DECL_FUNCTION_CODE on > BUILT_IN_NORMAL builtins. > > * gcc.dg/analyzer/pr101721.c: New test. > > --- gcc/analyzer/sm-malloc.cc.jj 2021-07-29 13:24:42.664013344 +0200 > +++ gcc/analyzer/sm-malloc.cc 2021-08-02 17:42:17.312821855 +0200 > @@ -1543,7 +1543,7 @@ known_allocator_p (const_tree fndecl, co > > /* ... or it is a builtin allocator that allocates objects freed with > __builtin_free. */ > - if (fndecl_built_in_p (fndecl)) > + if (fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)) > switch (DECL_FUNCTION_CODE (fndecl)) > { > case BUILT_IN_MALLOC: > --- gcc/testsuite/gcc.dg/analyzer/pr101721.c.jj 2021-08-02 17:48:50.375370371 > +0200 > +++ gcc/testsuite/gcc.dg/analyzer/pr101721.c 2021-08-02 17:49:38.967696432 > +0200 > @@ -0,0 +1,8 @@ > +/* PR analyzer/101721 */ > +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ > + > +void > +foo () > +{ > + __builtin_ia32_pause (); > +} > > Jakub >