diff mbox series

tree-optimization/115278 - fix DSE in if-conversion wrt volatiles

Message ID 20240531121214.CBCD6137C3@imap1.dmz-prg2.suse.org
State New
Headers show
Series tree-optimization/115278 - fix DSE in if-conversion wrt volatiles | expand

Commit Message

Richard Biener May 31, 2024, 12:11 p.m. UTC
The following adds the missing guard for volatile stores to the
embedded DSE in the loop if-conversion pass.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

	PR tree-optimization/115278
	* tree-if-conv.cc (ifcvt_local_dce): Do not DSE volatile stores.

	* g++.dg/vect/pr115278.cc: New testcase.
---
 gcc/testsuite/g++.dg/vect/pr115278.cc | 38 +++++++++++++++++++++++++++
 gcc/tree-if-conv.cc                   |  4 ++-
 2 files changed, 41 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/vect/pr115278.cc
diff mbox series

Patch

diff --git a/gcc/testsuite/g++.dg/vect/pr115278.cc b/gcc/testsuite/g++.dg/vect/pr115278.cc
new file mode 100644
index 00000000000..331075fb278
--- /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 09d99fb9dda..c4c3ed41a44 100644
--- a/gcc/tree-if-conv.cc
+++ b/gcc/tree-if-conv.cc
@@ -3381,7 +3381,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;