lim: Reset flow sensitive info even for pointers [PR103192]

Message ID 20211117091648.GI2710@tucnak
State Committed
Headers
Series lim: Reset flow sensitive info even for pointers [PR103192] |

Commit Message

Jakub Jelinek Nov. 17, 2021, 9:16 a.m. UTC
  Hi!

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.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

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.


	Jakub
  

Comments

Jeff Law Nov. 17, 2021, 1:14 p.m. UTC | #1
On 11/17/2021 2:16 AM, Jakub Jelinek via Gcc-patches wrote:
> Hi!
>
> 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.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 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.
OK
jeff
  

Patch

--- gcc/tree-ssa-loop-im.c.jj	2021-09-11 09:33:37.936331237 +0200
+++ gcc/tree-ssa-loop-im.c	2021-11-16 14:42:19.546562429 +0100
@@ -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