[gcc r13-9034] tree-optimization/115278 - fix DSE in if-conversion wrt volatiles
Richard Biener
rguenth@gcc.gnu.org
Wed Sep 18 10:32:47 GMT 2024
https://gcc.gnu.org/g:22c9080c88cd133e048cd9dcacd2fa13d8fd267f
commit r13-9034-g22c9080c88cd133e048cd9dcacd2fa13d8fd267f
Author: Richard Biener <rguenther@suse.de>
Date: Fri May 31 10:14:25 2024 +0200
tree-optimization/115278 - fix DSE in if-conversion wrt volatiles
The following adds the missing guard for volatile stores to the
embedded DSE in the loop if-conversion pass.
PR tree-optimization/115278
* tree-if-conv.cc (ifcvt_local_dce): Do not DSE volatile stores.
* g++.dg/vect/pr115278.cc: New testcase.
(cherry picked from commit 65dbe0ab7cdaf2aa84b09a74e594f0faacf1945c)
Diff:
---
gcc/testsuite/g++.dg/vect/pr115278.cc | 38 +++++++++++++++++++++++++++++++++++
gcc/tree-if-conv.cc | 4 +++-
2 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/gcc/testsuite/g++.dg/vect/pr115278.cc b/gcc/testsuite/g++.dg/vect/pr115278.cc
new file mode 100644
index 000000000000..331075fb2781
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/pr115278.cc
@@ -0,0 +1,38 @@
+// { dg-do compile }
+// { dg-require-effective-target c++11 }
+// { dg-additional-options "-fdump-tree-optimized" }
+
+#include <cstdint>
+
+const int runs = 92;
+
+union BitfieldStructUnion {
+ struct {
+ uint64_t a : 17;
+ uint64_t padding: 39;
+ uint64_t b : 8;
+ } __attribute__((packed));
+
+ struct {
+ uint32_t value_low;
+ uint32_t value_high;
+ } __attribute__((packed));
+
+ BitfieldStructUnion(uint32_t value_low, uint32_t value_high) : value_low(value_low), value_high(value_high) {}
+};
+
+volatile uint32_t *WRITE = (volatile unsigned*)0x42;
+
+void buggy() {
+ for (int i = 0; i < runs; i++) {
+ BitfieldStructUnion rt{*WRITE, *WRITE};
+
+ rt.a = 99;
+ rt.b = 1;
+
+ *WRITE = rt.value_low;
+ *WRITE = rt.value_high;
+ }
+}
+
+// { dg-final { scan-tree-dump-times "\\\*WRITE\[^\r\n\]* ={v} " 2 "optimized" } }
diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc
index b1dbb8706ed6..71f5d98c2129 100644
--- a/gcc/tree-if-conv.cc
+++ b/gcc/tree-if-conv.cc
@@ -3194,7 +3194,9 @@ ifcvt_local_dce (class loop *loop)
gimple_stmt_iterator gsiprev = gsi;
gsi_prev (&gsiprev);
stmt = gsi_stmt (gsi);
- if (gimple_store_p (stmt) && gimple_vdef (stmt))
+ if (!gimple_has_volatile_ops (stmt)
+ && gimple_store_p (stmt)
+ && gimple_vdef (stmt))
{
tree lhs = gimple_get_lhs (stmt);
ao_ref write;
More information about the Gcc-cvs
mailing list