]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
lim: Reset flow sensitive info even for pointers [PR103192]
authorJakub Jelinek <jakub@redhat.com>
Wed, 17 Nov 2021 13:18:42 +0000 (14:18 +0100)
committerJakub Jelinek <jakub@redhat.com>
Wed, 17 Nov 2021 13:18:42 +0000 (14:18 +0100)
Since 2014 is lim clearing SSA_NAME_RANGE_INFO for integral SSA_NAMEs
if moving them from conditional contexts inside of a loop into unconditional
before the loop, but as the miscompilation of gimplify.c shows, we need to
treat pointers the same, even for them we need to reset whether the pointer
can/can't be null or the recorded pointer alignment.

This fixes
-FAIL: libgomp.c/../libgomp.c-c++-common/target-in-reduction-2.c (internal compiler error)
-FAIL: libgomp.c/../libgomp.c-c++-common/target-in-reduction-2.c (test for excess errors)
-UNRESOLVED: libgomp.c/../libgomp.c-c++-common/target-in-reduction-2.c compilation failed to produce executable
-FAIL: libgomp.c++/../libgomp.c-c++-common/target-in-reduction-2.c (internal compiler error)
-FAIL: libgomp.c++/../libgomp.c-c++-common/target-in-reduction-2.c (test for excess errors)
-UNRESOLVED: libgomp.c++/../libgomp.c-c++-common/target-in-reduction-2.c compilation failed to produce executable
-FAIL: libgomp.c++/target-in-reduction-2.C (internal compiler error)
-FAIL: libgomp.c++/target-in-reduction-2.C (test for excess errors)
-UNRESOLVED: libgomp.c++/target-in-reduction-2.C compilation failed to produce executable
on both x86_64 and i686.

2021-11-17  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/103192
* tree-ssa-loop-im.c (move_computations_worker): Use
reset_flow_sensitive_info instead of manually clearing
SSA_NAME_RANGE_INFO and do it for all SSA_NAMEs, not just ones
with integral types.

gcc/tree-ssa-loop-im.c

index 4b187c2cdafe586fe159343c1f5b22abfde7446a..8a81acae1156697c111535019c701a7862e5dc42 100644 (file)
@@ -1183,14 +1183,10 @@ move_computations_worker (basic_block bb)
                                          COND_EXPR, t, arg0, arg1);
          todo |= TODO_cleanup_cfg;
        }
-      if (INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (new_stmt)))
-         && (!ALWAYS_EXECUTED_IN (bb)
-             || (ALWAYS_EXECUTED_IN (bb) != level
-                 && !flow_loop_nested_p (ALWAYS_EXECUTED_IN (bb), level))))
-       {
-         tree lhs = gimple_assign_lhs (new_stmt);
-         SSA_NAME_RANGE_INFO (lhs) = NULL;
-       }
+      if (!ALWAYS_EXECUTED_IN (bb)
+         || (ALWAYS_EXECUTED_IN (bb) != level
+             && !flow_loop_nested_p (ALWAYS_EXECUTED_IN (bb), level)))
+       reset_flow_sensitive_info (gimple_assign_lhs (new_stmt));
       gsi_insert_on_edge (loop_preheader_edge (level), new_stmt);
       remove_phi_node (&bsi, false);
     }
@@ -1253,14 +1249,10 @@ move_computations_worker (basic_block bb)
       gsi_remove (&bsi, false);
       if (gimple_has_lhs (stmt)
          && TREE_CODE (gimple_get_lhs (stmt)) == SSA_NAME
-         && INTEGRAL_TYPE_P (TREE_TYPE (gimple_get_lhs (stmt)))
          && (!ALWAYS_EXECUTED_IN (bb)
              || !(ALWAYS_EXECUTED_IN (bb) == level
                   || flow_loop_nested_p (ALWAYS_EXECUTED_IN (bb), level))))
-       {
-         tree lhs = gimple_get_lhs (stmt);
-         SSA_NAME_RANGE_INFO (lhs) = NULL;
-       }
+       reset_flow_sensitive_info (gimple_get_lhs (stmt));
       /* In case this is a stmt that is not unconditionally executed
          when the target loop header is executed and the stmt may
         invoke undefined integer or pointer overflow rewrite it to