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)
This commit is contained in:
parent
65e25860f4
commit
272e8c90af
2 changed files with 41 additions and 1 deletions
38
gcc/testsuite/g++.dg/vect/pr115278.cc
Normal file
38
gcc/testsuite/g++.dg/vect/pr115278.cc
Normal file
|
@ -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" } }
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue