On Fri, 22 Mar 2019, Christophe Lyon wrote:

> 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.

Fixed like following.

Bootstrapped / tested on x86_64-unknown-linux-gnu, applied.

Richard.

2019-03-25  Richard Biener  <rguent...@suse.de>

        PR middle-end/89790
        * fold-const.c (operand_equal_p): Revert last change with
        updated comment.

        * g++.dg/pr89790.C: New testcase.

Index: gcc/fold-const.c
===================================================================
--- gcc/fold-const.c    (revision 269905)
+++ gcc/fold-const.c    (working copy)
@@ -2973,6 +2973,11 @@ 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 template id),
+     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/g++.dg/pr89790.C
===================================================================
--- gcc/testsuite/g++.dg/pr89790.C      (revision 0)
+++ gcc/testsuite/g++.dg/pr89790.C      (working copy)
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// { dg-options "-Wduplicated-cond" }
+
+template <typename>
+class a
+{
+  typedef a b;
+  template <typename> void c();
+};
+template <typename d> template <typename>
+void a<d>::c()
+{
+  int f;
+  b g;
+  if (g == 0)
+    ;
+  else if (f)
+    {
+    }
+}

Reply via email to