S/390: Fix PR80725.
authorAndreas Krebbel <krebbel@linux.vnet.ibm.com>
Wed, 24 May 2017 11:36:54 +0000 (11:36 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Wed, 24 May 2017 11:36:54 +0000 (11:36 +0000)
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

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/config/s390/s390.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/pr80725.c [new file with mode: 0644]

index 1bbeb7b40b79ba8a0fd5c05215d187233fff6eb9..0d212ab9930abf0ba5edff8837d5afe13ce8e9b7 100644 (file)
@@ -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
index c16391aa8d51dbacf7a738c323012fad3657ea84..7be22d9c75c38364a52acd5bcd17d15403273ebe 100644 (file)
@@ -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))
index c9fd19aeb330b9cdc77116f44d16be33236c8e64..cfae171c2a020b50b2b838189ba6445eaf31bdc7 100644 (file)
     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" "*")])
index d8d16eebb8bf9f83c81a0732dc74083faf2ea666..78756318c34447139344b641e038aa4feb77acc8 100644 (file)
@@ -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 (file)
index 0000000..4a402c4
--- /dev/null
@@ -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;
+      }
+}