2017-05-24 Andreas Krebbel 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.target/s390/pr80725.c: New test. --- gcc/config/s390/s390.c (revision 248406) +++ gcc/config/s390/s390.c (revision 248407) @@ -3102,6 +3102,9 @@ s390_check_qrst_address (char c, rtx op, 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)) --- gcc/config/s390/s390.md (revision 248406) +++ gcc/config/s390/s390.md (revision 248407) @@ -9660,14 +9660,16 @@ (define_expand "indirect_jump" 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" "*")]) --- gcc/testsuite/gcc.target/s390/pr80725.c (nonexistent) +++ gcc/testsuite/gcc.target/s390/pr80725.c (revision 248407) @@ -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; + } +}