[Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Mar 30 14:16:40 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org
Status|UNCONFIRMED |ASSIGNED
Ever confirmed|0 |1
Last reconfirmed| |2022-03-30
--- Comment #13 from Richard Biener <rguenth at gcc dot gnu.org> ---
<bb 3> [local count: 715863673]:
# ivtmp_47 = PHI <1(3), 2(2)>
_43 = ivtmp_47 * 18446744073709551544;
GOTMP.8 = MEM[(struct *)&GOTMP.5 + 144B + _43 * 1];
GOTMP.13 = GOTMP.8;
test = GOTMP.13;
p = test.x;
D.483.__type_descriptor = &g.type.._6_7int;
GOTMP.14 = p;
D.483.__object = &GOTMP.14;
main.F (D.483);
p ={v} {CLOBBER(eol)};
if (ivtmp_47 != 1)
goto <bb 3>; [66.67%]
else
goto <bb 4>; [33.33%]
<bb 4> [local count: 357878152]:
test ={v} {CLOBBER(eol)};
return;
that's an interesting sequence of aggregate copies (meh - SRA should
optimize those!) and an interesting choice of IVs but nothing invalid.
We expand the
GOTMP.8 = MEM[(struct *)&GOTMP.5 + 144B + _43 * 1];
stmt to memcpy() but GOTMP.5 is not TREE_ADDRESSABLE here. That might
in the end lead DSE to remove the stores. When setting the flag
inside gdb during expansion I see the stores are retained.
Now, emit_block_op_via_libcall does
/* Since dst and src are passed to a libcall, mark the corresponding
tree EXPR as addressable. */
tree dst_expr = MEM_EXPR (dst);
tree src_expr = MEM_EXPR (src);
if (dst_expr)
mark_addressable (dst_expr);
if (src_expr)
mark_addressable (src_expr);
but mark_addressable doesn't handle TARGET_MEM_REF.
Does the following fix the runtime error? The RTL after DSE seems to be OK.
diff --git a/gcc/gimple-expr.cc b/gcc/gimple-expr.cc
index f9a650b5daf..5faaf43eaf5 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)
More information about the Gcc-bugs
mailing list