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 <rguent...@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