We still use lr r0,r0 as a NOP instruction although we have some kind of dedicated NOP instruction (nopr) which maps to a "branch never".
As a side-effect this fixes testcases scanning for NOPs e.g. patchable_function_entry-*. As another side-effect this makes it difficult to distingiush NOPs generated for hotpatching from NOPs added when using -O0 to attach location information to it. Hence I had to make sure that the hotpatch testcases get skipped when compiling without optimization. gcc/ChangeLog: 2018-04-06 Andreas Krebbel <kreb...@linux.vnet.ibm.com> * config/s390/s390.c (s390_z10_optimize_cmp): Expand dedicated NOP instructions. * config/s390/s390.md (UNSPECV_NOP_LR_0, UNSPECV_NOP_LR_1): New constant definitions. ("nop"): lr 0,0 -> nopr r0 ("nop_lr0", "nop_lr1"): New insn definitions. gcc/testsuite/ChangeLog: 2018-04-06 Andreas Krebbel <kreb...@linux.vnet.ibm.com> * gcc.target/s390/s390.exp: Remove -O0 from list of torture options. * gcc.target/s390/hotpatch-1.c: Skip when building without optimization. * gcc.target/s390/hotpatch-10.c: Likewise. * gcc.target/s390/hotpatch-11.c: Likewise. * gcc.target/s390/hotpatch-12.c: Likewise. * gcc.target/s390/hotpatch-13.c: Likewise. * gcc.target/s390/hotpatch-14.c: Likewise. * gcc.target/s390/hotpatch-15.c: Likewise. * gcc.target/s390/hotpatch-16.c: Likewise. * gcc.target/s390/hotpatch-17.c: Likewise. * gcc.target/s390/hotpatch-18.c: Likewise. * gcc.target/s390/hotpatch-19.c: Likewise. * gcc.target/s390/hotpatch-2.c: Likewise. * gcc.target/s390/hotpatch-3.c: Likewise. * gcc.target/s390/hotpatch-4.c: Likewise. * gcc.target/s390/hotpatch-5.c: Likewise. * gcc.target/s390/hotpatch-6.c: Likewise. * gcc.target/s390/hotpatch-7.c: Likewise. * gcc.target/s390/hotpatch-8.c: Likewise. * gcc.target/s390/hotpatch-9.c: Likewise. --- gcc/config/s390/s390.c | 4 ++-- gcc/config/s390/s390.md | 17 +++++++++++++++-- gcc/testsuite/gcc.target/s390/hotpatch-1.c | 7 +++++++ gcc/testsuite/gcc.target/s390/hotpatch-10.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-11.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-12.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-13.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-14.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-15.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-16.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-17.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-18.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-19.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-2.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-3.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-4.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-5.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-6.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-7.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-8.c | 1 + gcc/testsuite/gcc.target/s390/hotpatch-9.c | 1 + gcc/testsuite/gcc.target/s390/s390.exp | 2 +- 22 files changed, 43 insertions(+), 5 deletions(-) diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 51adb0d..59f5de9 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -14376,9 +14376,9 @@ s390_z10_optimize_cmp (rtx_insn *insn) && s390_non_addr_reg_read_p (*op0, prev_insn)) { if (REGNO (*op1) == 0) - emit_insn_after (gen_nop1 (), insn); + emit_insn_after (gen_nop_lr1 (), insn); else - emit_insn_after (gen_nop (), insn); + emit_insn_after (gen_nop_lr0 (), insn); insn_added_p = true; } else diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 5481f13..c4d391b 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -267,6 +267,10 @@ UNSPECV_CAS UNSPECV_ATOMIC_OP + ; Non-branch nops used for compare-and-branch adjustments on z10 + UNSPECV_NOP_LR_0 + UNSPECV_NOP_LR_1 + ; Hotpatching (unremovable NOPs) UNSPECV_NOP_2_BYTE UNSPECV_NOP_4_BYTE @@ -10998,12 +11002,21 @@ (define_insn "nop" [(const_int 0)] "" + "nopr\t%%r0" + [(set_attr "op_type" "RR")]) + +; non-branch NOPs required for optimizing compare-and-branch patterns +; on z10 + +(define_insn "nop_lr0" + [(unspec_volatile [(const_int 0)] UNSPECV_NOP_LR_0)] + "" "lr\t0,0" [(set_attr "op_type" "RR") (set_attr "z10prop" "z10_fr_E1")]) -(define_insn "nop1" - [(const_int 1)] +(define_insn "nop_lr1" + [(unspec_volatile [(const_int 0)] UNSPECV_NOP_LR_1)] "" "lr\t1,1" [(set_attr "op_type" "RR")]) diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-1.c b/gcc/testsuite/gcc.target/s390/hotpatch-1.c index 5f0f2e1..67e101e 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-1.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-1.c @@ -3,6 +3,13 @@ /* { dg-do compile } */ /* { dg-options "-mzarch" } */ +/* Without optimization extra NOPs will be added just to attach + location info to it. Don't run the test in that case. The torture + framework always appears to run the testcase without -O option + first. */ + +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ + #include <stdio.h> void hp1(void) diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-10.c b/gcc/testsuite/gcc.target/s390/hotpatch-10.c index 2308d33..21d499e 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-10.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-10.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=0,0" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-11.c b/gcc/testsuite/gcc.target/s390/hotpatch-11.c index 56b3596..a37f311 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-11.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-11.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=1,0" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-12.c b/gcc/testsuite/gcc.target/s390/hotpatch-12.c index 8a91c1b..cb8d152 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-12.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-12.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=999,0" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-13.c b/gcc/testsuite/gcc.target/s390/hotpatch-13.c index 70fab74..fb037c2 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-13.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-13.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-14.c b/gcc/testsuite/gcc.target/s390/hotpatch-14.c index 389bf42..fd0368a 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-14.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-14.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-15.c b/gcc/testsuite/gcc.target/s390/hotpatch-15.c index 0b10fb1..a1c3e7c 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-15.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-15.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-16.c b/gcc/testsuite/gcc.target/s390/hotpatch-16.c index 2fcdf1c..737c3a1 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-16.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-16.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=0,0" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-17.c b/gcc/testsuite/gcc.target/s390/hotpatch-17.c index 299f825..6d8c40c 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-17.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-17.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=1,2" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-18.c b/gcc/testsuite/gcc.target/s390/hotpatch-18.c index fd44d11..02807ff 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-18.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-18.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=1,2 -mhotpatch=0,0" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-19.c b/gcc/testsuite/gcc.target/s390/hotpatch-19.c index 899e000..71c2ed1 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-19.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-19.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=1,2" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-2.c b/gcc/testsuite/gcc.target/s390/hotpatch-2.c index 99fe911..ece6cb3 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-2.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-2.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=0,1" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-3.c b/gcc/testsuite/gcc.target/s390/hotpatch-3.c index 20f43c6b..65ebe35 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-3.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-3.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=0,2" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-4.c b/gcc/testsuite/gcc.target/s390/hotpatch-4.c index 32a3c03..d0956f1 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-4.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-4.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=0,3" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-5.c b/gcc/testsuite/gcc.target/s390/hotpatch-5.c index 72ee5a3..64d49ee 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-5.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-5.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=0,4" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-6.c b/gcc/testsuite/gcc.target/s390/hotpatch-6.c index 1e1d0e6..e6753c8 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-6.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-6.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=0,5" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-7.c b/gcc/testsuite/gcc.target/s390/hotpatch-7.c index 3f60e61..3f1c9f0 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-7.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-7.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-mzarch -mhotpatch=0,6" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-8.c b/gcc/testsuite/gcc.target/s390/hotpatch-8.c index 012a4eb..a2fb83f 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-8.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-8.c @@ -2,6 +2,7 @@ /* { dg-do compile { target { ! lp64 } } } */ /* { dg-options "-mesa -march=g5 -Wno-deprecated -mhotpatch=0,3" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/hotpatch-9.c b/gcc/testsuite/gcc.target/s390/hotpatch-9.c index b7d557e..34fae55 100644 --- a/gcc/testsuite/gcc.target/s390/hotpatch-9.c +++ b/gcc/testsuite/gcc.target/s390/hotpatch-9.c @@ -2,6 +2,7 @@ /* { dg-do compile { target { ! lp64 } } } */ /* { dg-options "-mesa -march=g5 -Wno-deprecated -mhotpatch=0,4" } */ +/* { dg-skip-if "" { *-*-* } { "*" } { "-O*" } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.target/s390/s390.exp b/gcc/testsuite/gcc.target/s390/s390.exp index 63e1a4c..bb13bfd 100644 --- a/gcc/testsuite/gcc.target/s390/s390.exp +++ b/gcc/testsuite/gcc.target/s390/s390.exp @@ -220,7 +220,7 @@ dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/md/*.{c,S,C}]] \ # Additional hotpatch torture tests. torture-init -set-torture-options [list -Os -O0 -O1 -O2 -O3] +set-torture-options [list -Os -O1 -O2 -O3] gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/hotpatch-\[0-9\]*.c]] \ "" $DEFAULT_CFLAGS torture-finish -- 2.9.1