[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