diff options
author | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2017-05-24 11:36:54 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2017-05-24 11:36:54 +0000 |
commit | 00e0af8d15c7a2cdbb6ed8c171f4558a7aeb8599 (patch) | |
tree | c5a6369c10b3f9004e91435c53ee4a07ddb562bc /gcc | |
parent | ef4c5e7855ea00a62487c0d34915d66946032172 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/s390/s390.c | 3 | ||||
-rw-r--r-- | gcc/config/s390/s390.md | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/s390/pr80725.c | 26 |
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; + } +} |