aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel1@de.ibm.com>2005-08-26 06:45:09 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2005-08-26 06:45:09 +0000
commitdb21e1d01a3f6ca4f7d6c9f151620bae7b66b661 (patch)
treeca6ada83aee2512041dc9314abed3c6e84c9ecd3
parent4e0d0e3367254340b50be219f252b4bc36cb4271 (diff)
downloadgcc-db21e1d01a3f6ca4f7d6c9f151620bae7b66b661.zip
gcc-db21e1d01a3f6ca4f7d6c9f151620bae7b66b661.tar.gz
gcc-db21e1d01a3f6ca4f7d6c9f151620bae7b66b661.tar.bz2
predicates.md ("shift_count_operand", [...]): Reject operands containing eliminable registers.
2005-08-26 Andreas Krebbel <krebbel1@de.ibm.com> * config/s390/predicates.md ("shift_count_operand", "setmem_operand"): Reject operands containing eliminable registers. * testsuite/gcc.dg/20050825-1.c: New testcase. From-SVN: r103515
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/s390/predicates.md8
-rw-r--r--gcc/testsuite/gcc.dg/20050824-1.c30
3 files changed, 44 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d9b9ae4..84b1da0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-08-26 Andreas Krebbel <krebbel1@de.ibm.com>
+
+ * config/s390/predicates.md ("shift_count_operand", "setmem_operand"):
+ Reject operands containing eliminable registers.
+ * testsuite/gcc.dg/20050825-1.c: New testcase.
+
2005-08-24 Paolo Bonzini <bonzini@gnu.org>
Jan Hubicka <jh@suse.cz>
diff --git a/gcc/config/s390/predicates.md b/gcc/config/s390/predicates.md
index 05ef8c8..9f8f823 100644
--- a/gcc/config/s390/predicates.md
+++ b/gcc/config/s390/predicates.md
@@ -107,6 +107,10 @@
if (op && GET_CODE (op) != REG)
return false;
+ if (op && REGNO (op) < FIRST_PSEUDO_REGISTER
+ && !GENERAL_REGNO_P (REGNO (op)))
+ return false;
+
/* Unfortunately we have to reject constants that are invalid
for an address, or else reload will get confused. */
if (!DISP_IN_RANGE (offset))
@@ -147,6 +151,10 @@
if (op && GET_CODE (op) != REG)
return false;
+ if (op && REGNO (op) < FIRST_PSEUDO_REGISTER
+ && !GENERAL_REGNO_P (REGNO (op)))
+ return false;
+
/* Unfortunately we have to reject constants that are invalid
for an address, or else reload will get confused. */
if (!DISP_IN_RANGE (offset))
diff --git a/gcc/testsuite/gcc.dg/20050824-1.c b/gcc/testsuite/gcc.dg/20050824-1.c
new file mode 100644
index 0000000..f13ad04
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20050824-1.c
@@ -0,0 +1,30 @@
+/* Make sure that the S/390 specific shift_count_operand
+ predicate work properly. */
+
+/* { dg-do compile { target s390*-*-* } } */
+/* { dg-options "-O3" } */
+
+unsigned long long
+f (unsigned long long a, unsigned long b)
+{
+ asm ("" : : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
+ "r8", "r9", "r10", "r11", "r12", "r13", "r14");
+
+ return a << ((b + 3) & 63);
+}
+
+unsigned long long
+g (unsigned long long a, char **b , int c, int d, int e, int f)
+{
+ char buffer [4096];
+
+ *b = &buffer[0];
+
+ return a << ((unsigned long)&f & 63);
+}
+
+unsigned long long
+h (unsigned long long a, int b, int c, int d, int e, int f)
+{
+ return a << (((unsigned long)&f + 3));
+}