diff options
author | Richard Biener <rguenther@suse.de> | 2022-03-31 08:20:43 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-03-31 09:18:42 +0200 |
commit | b75f996e846d079251f3a6134617f0405c3ed535 (patch) | |
tree | 43ba939a6adf42a6a7b6a55526cffee008dda79b /gcc | |
parent | b8207ad367174df5f2e2fdf3305c97ed227d8f78 (diff) | |
download | gcc-b75f996e846d079251f3a6134617f0405c3ed535.zip gcc-b75f996e846d079251f3a6134617f0405c3ed535.tar.gz gcc-b75f996e846d079251f3a6134617f0405c3ed535.tar.bz2 |
rtl-optimization/105091 - wrong DSE with missed TREE_ADDRESSABLE
When expanding an aggregate copy into a memcpy call RTL expansion
uses mark_addressable to ensure the base object is addressable but
that function doesn't handle TARGET_MEM_REF bases. Fixed as follows.
2022-03-31 Richard Biener <rguenther@suse.de>
PR rtl-optimization/105091
* gimple-expr.cc (mark_addressable): Handle TARGET_MEM_REF
bases.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/gimple-expr.cc | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/gcc/gimple-expr.cc b/gcc/gimple-expr.cc index f9a650b..5faaf43 100644 --- a/gcc/gimple-expr.cc +++ b/gcc/gimple-expr.cc @@ -910,7 +910,8 @@ mark_addressable (tree x) x = TREE_OPERAND (x, 0); while (handled_component_p (x)) x = TREE_OPERAND (x, 0); - if (TREE_CODE (x) == MEM_REF + if ((TREE_CODE (x) == MEM_REF + || TREE_CODE (x) == TARGET_MEM_REF) && TREE_CODE (TREE_OPERAND (x, 0)) == ADDR_EXPR) x = TREE_OPERAND (TREE_OPERAND (x, 0), 0); if (!VAR_P (x) |