diff options
author | Martin Liska <mliska@suse.cz> | 2021-12-03 11:58:25 -0600 |
---|---|---|
committer | Peter Bergner <bergner@linux.ibm.com> | 2021-12-03 14:32:13 -0600 |
commit | cff7879a381d3f5ed6556206896e6a6229800167 (patch) | |
tree | 0736f08bfea8273d9a95c984c66256b3397ed79c | |
parent | d81722ee16e339af7c11b3d1bf51c17246557595 (diff) | |
download | gcc-cff7879a381d3f5ed6556206896e6a6229800167.zip gcc-cff7879a381d3f5ed6556206896e6a6229800167.tar.gz gcc-cff7879a381d3f5ed6556206896e6a6229800167.tar.bz2 |
rs6000: Fix up flag_shrink_wrap handling in presence of -mrop-protect [PR101324]
PR101324 shows a problem in disabling shrink-wrapping when using -mrop-protect
when there is a attribute optimize/pragma. The fix envolves moving the handling
of flag_shrink_wrap so it gets re-disbled when we change or add options.
2021-12-03 Martin Liska <mliska@suse.cz>
gcc/
PR target/101324
* config/rs6000/rs6000.c (rs6000_option_override_internal): Move the
disabling of shrink-wrapping when using -mrop-protect from here...
(rs6000_override_options_after_change): ...to here.
2021-12-03 Peter Bergner <bergner@linux.ibm.com>
gcc/testsuite/
PR target/101324
* gcc.target/powerpc/pr101324.c: New test.
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr101324.c | 17 |
2 files changed, 21 insertions, 4 deletions
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 2d40da2..5e12998 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -3477,6 +3477,10 @@ rs6000_override_options_after_change (void) } else if (!OPTION_SET_P (flag_cunroll_grow_size)) flag_cunroll_grow_size = flag_peel_loops || optimize >= 3; + + /* If we are inserting ROP-protect instructions, disable shrink wrap. */ + if (rs6000_rop_protect) + flag_shrink_wrap = 0; } #ifdef TARGET_USES_LINUX64_OPT @@ -4041,10 +4045,6 @@ rs6000_option_override_internal (bool global_init_p) && ((rs6000_isa_flags_explicit & OPTION_MASK_QUAD_MEMORY_ATOMIC) == 0)) rs6000_isa_flags |= OPTION_MASK_QUAD_MEMORY_ATOMIC; - /* If we are inserting ROP-protect instructions, disable shrink wrap. */ - if (rs6000_rop_protect) - flag_shrink_wrap = 0; - /* If we can shrink-wrap the TOC register save separately, then use -msave-toc-indirect unless explicitly disabled. */ if ((rs6000_isa_flags_explicit & OPTION_MASK_SAVE_TOC_INDIRECT) == 0 diff --git a/gcc/testsuite/gcc.target/powerpc/pr101324.c b/gcc/testsuite/gcc.target/powerpc/pr101324.c new file mode 100644 index 0000000..ca0fca8 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr101324.c @@ -0,0 +1,17 @@ +/* { dg-require-effective-target rop_ok } */ +/* { dg-options "-O1 -mrop-protect -mdejagnu-cpu=power10" } */ + +extern void foo (void); + +long int +__attribute__ ((__optimize__ ("no-inline"))) +func (long int cond) +{ + if (cond) + foo (); + return cond; +} + +/* Ensure hashst comes after mflr and hashchk comes after ld 0,16(1). */ +/* { dg-final { scan-assembler {(?p)\mmflr 0.*\n.*\n.*\mhashst 0,} } } */ +/* { dg-final { scan-assembler {(?p)ld 0,.*\n.*\n.*\n.*\mhashchk 0,} } } */ |