diff options
author | Diego Novillo <dnovillo@redhat.com> | 2004-07-12 15:38:25 +0000 |
---|---|---|
committer | Diego Novillo <dnovillo@gcc.gnu.org> | 2004-07-12 11:38:25 -0400 |
commit | 255cd731f40dd7b5855e0bc12a9cdd6383e65321 (patch) | |
tree | 028ad72a48dbd069536dd663bdf97b2074816a1c /gcc/tree-cfg.c | |
parent | 938bf7475d34bb808144dff4ea0903026bd70b28 (diff) | |
download | gcc-255cd731f40dd7b5855e0bc12a9cdd6383e65321.zip gcc-255cd731f40dd7b5855e0bc12a9cdd6383e65321.tar.gz gcc-255cd731f40dd7b5855e0bc12a9cdd6383e65321.tar.bz2 |
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
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index bd2ec9a..6207fd3 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -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 - will be taken out of the block. If VAL does not match a unique edge, - NULL is returned. */ +/* 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, NULL is returned. */ edge find_taken_edge (basic_block bb, tree val) @@ -2007,6 +2007,24 @@ find_taken_edge (basic_block bb, tree val) abort (); #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 be taken. */ if (val == NULL || !really_constant_p (val)) |