This fixes the PR by removing an incomplete duplicate implementation. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard 2016-03-07 Richard Biener <rguent...@suse.de> PR tree-optimization/70115 * tree-ssa-loop-ivcanon.c (propagate_into_all_uses): Remove. (propagate_constants_for_unrolling): Use replace_uses_by. * gcc.dg/torture/pr70115.c: New testcase. Index: gcc/tree-ssa-loop-ivcanon.c =================================================================== *** gcc/tree-ssa-loop-ivcanon.c (revision 233964) --- gcc/tree-ssa-loop-ivcanon.c (working copy) *************** canonicalize_induction_variables (void) *** 1164,1201 **** return 0; } - /* Propagate VAL into all uses of SSA_NAME. */ - - static void - propagate_into_all_uses (tree ssa_name, tree val) - { - imm_use_iterator iter; - gimple *use_stmt; - - FOR_EACH_IMM_USE_STMT (use_stmt, iter, ssa_name) - { - gimple_stmt_iterator use_stmt_gsi = gsi_for_stmt (use_stmt); - use_operand_p use; - - FOR_EACH_IMM_USE_ON_STMT (use, iter) - SET_USE (use, val); - - if (is_gimple_assign (use_stmt) - && get_gimple_rhs_class (gimple_assign_rhs_code (use_stmt)) - == GIMPLE_SINGLE_RHS) - { - tree rhs = gimple_assign_rhs1 (use_stmt); - - if (TREE_CODE (rhs) == ADDR_EXPR) - recompute_tree_invariant_for_addr_expr (rhs); - } - - fold_stmt_inplace (&use_stmt_gsi); - update_stmt (use_stmt); - maybe_clean_or_replace_eh_stmt (use_stmt, use_stmt); - } - } - /* Propagate constant SSA_NAMEs defined in basic block BB. */ static void --- 1164,1169 ---- *************** propagate_constants_for_unrolling (basic *** 1212,1218 **** && gimple_phi_num_args (phi) == 1 && TREE_CODE (arg) == INTEGER_CST) { ! propagate_into_all_uses (result, arg); gsi_remove (&gsi, true); release_ssa_name (result); } --- 1180,1186 ---- && gimple_phi_num_args (phi) == 1 && TREE_CODE (arg) == INTEGER_CST) { ! replace_uses_by (result, arg); gsi_remove (&gsi, true); release_ssa_name (result); } *************** propagate_constants_for_unrolling (basic *** 1231,1237 **** && (lhs = gimple_assign_lhs (stmt), TREE_CODE (lhs) == SSA_NAME) && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs)) { ! propagate_into_all_uses (lhs, gimple_assign_rhs1 (stmt)); gsi_remove (&gsi, true); release_ssa_name (lhs); } --- 1199,1205 ---- && (lhs = gimple_assign_lhs (stmt), TREE_CODE (lhs) == SSA_NAME) && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs)) { ! replace_uses_by (lhs, gimple_assign_rhs1 (stmt)); gsi_remove (&gsi, true); release_ssa_name (lhs); } Index: gcc/testsuite/gcc.dg/torture/pr70115.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr70115.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr70115.c (working copy) *************** *** 0 **** --- 1,20 ---- + /* { dg-do compile } */ + + typedef int size_t; + char a; + int main() + { + size_t b, c; + for (;;) + { + b = 0; + for (; c;) + ; + for (; b < sizeof(long); b++) + ; + for (; b < c; b++) + a++; + for (; c < b; c++) + ; + } + }