------- Comment #8 from rguenth at gcc dot gnu dot org 2010-03-17 16:42 ------- (In reply to comment #7) > Hmm, I wonder how that could cause the bug. Probably because we can't rely > on SSA form being uptodate during cfgcleanup, and hence looking up PHI > arguments is wrong, at least for those SSA names that are registered for > updating.
But you can't have SSA names around when you rename its symbol. And only with SSA names the lookup is performed. After DOM (but before cfgcleanup completes) we have <bb 4>: # start_1 = PHI <start_16(3)> # limit_2 = PHI <limit_19(3)> # lastMid_3 = PHI <mid_10(3)> D.1978_9 = start_1 + limit_2; mid_10 = D.1978_9 >> 1; if (lastMid_3 == mid_10) goto <bb 8>; else goto <bb 5>; which is then simplified. Hm. It seems we have a SSA name replacement table, thus probably the cfgcleanup lookup code has to honor this. The following seems to fix it: Index: tree-cfgcleanup.c =================================================================== *** tree-cfgcleanup.c (revision 157512) --- tree-cfgcleanup.c (working copy) *************** cleanup_control_expr_graph (basic_block *** 100,123 **** { tree lhs = gimple_cond_lhs (stmt); tree rhs = gimple_cond_rhs (stmt); ! /* For conditions try harder and lookup single-argument ! PHI nodes. Only do so from the same basic-block though ! as other basic-blocks may be dead already. */ ! if (TREE_CODE (lhs) == SSA_NAME) { ! gimple def_stmt = SSA_NAME_DEF_STMT (lhs); ! if (gimple_code (def_stmt) == GIMPLE_PHI ! && gimple_phi_num_args (def_stmt) == 1 ! && gimple_bb (def_stmt) == gimple_bb (stmt)) ! lhs = PHI_ARG_DEF (def_stmt, 0); ! } ! if (TREE_CODE (rhs) == SSA_NAME) ! { ! gimple def_stmt = SSA_NAME_DEF_STMT (rhs); ! if (gimple_code (def_stmt) == GIMPLE_PHI ! && gimple_phi_num_args (def_stmt) == 1 ! && gimple_bb (def_stmt) == gimple_bb (stmt)) ! rhs = PHI_ARG_DEF (def_stmt, 0); } val = fold_binary_loc (loc, gimple_cond_code (stmt), boolean_type_node, lhs, rhs); --- 100,126 ---- { tree lhs = gimple_cond_lhs (stmt); tree rhs = gimple_cond_rhs (stmt); ! if (!name_mappings_registered_p ()) { ! /* For conditions try harder and lookup single-argument ! PHI nodes. Only do so from the same basic-block though ! as other basic-blocks may be dead already. */ ! if (TREE_CODE (lhs) == SSA_NAME) ! { ! gimple def_stmt = SSA_NAME_DEF_STMT (lhs); ! if (gimple_code (def_stmt) == GIMPLE_PHI ! && gimple_phi_num_args (def_stmt) == 1 ! && gimple_bb (def_stmt) == gimple_bb (stmt)) ! lhs = PHI_ARG_DEF (def_stmt, 0); ! } ! if (TREE_CODE (rhs) == SSA_NAME) ! { ! gimple def_stmt = SSA_NAME_DEF_STMT (rhs); ! if (gimple_code (def_stmt) == GIMPLE_PHI ! && gimple_phi_num_args (def_stmt) == 1 ! && gimple_bb (def_stmt) == gimple_bb (stmt)) ! rhs = PHI_ARG_DEF (def_stmt, 0); ! } } val = fold_binary_loc (loc, gimple_cond_code (stmt), boolean_type_node, lhs, rhs); though the essence of r157093 was to capture single-valued PHI nodes with constant operands, so we could restrict the lookup to consider constants only. -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- AssignedTo|unassigned at gcc dot gnu |rguenth at gcc dot gnu dot |dot org |org Status|NEW |ASSIGNED Last reconfirmed|2010-03-17 15:21:02 |2010-03-17 16:42:29 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43402