[Bug tree-optimization/101419] [9/10/11/12 Regression] collapsing memset() calls can break __builtin_object_size()

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Jul 12 12:04:25 GMT 2021


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

--- Comment #14 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I agree about most of the passes you are moving, but I have an (albeit
artificial) testcase that proves that cunrolli does affect objsz:
__SIZE_TYPE__ a[10];

void
foo (void)
{
  char *p = __builtin_malloc (64);
  for (int i = 0; i < 4; i++)
    {
      a[i] = __builtin_object_size (p, 0);
      p += 6;
    }
}

When objsz is done before cunrolli, a[0] to a[3] will all be 64, while
when it is done after cunrolli, it will be 64, 58, 52, 46.

So, what about a mix of your and my patch, add
--- gcc/passes.def
+++ gcc/passes.def
@@ -194,14 +194,14 @@ along with GCC; see the file COPYING3.  If not see
         They ensure memory accesses are not indirect wherever possible.  */
       NEXT_PASS (pass_strip_predict_hints, false /* early_p */);
       NEXT_PASS (pass_ccp, true /* nonzero_p */);
-      NEXT_PASS (pass_post_ipa_warn);
       /* After CCP we rewrite no longer addressed locals into SSA
         form if possible.  */
+      NEXT_PASS (pass_post_ipa_warn);
       NEXT_PASS (pass_complete_unrolli);
+      NEXT_PASS (pass_object_sizes, false /* insert_min_max_p */);
       NEXT_PASS (pass_backprop);
       NEXT_PASS (pass_phiprop);
       NEXT_PASS (pass_forwprop);
-      NEXT_PASS (pass_object_sizes, false /* insert_min_max_p */);
       /* pass_build_alias is a dummy pass that ensures that we
         execute TODO_rebuild_alias at this point.  */
       NEXT_PASS (pass_build_alias);
to my patch?


More information about the Gcc-bugs mailing list