tree-ssa-dom.c (thread_across_edge): Do not use local_fold.

* tree-ssa-dom.c (thread_across_edge): Do not use local_fold.
	Strip away all type conversions after simplifying the
	condition.

        * tree-cfgcleanup.c (merge_phi_nodes): Allow merging in some
        cases the forwarder block dominates the destination.

From-SVN: r108833
This commit is contained in:
Jeff Law 2005-12-19 21:08:01 -07:00 committed by Jeff Law
parent 4322a86f32
commit ea65cd378b
3 changed files with 50 additions and 3 deletions

View File

@ -1,3 +1,12 @@
2005-12-19 Jeff Law <law@redhat.com>
* tree-ssa-dom.c (thread_across_edge): Do not use local_fold.
Strip away all type conversions after simplifying the
condition.
* tree-cfgcleanup.c (merge_phi_nodes): Allow merging in some
cases the forwarder block dominates the destination.
2005-12-19 DJ Delorie <dj@redhat.com>
* reload1.c (spill_failure): Dump reload data to dump file.

View File

@ -743,6 +743,39 @@ merge_phi_nodes (void)
nodes at BB. */
*current++ = bb;
}
else
{
tree phi;
/* BB dominates DEST. There may be many users of the PHI
nodes in BB. However, there is still a trivial case we
can handle. If the result of every PHI in BB is used
only by a PHI in DEST, then we can trivially merge the
PHI nodes from BB into DEST. */
for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
{
tree result = PHI_RESULT (phi);
int num_uses = num_imm_uses (result);
use_operand_p imm_use;
tree use_stmt;
/* If the PHI's result is never used, then we can just
ignore it. */
if (num_uses == 0)
continue;
/* Get the single use of the result of this PHI node. */
if (!single_imm_use (result, &imm_use, &use_stmt)
|| TREE_CODE (use_stmt) != PHI_NODE
|| bb_for_stmt (use_stmt) != dest)
break;
}
/* If the loop above iterated thorugh all the PHI nodes
in BB, then we can merge the PHIs from BB into DEST. */
if (!phi)
*current++ = bb;
}
}
/* Now let's drain WORKLIST. */

View File

@ -892,9 +892,14 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e)
TREE_OPERAND (COND_EXPR_COND (dummy_cond), 1) = op1;
}
/* If the conditional folds to an invariant, then we are done,
otherwise look it up in the hash tables. */
cached_lhs = local_fold (COND_EXPR_COND (dummy_cond));
/* We absolutely do not care about any type conversions
we only care about a zero/nonzero value. */
cached_lhs = fold (COND_EXPR_COND (dummy_cond));
while (TREE_CODE (cached_lhs) == NOP_EXPR
|| TREE_CODE (cached_lhs) == CONVERT_EXPR
|| TREE_CODE (cached_lhs) == NON_LVALUE_EXPR)
cached_lhs = TREE_OPERAND (cached_lhs, 0);
if (! is_gimple_min_invariant (cached_lhs))
{
cached_lhs = lookup_avail_expr (dummy_cond, false);