public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r10-10134] Fix PR rtl-optimization/102306
@ 2021-09-17 8:20 Eric Botcazou
0 siblings, 0 replies; only message in thread
From: Eric Botcazou @ 2021-09-17 8:20 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:0c1af84f181237b8a90ae391152dbdcb9c6ab064
commit r10-10134-g0c1af84f181237b8a90ae391152dbdcb9c6ab064
Author: Eric Botcazou <ebotcazou@adacore.com>
Date: Fri Sep 17 10:12:12 2021 +0200
Fix PR rtl-optimization/102306
This is a duplication of volatile loads introduced during GCC 9 development
by the 2->2 mechanism of the RTL combiner. There is already a substantial
checking for volatile references in can_combine_p but it implicitly assumes
that the combination reduces the number of instructions, which is of course
not the case here. So the fix teaches try_combine to abort the combination
when it is about to make a copy of volatile references to preserve them.
gcc/
PR rtl-optimization/102306
* combine.c (try_combine): Abort the combination if we are about to
duplicate volatile references.
gcc/testsuite/
* gcc.target/sparc/20210917-1.c: New test.
Diff:
---
gcc/combine.c | 10 ++++++++++
gcc/testsuite/gcc.target/sparc/20210917-1.c | 19 +++++++++++++++++++
2 files changed, 29 insertions(+)
diff --git a/gcc/combine.c b/gcc/combine.c
index 4584b2e74ae..d7135f393de 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -3214,6 +3214,16 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
return 0;
}
+ /* We cannot safely duplicate volatile references in any case. */
+
+ if ((added_sets_2 && volatile_refs_p (PATTERN (i2)))
+ || (added_sets_1 && volatile_refs_p (PATTERN (i1)))
+ || (added_sets_0 && volatile_refs_p (PATTERN (i0))))
+ {
+ undo_all ();
+ return 0;
+ }
+
/* Count how many auto_inc expressions there were in the original insns;
we need to have the same number in the resulting patterns. */
diff --git a/gcc/testsuite/gcc.target/sparc/20210917-1.c b/gcc/testsuite/gcc.target/sparc/20210917-1.c
new file mode 100644
index 00000000000..03e8bc58db9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sparc/20210917-1.c
@@ -0,0 +1,19 @@
+/* PR rtl-optimization/102306 */
+/* Reported by Daniel Cederman <cederman@gaisler.com> */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-O -mcpu=v8" } */
+
+extern void foo (void);
+
+void test (volatile unsigned char *a)
+{
+ char b = *a;
+ if (!b)
+ return;
+ if (b & 2)
+ foo ();
+}
+
+/* { dg-final { scan-assembler-times "ldub" 1 } } */
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-09-17 8:20 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-17 8:20 [gcc r10-10134] Fix PR rtl-optimization/102306 Eric Botcazou
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).