tree-cfg.c (find_taken_edge): Statically compute the truth value of a predicate comparing an SSA_NAME to itself.
* tree-cfg.c (find_taken_edge): Statically compute the truth value of a predicate comparing an SSA_NAME to itself. From-SVN: r84561
This commit is contained in:
parent
938bf7475d
commit
255cd731f4
|
@ -1,3 +1,8 @@
|
||||||
|
2004-07-12 Diego Novillo <dnovillo@redhat.com>
|
||||||
|
|
||||||
|
* tree-cfg.c (find_taken_edge): Statically compute the truth
|
||||||
|
value of a predicate comparing an SSA_NAME to itself.
|
||||||
|
|
||||||
2004-07-12 Roger Sayle <roger@eyesopen.com>
|
2004-07-12 Roger Sayle <roger@eyesopen.com>
|
||||||
|
|
||||||
* config/rs6000/rs6000.c (rs6000_rtx_costs): Indicate that the
|
* config/rs6000/rs6000.c (rs6000_rtx_costs): Indicate that the
|
||||||
|
|
|
@ -1991,9 +1991,9 @@ cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Given a control block BB and a constant value VAL, return the edge that
|
/* Given a control block BB and a predicate VAL, return the edge that
|
||||||
will be taken out of the block. If VAL does not match a unique edge,
|
will be taken out of the block. If VAL does not match a unique
|
||||||
NULL is returned. */
|
edge, NULL is returned. */
|
||||||
|
|
||||||
edge
|
edge
|
||||||
find_taken_edge (basic_block bb, tree val)
|
find_taken_edge (basic_block bb, tree val)
|
||||||
|
@ -2007,6 +2007,24 @@ find_taken_edge (basic_block bb, tree val)
|
||||||
abort ();
|
abort ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* If VAL is a predicate of the form N RELOP N, where N is an
|
||||||
|
SSA_NAME, we can always determine its truth value (except when
|
||||||
|
doing floating point comparisons that may involve NaNs). */
|
||||||
|
if (val
|
||||||
|
&& TREE_CODE_CLASS (TREE_CODE (val)) == '<'
|
||||||
|
&& TREE_OPERAND (val, 0) == TREE_OPERAND (val, 1)
|
||||||
|
&& TREE_CODE (TREE_OPERAND (val, 0)) == SSA_NAME
|
||||||
|
&& (TREE_CODE (TREE_TYPE (TREE_OPERAND (val, 0))) != REAL_TYPE
|
||||||
|
|| !HONOR_NANS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (val, 0))))))
|
||||||
|
{
|
||||||
|
enum tree_code code = TREE_CODE (val);
|
||||||
|
|
||||||
|
if (code == EQ_EXPR || code == LE_EXPR || code == GE_EXPR)
|
||||||
|
val = boolean_true_node;
|
||||||
|
else if (code == LT_EXPR || code == GT_EXPR || code == NE_EXPR)
|
||||||
|
val = boolean_false_node;
|
||||||
|
}
|
||||||
|
|
||||||
/* If VAL is not a constant, we can't determine which edge might
|
/* If VAL is not a constant, we can't determine which edge might
|
||||||
be taken. */
|
be taken. */
|
||||||
if (val == NULL || !really_constant_p (val))
|
if (val == NULL || !really_constant_p (val))
|
||||||
|
|
Loading…
Reference in New Issue