diff options
author | Zack Weinberg <zack@gcc.gnu.org> | 2004-08-18 16:39:40 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2004-08-18 16:39:40 +0000 |
commit | 6aaf3ddef9a6fccf796ff13c7a03952c5d350158 (patch) | |
tree | 1c7cb30c823791b9cb19f3cacc2cad909c5da877 /gcc/dojump.c | |
parent | d62294f57e859308c23fcbd156bb88b21e8f4547 (diff) | |
download | gcc-6aaf3ddef9a6fccf796ff13c7a03952c5d350158.zip gcc-6aaf3ddef9a6fccf796ff13c7a03952c5d350158.tar.gz gcc-6aaf3ddef9a6fccf796ff13c7a03952c5d350158.tar.bz2 |
dojump.c (do_jump <unordered_bcc>): Do not recursively call self with a TRUTH_ORIF_EXPR...
* dojump.c (do_jump <unordered_bcc>): Do not recursively call
self with a TRUTH_ORIF_EXPR; generate the appropriate jump
sequence inline. Move drop_through_label code into this
block, being the only place it is used. Adjust comments.
From-SVN: r86192
Diffstat (limited to 'gcc/dojump.c')
-rw-r--r-- | gcc/dojump.c | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/gcc/dojump.c b/gcc/dojump.c index 3877f79..eb4f21c 100644 --- a/gcc/dojump.c +++ b/gcc/dojump.c @@ -149,19 +149,12 @@ prefer_and_bit_test (enum machine_mode mode, int bitnum) do_jump always does any pending stack adjust except when it does not actually perform a jump. An example where there is no jump - is when EXP is `(foo (), 0)' and IF_FALSE_LABEL is null. - - This function is responsible for optimizing cases such as - &&, || and comparison operators in EXP. */ + is when EXP is `(foo (), 0)' and IF_FALSE_LABEL is null. */ void do_jump (tree exp, rtx if_false_label, rtx if_true_label) { enum tree_code code = TREE_CODE (exp); - /* Some cases need to create a label to jump to - in order to properly fall through. - These cases set DROP_THROUGH_LABEL nonzero. */ - rtx drop_through_label = 0; rtx temp; int i; tree type; @@ -448,13 +441,23 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label) tree op0 = save_expr (TREE_OPERAND (exp, 0)); tree op1 = save_expr (TREE_OPERAND (exp, 1)); tree cmp0, cmp1; + rtx drop_through_label = 0; /* If the target doesn't support combined unordered compares, decompose into two comparisons. */ + if (if_true_label == 0) + drop_through_label = if_true_label = gen_label_rtx (); + cmp0 = fold (build2 (tcode1, TREE_TYPE (exp), op0, op1)); cmp1 = fold (build2 (tcode2, TREE_TYPE (exp), op0, op1)); - exp = build2 (TRUTH_ORIF_EXPR, TREE_TYPE (exp), cmp0, cmp1); - do_jump (exp, if_false_label, if_true_label); + do_jump (cmp0, 0, if_true_label); + do_jump (cmp1, if_false_label, if_true_label); + + if (drop_through_label) + { + do_pending_stack_adjust (); + emit_label (drop_through_label); + } } } break; @@ -528,15 +531,6 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label) else abort (); } - - if (drop_through_label) - { - /* If do_jump produces code that might be jumped around, - do any stack adjusts from that code, before the place - where control merges in. */ - do_pending_stack_adjust (); - emit_label (drop_through_label); - } } /* Given a comparison expression EXP for values too wide to be compared |