diff options
| -rw-r--r-- | gcc/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/dojump.c | 12 |
2 files changed, 13 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ddb8253..06f3913 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-10-21 Paolo Bonzini <bonzini@gnu.org> + + * dojump.c (do_jump): Handle side-effecting TRUTH_AND_EXPR and + TRUTH_OR_EXPR. + 2005-10-20 Steven Bosscher <stevenb@suse.de> PR tree-optimization/24225 diff --git a/gcc/dojump.c b/gcc/dojump.c index 6dca9d3..d65347e 100644 --- a/gcc/dojump.c +++ b/gcc/dojump.c @@ -511,8 +511,10 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label) break; case TRUTH_AND_EXPR: - /* High branch cost, expand as the bitwise AND of the conditions. */ - if (BRANCH_COST >= 4) + /* High branch cost, expand as the bitwise AND of the conditions. + Do the same if the RHS has side effects, because we're effectively + turning a TRUTH_AND_EXPR into a TRUTH_ANDIF_EXPR. */ + if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1))) goto normal; if (if_false_label == NULL_RTX) @@ -529,8 +531,10 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label) break; case TRUTH_OR_EXPR: - /* High branch cost, expand as the bitwise OR of the conditions. */ - if (BRANCH_COST >= 4) + /* High branch cost, expand as the bitwise OR of the conditions. + Do the same if the RHS has side effects, because we're effectively + turning a TRUTH_OR_EXPR into a TRUTH_ORIF_EXPR. */ + if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1))) goto normal; if (if_true_label == NULL_RTX) |
