diff options
author | Richard Biener <rguenther@suse.de> | 2024-05-31 10:14:25 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2024-05-31 14:12:35 +0200 |
commit | 65dbe0ab7cdaf2aa84b09a74e594f0faacf1945c (patch) | |
tree | bb1008578ce6915f48c545888d9a0ba4f0862106 | |
parent | e0ab5ee9bed5cbad9ae344a23ff0d302b8279d32 (diff) | |
download | gcc-65dbe0ab7cdaf2aa84b09a74e594f0faacf1945c.zip gcc-65dbe0ab7cdaf2aa84b09a74e594f0faacf1945c.tar.gz gcc-65dbe0ab7cdaf2aa84b09a74e594f0faacf1945c.tar.bz2 |
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.
-rw-r--r-- | gcc/testsuite/g++.dg/vect/pr115278.cc | 38 | ||||
-rw-r--r-- | gcc/tree-if-conv.cc | 4 |
2 files changed, 41 insertions, 1 deletions
diff --git a/gcc/testsuite/g++.dg/vect/pr115278.cc b/gcc/testsuite/g++.dg/vect/pr115278.cc new file mode 100644 index 0000000..331075f --- /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 09d99fb..c4c3ed4 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; |