From e48050bd060e5faeae80c4c833e14fe3885ed599 Mon Sep 17 00:00:00 2001
From: Eric Botcazou <ebotcazou@libertysurf.fr>
Date: Wed, 19 Oct 2005 16:42:17 +0200
Subject: [PATCH] re PR middle-end/23199 (ICE in int_mode_for_mode, at
 stor-layout.c:251)

	PR middle-end/23199
	* cfgrtl.c (safe_insert_insn_on_edge): Use can_copy_p to detect
	whether registers live on the edge can be saved/restored.

From-SVN: r105618
---
 gcc/ChangeLog                             |  6 ++++
 gcc/cfgrtl.c                              | 10 ++-----
 gcc/testsuite/ChangeLog                   |  4 +++
 gcc/testsuite/gcc.dg/profile-generate-2.c | 35 +++++++++++++++++++++++
 4 files changed, 47 insertions(+), 8 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/profile-generate-2.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4963ef9d0c5d..45d936ae2730 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-10-19  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+	PR middle-end/23199
+	* cfgrtl.c (safe_insert_insn_on_edge): Use can_copy_p to detect
+	whether registers live on the edge can be saved/restored.
+
 2005-10-19  Kaz Kojima  <kkojima@gcc.gnu.org>
 
 	* config/sh/sh.c (fixup_mova): Skip notes.
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 00a219d48028..f49eceb16575 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -1456,16 +1456,9 @@ safe_insert_insn_on_edge (rtx insn, edge e)
   regset killed;
   rtx save_regs = NULL_RTX;
   unsigned regno;
-  int noccmode;
   enum machine_mode mode;
   reg_set_iterator rsi;
 
-#ifdef AVOID_CCMODE_COPIES
-  noccmode = true;
-#else
-  noccmode = false;
-#endif
-
   killed = ALLOC_REG_SET (&reg_obstack);
 
   for (x = insn; x; x = NEXT_INSN (x))
@@ -1491,7 +1484,8 @@ safe_insert_insn_on_edge (rtx insn, edge e)
       if (mode == VOIDmode)
 	return false;
 
-      if (noccmode && mode == CCmode)
+      /* Avoid copying in CCmode if we can't.  */
+      if (!can_copy_p (mode))
 	return false;
 	
       save_regs = alloc_EXPR_LIST (0,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a79e36e1f8db..860f92784c76 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2005-10-19  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+	* gcc.dg/profile-generate-2.c: New test.
+
 2005-10-18  Danny Smith  <dannysmith@users.sourceforge.net>
 
 	PR target/23589
diff --git a/gcc/testsuite/gcc.dg/profile-generate-2.c b/gcc/testsuite/gcc.dg/profile-generate-2.c
new file mode 100644
index 000000000000..eaea065f5267
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/profile-generate-2.c
@@ -0,0 +1,35 @@
+/* PR middle-end/23199 */
+/* Testcase by Ralf Menzel <menzel@ls6.cs.uni-dortmund.de> */
+
+/* { dg-do compile } */
+/* { dg-options "-O -fprofile-generate" } */
+
+union rtunion_def
+{
+  struct rtx_def *rt_rtx;
+};
+
+typedef union rtunion_def rtunion;
+
+struct rtx_def
+{
+  unsigned int in_struct : 1;
+  union u {
+    rtunion fld[1];
+  } u;
+};
+
+typedef struct rtx_def *rtx;
+
+static void
+check_annul_list_true_false (int annul_true_p, rtx delay_list)
+{
+  rtx temp;
+  while (1)
+    {
+      temp = delay_list;
+      rtx trial = (((temp)->u.fld[0]).rt_rtx);
+      if ((annul_true_p && (((trial))->in_struct)))
+       return;
+    }
+}
-- 
GitLab