From d0b898529b9ac6e3c227567a197d12dcf71dc800 Mon Sep 17 00:00:00 2001
From: Roger Sayle <roger@eyesopen.com>
Date: Tue, 16 May 2006 04:16:00 +0000
Subject: [PATCH] re PR target/26600 (internal compiler error: in push_reload,
 at reload.c:1303)

	PR target/26600
	* config/i386/i386.c (legitimate_constant_p) <CONST_DOUBLE>: TImode
	integer constants other than zero are only legitimate on TARGET_64BIT.
	<CONST_VECTOR> Only zero vectors are legitimate.
	(ix86_cannot_force_const_mem): Integral and vector constants can
	always be put in the constant pool.

	* gcc.target/i386/pr26600.c: New test case.

From-SVN: r113818
---
 gcc/ChangeLog                           |  9 +++++++++
 gcc/config/i386/i386.c                  | 23 +++++++++++++++++++++++
 gcc/testsuite/ChangeLog                 |  5 +++++
 gcc/testsuite/gcc.target/i386/pr26600.c | 14 ++++++++++++++
 4 files changed, 51 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr26600.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f01eebdae816..b4119862cd5e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2006-05-15  Roger Sayle  <roger@eyesopen.com>
+
+	PR target/26600
+	* config/i386/i386.c (legitimate_constant_p) <CONST_DOUBLE>: TImode
+	integer constants other than zero are only legitimate on TARGET_64BIT.
+	<CONST_VECTOR> Only zero vectors are legitimate.
+	(ix86_cannot_force_const_mem): Integral and vector constants can
+	always be put in the constant pool.
+
 2006-05-16  DJ Delorie  <dj@redhat.com>
 
 	* crtstuff.c (__dso_handle): Set section from
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index c81dee811529..3ff5abbd66cf 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -5934,6 +5934,18 @@ legitimate_constant_p (rtx x)
 	return false;
       break;
 
+    case CONST_DOUBLE:
+      if (GET_MODE (x) == TImode
+	  && x != CONST0_RTX (TImode)
+          && !TARGET_64BIT)
+	return false;
+      break;
+
+    case CONST_VECTOR:
+      if (x == CONST0_RTX (GET_MODE (x)))
+	return true;
+      return false;
+
     default:
       break;
     }
@@ -5949,6 +5961,17 @@ legitimate_constant_p (rtx x)
 static bool
 ix86_cannot_force_const_mem (rtx x)
 {
+  /* We can always put integral constants and vectors in memory.  */
+  switch (GET_CODE (x))
+    {
+    case CONST_INT:
+    case CONST_DOUBLE:
+    case CONST_VECTOR:
+      return false;
+
+    default:
+      break;
+    }
   return !legitimate_constant_p (x);
 }
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 529a209fa289..9f65c93f1af4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-05-15  Roger Sayle  <roger@eyesopen.com>
+
+	PR target/26600
+	* gcc.target/i386/pr26600.c: New test case.
+
 2006-05-15  Mark Mitchell  <mark@codesourcery.com>
 
 	PR c++/27505
diff --git a/gcc/testsuite/gcc.target/i386/pr26600.c b/gcc/testsuite/gcc.target/i386/pr26600.c
new file mode 100644
index 000000000000..bbe0663da7e0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr26600.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O -ftree-vectorize -msse2" } */
+
+void foo(int *p, int N)
+{
+    int i;
+    for (i=0; i<8; ++i, ++p)
+    {
+        int j = N+2*(N+p[0]), k = 2*N+p[0];
+        p[0] = j+N;
+        p[5] = j+k;
+    }
+}
+
-- 
GitLab