In this PR, auto-inc-dec was trying to turn: (set (reg X) (plus (reg X) (const_int N))) (clobber (mem (reg X)))
into: (clobber (mem (pre_modify (reg X) ...))) But bare clobber insns are just there to describe dataflow. They're not supposed to generate any code. This is part 2 of the fix for PR93124. The reason we have the clobber above is that cprop replaced (reg sp) with (reg X) in: (clobber (mem (reg sp))) Part 1 stops that from happening, but I still think we should prevent auto-inc-dec from "optimising" bare USEs and CLOBBERs as a belt-and-braces fix. Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install? Richard 2020-01-22 Richard Sandiford <richard.sandif...@arm.com> gcc/ PR rtl-optimization/93124 * auto-inc-dec.c (merge_in_block): Don't add auto inc/decs to bare USE and CLOBBER insns. gcc/testsuite/ * gcc.dg/torture/pr93124.c: New test. --- gcc/auto-inc-dec.c | 12 +++++-- gcc/testsuite/gcc.dg/torture/pr93124.c | 44 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr93124.c diff --git a/gcc/auto-inc-dec.c b/gcc/auto-inc-dec.c index 268231ecaff..7d0d91403f3 100644 --- a/gcc/auto-inc-dec.c +++ b/gcc/auto-inc-dec.c @@ -1602,9 +1602,15 @@ merge_in_block (int max_reg, basic_block bb) else { insn_is_add_or_inc = false; - mem_insn.insn = insn; - if (find_mem (&PATTERN (insn))) - success_in_block++; + /* We can't use auto inc/dec for bare USEs and CLOBBERs, + since they aren't supposed to generate any code. */ + rtx_code code = GET_CODE (PATTERN (insn)); + if (code != USE && code != CLOBBER) + { + mem_insn.insn = insn; + if (find_mem (&PATTERN (insn))) + success_in_block++; + } } /* If the inc insn was merged with a mem, the inc insn is gone diff --git a/gcc/testsuite/gcc.dg/torture/pr93124.c b/gcc/testsuite/gcc.dg/torture/pr93124.c new file mode 100644 index 00000000000..16bc8b54f14 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr93124.c @@ -0,0 +1,44 @@ +/* { dg-additional-options "-fno-rerun-cse-after-loop -fno-guess-branch-probability -fno-tree-fre" } */ + +int x; + +void fn2 (); +void fn3 (); +void fn4 (); +void fn5 (); +void fn6 (); + +void +fn1 (void) +{ + int n; + for (n = 0;; ++n) { + { + struct { char a[n]; } s; + fn2 (s); + } + struct { unsigned a[x]; } s; + int i, b; + for (i = 0; i < n; ++i) + ; + fn2 (s); + { + struct { char a[n]; } s; + int i; + for (i = 0; i < n; ++i) + s.a[i] = i; + fn3 (s, s); + } + fn4 (); + { + struct { unsigned a[n]; } s; + fn5 (s); + } + { + struct { char a[b]; } s; + for (; i < n;) + s.a[i] = i; + fn6 (s); + } + } +}