]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-cfg: Fix typos on dloop in move_sese_region_to_fn
authorKewen Lin <linkw@linux.ibm.com>
Tue, 3 Aug 2021 03:12:00 +0000 (22:12 -0500)
committerKewen Lin <linkw@linux.ibm.com>
Tue, 3 Aug 2021 03:12:00 +0000 (22:12 -0500)
As mentioned in [1], there is one pre-existing issue before
the refactoring of FOR_EACH_LOOP_FN.  The macro will always
set the given LOOP as NULL at the end of iterating unless
there is some early break inside, obviously there is no
early break and dloop will be set as NULL after the loop
iterating.  It's kept as NULL after the factoring.

I tried to debug the test case gcc.dg/graphite/pr83359.c
with commit 555758de90074 (also reproduced the ICE with
555758de90074~), and noticed the compilation of the test
case only covers the hunk:

  else
    {
      moved_orig_loop_num[dloop->orig_loop_num] = -1;
      dloop->orig_loop_num = 0;
    }

it doesn't touch the if condition hunk to increase
"moved_orig_loop_num[dloop->orig_loop_num]".  So the
following hunk guarded with

  if (moved_orig_loop_num[orig_loop_num] == 2)

using dloop for dereference doesn't get executed.  It
explains why the problem doesn't get exposed before.

By looking to the code using dloop, I think it's a copy
paste typo, the modified assertion codes have the same
words as the above condition check.  In that context, the
expected original number has been assigned to variable
orig_loop_num by extracting from the arg0 of the call
IFN_LOOP_DIST_ALIAS.

[1] https://gcc.gnu.org/pipermail/gcc-patches/2021-July/576367.html

gcc/ChangeLog:

* tree-cfg.c (move_sese_region_to_fn): Fix typos on dloop.

gcc/tree-cfg.c

index 48ee8c011abda6d2d8da0cafc31dc9fdbbf15d3a..9883eaaa9bf1f5793ebe29d8cf120997d8c7d357 100644 (file)
@@ -7747,9 +7747,8 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
 
   /* Fix up orig_loop_num.  If the block referenced in it has been moved
      to dest_cfun, update orig_loop_num field, otherwise clear it.  */
-  class loop *dloop = NULL;
   signed char *moved_orig_loop_num = NULL;
-  for (class loop *dloop : loops_list (dest_cfun, 0))
+  for (auto dloop : loops_list (dest_cfun, 0))
     if (dloop->orig_loop_num)
       {
        if (moved_orig_loop_num == NULL)
@@ -7787,11 +7786,10 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
              /* If we have moved both loops with this orig_loop_num into
                 dest_cfun and the LOOP_DIST_ALIAS call is being moved there
                 too, update the first argument.  */
-             gcc_assert ((*larray)[dloop->orig_loop_num] != NULL
-                         && (get_loop (saved_cfun, dloop->orig_loop_num)
-                             == NULL));
+             gcc_assert ((*larray)[orig_loop_num] != NULL
+                         && (get_loop (saved_cfun, orig_loop_num) == NULL));
              tree t = build_int_cst (integer_type_node,
-                                     (*larray)[dloop->orig_loop_num]->num);
+                                     (*larray)[orig_loop_num]->num);
              gimple_call_set_arg (g, 0, t);
              update_stmt (g);
              /* Make sure the following loop will not update it.  */