diff options
author | Richard Biener <rguenther@suse.de> | 2019-09-19 12:49:45 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-09-19 12:49:45 +0000 |
commit | d9e736e7194b524c3624172b896d5ace9cb459aa (patch) | |
tree | 7ddc9268cae4641b035d9e5e82d478a5ba2d7b2d /gcc/tree-ssa-phiprop.c | |
parent | f24f4c15884bf1ee65a10e2f959842eec4198876 (diff) | |
download | gcc-d9e736e7194b524c3624172b896d5ace9cb459aa.zip gcc-d9e736e7194b524c3624172b896d5ace9cb459aa.tar.gz gcc-d9e736e7194b524c3624172b896d5ace9cb459aa.tar.bz2 |
re PR tree-optimization/91812 (GCC ignores volatile modifier)
2019-09-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/91812
* tree-ssa-phiprop.c (propagate_with_phi): Do not replace
volatile loads.
* gcc.dg/torture/pr91812.c: New testcase.
From-SVN: r275960
Diffstat (limited to 'gcc/tree-ssa-phiprop.c')
-rw-r--r-- | gcc/tree-ssa-phiprop.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/gcc/tree-ssa-phiprop.c b/gcc/tree-ssa-phiprop.c index d710582..e90ae6a 100644 --- a/gcc/tree-ssa-phiprop.c +++ b/gcc/tree-ssa-phiprop.c @@ -338,8 +338,15 @@ propagate_with_phi (basic_block bb, gphi *phi, struct phiprop_d *phivn, && (!type || types_compatible_p (TREE_TYPE (gimple_assign_lhs (use_stmt)), type)) - /* We cannot replace a load that may throw or is volatile. */ - && !stmt_can_throw_internal (cfun, use_stmt))) + /* We cannot replace a load that may throw or is volatile. + For volatiles the transform can change the number of + executions if the load is inside a loop but the address + computations outside (PR91812). We could relax this + if we guard against that appropriately. For loads that can + throw we could relax things if the moved loads all are + known to not throw. */ + && !stmt_can_throw_internal (cfun, use_stmt) + && !gimple_has_volatile_ops (use_stmt))) continue; /* Check if we can move the loads. The def stmt of the virtual use |