On Thu, 21 Mar 2019 at 14:44, Richard Biener <rguent...@suse.de> wrote:
>
> On Thu, 21 Mar 2019, Richard Biener wrote:
>
> >
> > This also avoids the ICE in PR89779 but IMHO is not a real fix.
> >
> > Still it restores a previously active check against released SSA names
> > which now have error_mark_node type rather than NULL.  The new way
> > opens up consolidation so I've adjusted tree_nop_conversion plus
> > operand_equal_p which got a defensive check at the same time
> > (and checks for error_mark_node right before that check).
> >
> > Bootstrap & regtest running on x86_64-unknown-linux-gnu.
> >
> > The testcase comes with the other patch (but still included below).
>
> Ugh, looks like my defense installed for released SSA names is now
> relied upon by the C++ FE via
>
> #2  0x0000000001864a96 in tree_strip_nop_conversions (
>     exp=<convert_expr 0x7ffff69bc920>)
>     at /space/rguenther/src/svn/trunk2/gcc/tree.c:12848
> #3  0x0000000000ab2d2f in iterative_hash_template_arg (
>     arg=<convert_expr 0x7ffff69bc920>, val=3363282904)
>     at /space/rguenther/src/svn/trunk2/gcc/cp/pt.c:1751
>
> for
>
>  <convert_expr 0x7ffff69bc920
>     type <integer_type 0x7ffff68985e8 int public type_6 SI
>         size <integer_cst 0x7ffff689c078 constant 32>
>         unit-size <integer_cst 0x7ffff689c090 constant 4>
>         align:32 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
> 0x7ffff68985e8 precision:32 min <integer_cst 0x7ffff689c030 -2147483648>
> max <integer_cst 0x7ffff689c048 2147483647>
>         pointer_to_this <pointer_type 0x7ffff68a19d8>>
>
>     arg:0 <scope_ref 0x7ffff69d0b40 tree_0
>         arg:0 <template_type_parm 0x7ffff69d17e0 i tree_0 type_0 type_6
> VOID
>             align:8 warn_if_not_align:0 symtab:0 alias-set -1
> canonical-type 0x7ffff69d1150
>            index 0 level 1 orig_level 1
>             chain <type_decl 0x7ffff69d2098 i>>
>         arg:1 <identifier_node 0x7ffff69c39c0 c
>             normal local bindings <(nil)>>>>
>
> where both the SCOPE_REF and TEMPLATE_TYPE_PARM have NULL
> TREE_TYPE.
>
> So I'll restore the NULL check in tree_nop_conversion.
>
> But since the C++ FE overloads almost every tree field possible
> I wonder whether that STRIP_NOPS in iterative_hash_template_arg
> is a good idea?
>
> Also I hope the FE doesn't call into operand_equal_p with such
> typed trees.
>
> Updated patch below, retesting now.
>
> Thanks,
> Richard.
>
> 2019-03-21  Richard Biener  <rguent...@suse.de>
>
>         PR tree-optimization/89779
>         * tree.c (tree_nop_conversion): Consolidate and fix defensive
>         checks with respect to released SSA names now having error_mark_node
>         type.
>         * fold-const.c (operand_equal_p): Likewise.
>
Hi,

I think this patch is causing an ICE when building gdb-8.2. I'm seeing:
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/_build/builds/destdir/x86_64-unknown-linux-gnu/include/c++/9.0.1/bits/stl_iterator_base_funcs.h:
In function 'constexpr void std::__advance(_RandomAccessIter
ator&, _Distance, std::random_access_iterator_tag)':
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/_build/builds/destdir/x86_64-unknown-linux-gnu/include/c++/9.0.1/bits/stl_iterator_base_funcs.h:182:54:
internal compiler error: Segmentation fault
  182 |       else if (__builtin_constant_p(__n) && __n == -1)
      |                                                      ^
0xf9964f crash_signal
        
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/snapshots/gcc.git~master_rev_ae5efb2cfe93a4277b5fa185c2c8582592b47f7a/gcc/toplev.c:326
0xf9964f crash_signal
        
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/snapshots/gcc.git~master_rev_ae5efb2cfe93a4277b5fa185c2c8582592b47f7a/gcc/toplev.c:326
0xf9964f crash_signal
        
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/snapshots/gcc.git~master_rev_ae5efb2cfe93a4277b5fa185c2c8582592b47f7a/gcc/toplev.c:326
0xc980dc operand_equal_p(tree_node const*, tree_node const*, unsigned int)
        
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/snapshots/gcc.git~master_rev_ae5efb2cfe93a4277b5fa185c2c8582592b47f7a/gcc/fold-const.c:2977
0xc9829a operand_equal_p(tree_node const*, tree_node const*, unsigned int)
        
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/snapshots/gcc.git~master_rev_ae5efb2cfe93a4277b5fa185c2c8582592b47f7a/gcc/fold-const.c:2950
0x9c1cf5 cp_parser_selection_statement
        
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/snapshots/gcc.git~master_rev_ae5efb2cfe93a4277b5fa185c2c8582592b47f7a/gcc/cp/parser.c:11784
0x9c1cf5 cp_parser_statement
        
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/snapshots/gcc.git~master_rev_ae5efb2cfe93a4277b5fa185c2c8582592b47f7a/gcc/cp/parser.c:11147
0x9db9a7 cp_parser_implicitly_scoped_statement
        
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/snapshots/gcc.git~master_rev_ae5efb2cfe93a4277b5fa185c2c8582592b47f7a/gcc/cp/parser.c:13004
0x9c1c37 cp_parser_selection_statement
        
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/snapshots/gcc.git~master_rev_ae5efb2cfe93a4277b5fa185c2c8582592b47f7a/gcc/cp/parser.c:11865
0x9c1c37 cp_parser_statement
        
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/snapshots/gcc.git~master_rev_ae5efb2cfe93a4277b5fa185c2c8582592b47f7a/gcc/cp/parser.c:11147
0x9c2218 cp_parser_statement_seq_opt
        
/home/tcwg-buildslave/workspace/tcwg-buildfarm_0/snapshots/gcc.git~master_rev_ae5efb2cfe93a4277b5fa185c2c8582592b47f7a/gcc/cp/parser.c:11628
0x9c22f8 cp_parser_compound_statement
[...]

while compiling linux-procfs.o, gdb.o, linux-waitpid.o, arch/amd64.o,
linux-ptrace.o and others

Seeing that on x86_64, arm, aarch64.

Christophe

> Index: gcc/tree.c
> ===================================================================
> --- gcc/tree.c  (revision 269832)
> +++ gcc/tree.c  (working copy)
> @@ -12812,13 +12812,10 @@ tree_nop_conversion (const_tree exp)
>    if (!CONVERT_EXPR_P (exp)
>        && TREE_CODE (exp) != NON_LVALUE_EXPR)
>      return false;
> -  if (TREE_OPERAND (exp, 0) == error_mark_node)
> -    return false;
>
>    outer_type = TREE_TYPE (exp);
>    inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
> -
> -  if (!inner_type)
> +  if (!inner_type || inner_type == error_mark_node)
>      return false;
>
>    return tree_nop_conversion_p (outer_type, inner_type);
> Index: gcc/fold-const.c
> ===================================================================
> --- gcc/fold-const.c    (revision 269832)
> +++ gcc/fold-const.c    (working copy)
> @@ -2973,11 +2973,6 @@ operand_equal_p (const_tree arg0, const_
>        || TREE_TYPE (arg1) == error_mark_node)
>      return 0;
>
> -  /* Similar, if either does not have a type (like a released SSA name),
> -     they aren't equal.  */
> -  if (!TREE_TYPE (arg0) || !TREE_TYPE (arg1))
> -    return 0;
> -
>    /* We cannot consider pointers to different address space equal.  */
>    if (POINTER_TYPE_P (TREE_TYPE (arg0))
>        && POINTER_TYPE_P (TREE_TYPE (arg1))
> Index: gcc/testsuite/gcc.dg/torture/pr89779.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/torture/pr89779.c      (nonexistent)
> +++ gcc/testsuite/gcc.dg/torture/pr89779.c      (working copy)
> @@ -0,0 +1,20 @@
> +/* { dg-do compile } */
> +
> +typedef int a;
> +void h(a);
> +void c(a *d, int b)
> +{
> +  int e, f, g;
> +  for (; e; e++)
> +    for (f = 0; f < 4; f++)
> +      if (d)
> +       for (g = e + 1; g; g++)
> +         h(d[g]);
> +}
> +void i()
> +{
> +  a *j;
> +  int k, l;
> +  for (; k; k++)
> +    c(j, l);
> +}
>

Reply via email to