From 3072961312a33b4c831b5591257589c03c3771b4 Mon Sep 17 00:00:00 2001
From: pinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Tue, 24 Jan 2006 16:27:44 +0000
Subject: [PATCH] 2006-01-24  Andrew Pinski  <pinskia@physics.uc.edu>

        PR tree-opt/25860
        * tree-ssa-pre.c (phi_translate): Return NULL
        for AGGREGATE_TYPE's.

2006-01-24  Andrew Pinski  <pinskia@physics.uc.edu>

        PR tree-opt/25860
        * gcc.c-torture/compile/pr25860.c: New test.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@110175 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                                 |  6 ++++++
 gcc/testsuite/ChangeLog                       |  5 +++++
 gcc/testsuite/gcc.c-torture/compile/pr25860.c | 20 +++++++++++++++++++
 gcc/tree-ssa-pre.c                            |  3 ++-
 4 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr25860.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3eeb33f83070..2132888d522c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-01-24  Andrew Pinski  <pinskia@physics.uc.edu>
+
+	PR tree-opt/25860
+	* tree-ssa-pre.c (phi_translate): Return NULL
+	for AGGREGATE_TYPE's.
+
 2006-01-24  Zack Weinberg  <zackw@panix.com>
 
 	* genautomata.c (process_state_for_insn_equiv_partition):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3434543725a4..b44c815dcf75 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-01-24  Andrew Pinski  <pinskia@physics.uc.edu>
+
+	PR tree-opt/25860
+	* gcc.c-torture/compile/pr25860.c: New test.
+
 2006-01-24  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
 	PR c++/25552
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr25860.c b/gcc/testsuite/gcc.c-torture/compile/pr25860.c
new file mode 100644
index 000000000000..033b567d8dee
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr25860.c
@@ -0,0 +1,20 @@
+/* We used to ICE because PRE would try to PRE the load of *Note from the
+   loop. */
+
+struct g
+{
+  int i;
+};
+struct f
+{
+  struct g i;
+};
+int GSM_RingNoteGetFullDuration(struct g)__attribute__((const));
+void savewav(struct f *gg)
+{
+  struct g *Note;
+  long i = 0,j,length=0;
+  Note = &gg->i;
+  for (j=0;j<GSM_RingNoteGetFullDuration(*Note);j++)
+    ;
+}
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index a695e90807bc..ebc40cff5d76 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -1159,7 +1159,8 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
 	VEC (tree, gc) * oldvuses = NULL;
 	VEC (tree, gc) * newvuses = NULL;
 
-	if (TREE_CODE (expr) != INDIRECT_REF)
+	if (TREE_CODE (expr) != INDIRECT_REF
+	    || AGGREGATE_TYPE_P (TREE_TYPE (expr)))
 	  return NULL;
 
 	newop1 = phi_translate (find_leader (set, oldop1),
-- 
GitLab