aboutsummaryrefslogtreecommitdiff
path: root/gcc/dojump.c
diff options
context:
space:
mode:
authorZack Weinberg <zack@gcc.gnu.org>2004-08-18 16:39:40 +0000
committerZack Weinberg <zack@gcc.gnu.org>2004-08-18 16:39:40 +0000
commit6aaf3ddef9a6fccf796ff13c7a03952c5d350158 (patch)
tree1c7cb30c823791b9cb19f3cacc2cad909c5da877 /gcc/dojump.c
parentd62294f57e859308c23fcbd156bb88b21e8f4547 (diff)
downloadgcc-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.c32
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