aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel@linux.vnet.ibm.com>2017-05-24 11:36:54 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2017-05-24 11:36:54 +0000
commit00e0af8d15c7a2cdbb6ed8c171f4558a7aeb8599 (patch)
treec5a6369c10b3f9004e91435c53ee4a07ddb562bc /gcc
parentef4c5e7855ea00a62487c0d34915d66946032172 (diff)
downloadgcc-00e0af8d15c7a2cdbb6ed8c171f4558a7aeb8599.zip
gcc-00e0af8d15c7a2cdbb6ed8c171f4558a7aeb8599.tar.gz
gcc-00e0af8d15c7a2cdbb6ed8c171f4558a7aeb8599.tar.bz2
S/390: Fix PR80725.
gcc/ChangeLog: 2017-05-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com> PR target/80725 * config/s390/s390.c (s390_check_qrst_address): Check incoming address against address_operand predicate. * config/s390/s390.md ("*indirect_jump"): Swap alternatives. gcc/testsuite/ChangeLog: 2017-05-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com> * gcc.target/s390/pr80725.c: New test. From-SVN: r248407
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/s390/s390.c3
-rw-r--r--gcc/config/s390/s390.md10
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/s390/pr80725.c26
5 files changed, 46 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1bbeb7b..0d212ab 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2017-05-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
+
+ PR target/80725
+ * config/s390/s390.c (s390_check_qrst_address): Check incoming
+ address against address_operand predicate.
+ * config/s390/s390.md ("*indirect_jump"): Swap alternatives.
+
2017-05-24 Eric Botcazou <ebotcazou@adacore.com>
* var-tracking.c (track_expr_p): Do not return 0 for tracked record
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index c16391a..7be22d9 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -3102,6 +3102,9 @@ s390_check_qrst_address (char c, rtx op, bool lit_pool_ok)
struct s390_address addr;
bool decomposed = false;
+ if (!address_operand (op, GET_MODE (op)))
+ return 0;
+
/* This check makes sure that no symbolic address (except literal
pool references) are accepted by the R or T constraints. */
if (s390_loadrelative_operand_p (op, NULL, NULL))
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index c9fd19a..cfae171 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -9660,14 +9660,16 @@
operands[0] = force_reg (Pmode, operands[0]);
})
+; The first constraint must be an "extra address constraint" in order
+; to trigger address reloading in LRA/reload
(define_insn "*indirect_jump"
[(set (pc)
- (match_operand 0 "address_operand" "a,ZR"))]
+ (match_operand 0 "address_operand" "ZR,a"))]
""
"@
- br\t%0
- b\t%a0"
- [(set_attr "op_type" "RR,RX")
+ b\t%a0
+ br\t%0"
+ [(set_attr "op_type" "RX,RR")
(set_attr "type" "branch")
(set_attr "atype" "agen")
(set_attr "cpu_facility" "*")])
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d8d16ee..7875631 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2017-05-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
+
+ * gcc.target/s390/pr80725.c: New test.
+
2017-05-23 Nathan Sidwell <nathan@acm.org>
* g++.dg/lookup/extern-c-hidden.C: New.
diff --git a/gcc/testsuite/gcc.target/s390/pr80725.c b/gcc/testsuite/gcc.target/s390/pr80725.c
new file mode 100644
index 0000000..4a402c4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/pr80725.c
@@ -0,0 +1,26 @@
+/* Regression test for PR/80725. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=zEC12" } */
+
+int a, e;
+const char b;
+char c;
+const int d;
+void bar (short);
+
+void
+foo (int x, int y)
+{
+ long f = d;
+ short g = 0;
+ while (e)
+ while (a < x)
+ {
+ if (y)
+ goto *d;
+ g = b | b + g;
+ bar (g);
+ c = (char) (long) foo;
+ }
+}