This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix ICE with bogus posix_memalign call (PR middle-end/67222)
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Marek Polacek <polacek at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 18 Aug 2015 12:47:45 +0200
- Subject: Re: [PATCH] Fix ICE with bogus posix_memalign call (PR middle-end/67222)
- Authentication-results: sourceware.org; auth=none
- References: <20150817180100 dot GI2093 at redhat dot com> <CAFiYyc1QUHFDGLpn4ChW6qC5L6T-NsfU3pMhLx_-0GtbuHMA7w at mail dot gmail dot com> <20150818102854 dot GJ2093 at redhat dot com>
On Tue, Aug 18, 2015 at 12:28 PM, Marek Polacek <polacek@redhat.com> wrote:
> On Tue, Aug 18, 2015 at 10:47:44AM +0200, Richard Biener wrote:
>> On Mon, Aug 17, 2015 at 8:01 PM, Marek Polacek <polacek@redhat.com> wrote:
>> > Here we were crashing on an invalid call to posix_memalign. The code in
>> > lower_builtin_posix_memalign assumed that the call had valid arguments.
>> > The reason the C FE doesn't reject this code is, in short, that
>> > int <T> () is compatible with int <T> (void **, size_t, size_t) and we
>> > use the former -- so convert_arguments doesn't complain.
>> >
>> > So I think let's validate the arguments in lower_stmt. I decided to
>> > give an error if we see an invalid usage of posix_memalign, since
>> > other code (e.g. alias machinery) assumes correct arguments as well.
>> >
>> > Bootstrapped/regtested on x86_64-linux, ok for trunk?
>>
>> I don't think you can give errors here. Note that the "appropriate"
>> way to do the check is to simply use
>
> Yeah, because the weirdo call is only undefined if it's reached at runtime,
> right.
>
>> if (gimple_builtin_call_types_compatible_p (stmt, decl))
>
> Nice, dunno how could I not find that.
>
>> not lowering in case it's not compatible is ok.
>
> In that case I also need to check a place in tree-ssa-alias.c.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk and 5?
Please instead change the tree-ssa-alias.c code to do
if (callee != NULL
&& gimple_call_builtin_p (call, BUILT_IN_NORMAL))
switch (DECL_FUNCTION_CODE (callee))
...
which should also fix quite a few issues in the other builtin handlings.
Likewise can you change stmt_kills_ref_p and ref_maybe_used_by_call_p_1
in a similar way?
Thanks,
Richard.
> 2015-08-18 Marek Polacek <polacek@redhat.com>
>
> PR middle-end/67222
> * gimple-low.c (lower_stmt): Check the posix_memalign call.
> * tree-ssa-alias.c (call_may_clobber_ref_p_1): Likewise.
>
> * gcc.dg/torture/pr67222.c: New test.
>
> diff --git gcc/gimple-low.c gcc/gimple-low.c
> index d4697e2..4eae3a0 100644
> --- gcc/gimple-low.c
> +++ gcc/gimple-low.c
> @@ -346,7 +346,8 @@ lower_stmt (gimple_stmt_iterator *gsi, struct lower_data *data)
> return;
> }
> else if (DECL_FUNCTION_CODE (decl) == BUILT_IN_POSIX_MEMALIGN
> - && flag_tree_bit_ccp)
> + && flag_tree_bit_ccp
> + && gimple_builtin_call_types_compatible_p (stmt, decl))
> {
> lower_builtin_posix_memalign (gsi);
> return;
> diff --git gcc/testsuite/gcc.dg/torture/pr67222.c gcc/testsuite/gcc.dg/torture/pr67222.c
> index e69de29..739f869 100644
> --- gcc/testsuite/gcc.dg/torture/pr67222.c
> +++ gcc/testsuite/gcc.dg/torture/pr67222.c
> @@ -0,0 +1,19 @@
> +/* PR middle-end/67222 */
> +/* { dg-do compile } */
> +
> +void
> +foo (void **p)
> +{
> + posix_memalign (); /* { dg-warning "implicit declaration" } */
> + posix_memalign (p);
> + posix_memalign (0);
> + posix_memalign (p, 1);
> + posix_memalign (p, "foo");
> + posix_memalign ("gnu", "gcc");
> + posix_memalign (1, p);
> + posix_memalign (1, 2);
> + posix_memalign (1, 2, 3);
> + posix_memalign (p, p, p);
> + posix_memalign (p, "qui", 3);
> + posix_memalign (p, 1, 2);
> +}
> diff --git gcc/tree-ssa-alias.c gcc/tree-ssa-alias.c
> index e103220..e96a00c 100644
> --- gcc/tree-ssa-alias.c
> +++ gcc/tree-ssa-alias.c
> @@ -2039,6 +2039,10 @@ call_may_clobber_ref_p_1 (gcall *call, ao_ref *ref)
> by its first argument. */
> case BUILT_IN_POSIX_MEMALIGN:
> {
> + /* For weirdo calls we cannot say much so stay conservative. */
> + tree decl = gimple_call_fndecl (call);
> + if (!gimple_builtin_call_types_compatible_p (call, decl))
> + return true;
> tree ptrptr = gimple_call_arg (call, 0);
> ao_ref dref;
> ao_ref_init_from_ptr_and_size (&dref, ptrptr,
>
> Marek