[PATCH] Fix LIM not clearing range-info

Richard Biener rguenther@suse.de
Wed Dec 10 14:18:00 GMT 2014


While working on PR42108 I noticed that LIM fails to clear range-info
on SSA names whose defining statements it moves, possibly causing
wrong code generation later on.

The following fixes that.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2014-12-10  Richard Biener  <rguenther@suse.de>

	 * tree-ssa-loop-im.c
	 (move_computations_dom_walker::before_dom_children): Clear
	 SSA_NAME_RANGE_INFO on moved stmts.

Index: gcc/tree-ssa-loop-im.c
===================================================================
--- gcc/tree-ssa-loop-im.c	(revision 218515)
+++ gcc/tree-ssa-loop-im.c	(working copy)
@@ -1232,6 +1286,11 @@ move_computations_dom_walker::before_dom
 					  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))))
+	SSA_NAME_RANGE_INFO (gimple_assign_lhs (new_stmt)) = NULL;
       gsi_insert_on_edge (loop_preheader_edge (level), new_stmt);
       remove_phi_node (&bsi, false);
     }
@@ -1291,6 +1350,13 @@ move_computations_dom_walker::before_dom
 	    }
 	}
       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))))
+	SSA_NAME_RANGE_INFO (gimple_get_lhs (stmt)) = NULL;
       /* 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



More information about the Gcc-patches mailing list