This fixes a new ICE I caused by breaking out HAS_DECL_ASSEMBLER_NAME_P from DECL_ASSEMBLER_NAME_SET_P. alias.c needs to check it. As it's doing explicit HAS and SET checking, it might as well use the RAW accessor too.

Committing as obvious.

nathan
--
Nathan Sidwell
2017-10-17  Nathan Sidwell  <nat...@acm.org>

	gcc/
	PR middle-end/82577
	* alias.c (compare_base_decls): Check HAS_DECL_ASSEMBLER_NAME_P,
	use DECL_ASSEMBLER_NAME_RAW.

	gcc/testsuite/
	PR middle-end/82577
	* g++.dg/opt/pr82577.C: New.

Index: alias.c
===================================================================
--- alias.c	(revision 253818)
+++ alias.c	(working copy)
@@ -2047,13 +2047,15 @@ compare_base_decls (tree base1, tree bas
     return 1;
 
   /* If we have two register decls with register specification we
-     cannot decide unless their assembler name is the same.  */
+     cannot decide unless their assembler names are the same.  */
   if (DECL_REGISTER (base1)
       && DECL_REGISTER (base2)
+      && HAS_DECL_ASSEMBLER_NAME_P (base1)
+      && HAS_DECL_ASSEMBLER_NAME_P (base2)
       && DECL_ASSEMBLER_NAME_SET_P (base1)
       && DECL_ASSEMBLER_NAME_SET_P (base2))
     {
-      if (DECL_ASSEMBLER_NAME (base1) == DECL_ASSEMBLER_NAME (base2))
+      if (DECL_ASSEMBLER_NAME_RAW (base1) == DECL_ASSEMBLER_NAME_RAW (base2))
 	return 1;
       return -1;
     }
Index: testsuite/g++.dg/opt/pr82577.C
===================================================================
--- testsuite/g++.dg/opt/pr82577.C	(revision 0)
+++ testsuite/g++.dg/opt/pr82577.C	(working copy)
@@ -0,0 +1,17 @@
+// { dg-additional-options "-O2" }
+// PR c++/82577 ICE when optimizing
+
+class a {
+public:
+  int *b();
+};
+struct c {
+  int d;
+  a e;
+} f;
+void fn1(register c *g) {
+  register int *h;
+  do
+    (h) = g->e.b() + (g)->d;
+  while (&f);
+}

Reply via email to