diff options
author | Paolo Bonzini <bonzini@gcc.gnu.org> | 2005-10-19 10:37:31 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2005-10-19 10:37:31 +0000 |
commit | d1f36c51be6d9560caa7931e970bd1905da2ebe5 (patch) | |
tree | b8428a9212e5f6527a8b3d2f126a792184341e6e /gcc/dojump.c | |
parent | 2cdc88b64d540cd3ab1c5d1b89dd828abf373068 (diff) | |
download | gcc-d1f36c51be6d9560caa7931e970bd1905da2ebe5.tar.gz |
re PR target/19672 (Performance regression in simple loop code)
2005-10-18 Paolo Bonzini <bonzini@gnu.org>
PR #19672
* dojump.c (do_jump): Handle TRUTH_AND_EXPR and TRUTH_OR_EXPR here.
From-SVN: r105606
Diffstat (limited to 'gcc/dojump.c')
-rw-r--r-- | gcc/dojump.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/gcc/dojump.c b/gcc/dojump.c index 741c30a8dca..6dca9d32b57 100644 --- a/gcc/dojump.c +++ b/gcc/dojump.c @@ -510,6 +510,42 @@ 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) + goto normal; + + if (if_false_label == NULL_RTX) + { + drop_through_label = gen_label_rtx (); + do_jump (TREE_OPERAND (exp, 0), drop_through_label, NULL_RTX); + do_jump (TREE_OPERAND (exp, 1), NULL_RTX, if_true_label); + } + else + { + do_jump (TREE_OPERAND (exp, 0), if_false_label, NULL_RTX); + do_jump (TREE_OPERAND (exp, 1), if_false_label, if_true_label); + } + break; + + case TRUTH_OR_EXPR: + /* High branch cost, expand as the bitwise OR of the conditions. */ + if (BRANCH_COST >= 4) + goto normal; + + if (if_true_label == NULL_RTX) + { + drop_through_label = gen_label_rtx (); + do_jump (TREE_OPERAND (exp, 0), NULL_RTX, drop_through_label); + do_jump (TREE_OPERAND (exp, 1), if_false_label, NULL_RTX); + } + else + { + do_jump (TREE_OPERAND (exp, 0), NULL_RTX, if_true_label); + do_jump (TREE_OPERAND (exp, 1), if_false_label, if_true_label); + } + break; + /* Special case: __builtin_expect (<test>, 0) and __builtin_expect (<test>, 1) @@ -540,8 +576,8 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label) } } } + /* Fall through and generate the normal code. */ - default: normal: temp = expand_expr (exp, NULL_RTX, VOIDmode, 0); |