https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105769

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
      Known to fail|                            |12.4.0, 13.3.0, 14.1.0
      Known to work|                            |10.5.0

--- Comment #17 from Richard Biener <rguenth at gcc dot gnu.org> ---
I'm not actually seeing the problematic use of the hoisted address - the
address value itself is stored and the trick of looking at SSA uses defs to
pick up
indirect address uses later doesn't work here as the only use is in the
vector CTOR:

  _15 = (long unsigned int) &bias;
  _10 = (long unsigned int) &cov_jn;
  _12 = {_10, _15};
...
  bias ={v} {CLOBBER(bob)}; 

but _12 is only used in

  MEM <vector(2) long unsigned int> [(void *)&D.5715 + 32B] = _12;

and then maybe indirectly

  __ct_comp  (_14, &D.5715.__est);

I can fix the miscompile with the following patch - we're treating all
CLOBBER kinds as invalidating earlier mentions.  I'm not sure that's
really necessary and it's definitely harmful when there are hoisted
address mentions.  It also explains that -fstack-reuse=none doesn't
help as the gimplifier only inserts CLOBBER_STORAGE_END clobbers.
I'm also allowing CLOBBER_OBJECT_END here.

I do not remember whether we discussed doing sth like this instead of the
special SSA use handling we added?

diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc
index eef565eddb5..92968075b04 100644
--- a/gcc/cfgexpand.cc
+++ b/gcc/cfgexpand.cc
@@ -632,6 +632,13 @@ add_scope_conflicts_1 (basic_block bb, bitmap work, bool
for_conflict)
             that are COMPONENT_REFs.  */
          if (!VAR_P (lhs))
            continue;
+         tree cl = gimple_assign_rhs1 (stmt);
+         /* When the clobber is possibly a object/storage start do not
+            ignore previous mentions at this point.  Those might
+            include hoisted address uses.  */
+         if (CLOBBER_KIND (cl) != CLOBBER_STORAGE_END
+             && CLOBBER_KIND (cl) != CLOBBER_OBJECT_END)
+           continue;
          if (DECL_RTL_IF_SET (lhs) == pc_rtx
              && (v = decl_to_stack_part->get (lhs)))
            bitmap_clear_bit (work, *v);

Reply via email to