diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ifcvt.c | 36 |
2 files changed, 25 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9111be51088..e1c5d64a6bb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Fri Jan 10 22:05:35 CET 2003 Jan Hubicka <jh@suse.cz> + + * ifcvt.c (noce_try_addcc): Do not call emit_conditional_add + with weird operands. + 2003-01-10 Dale Johannesen <dalej@apple.com> * calls.c (load_register_parameters): Add is_sibcall, sibcall_failure diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 3cf01942da7..21a7e648319 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -882,26 +882,30 @@ noce_try_addcc (if_info) enum rtx_code code = reversed_comparison_code (cond, if_info->jump); /* First try to use addcc pattern. */ - start_sequence (); - target = emit_conditional_add (if_info->x, code, - XEXP (cond, 0), XEXP (cond, 1), - VOIDmode, - if_info->b, XEXP (if_info->a, 1), - GET_MODE (if_info->x), - (code == LTU || code == GEU - || code == LEU || code == GTU)); - if (target) + if (general_operand (XEXP (cond, 0), VOIDmode) + && general_operand (XEXP (cond, 1), VOIDmode)) { - if (target != if_info->x) - noce_emit_move_insn (if_info->x, target); + start_sequence (); + target = emit_conditional_add (if_info->x, code, + XEXP (cond, 0), XEXP (cond, 1), + VOIDmode, + if_info->b, XEXP (if_info->a, 1), + GET_MODE (if_info->x), + (code == LTU || code == GEU + || code == LEU || code == GTU)); + if (target) + { + if (target != if_info->x) + noce_emit_move_insn (if_info->x, target); - seq = get_insns (); + seq = get_insns (); + end_sequence (); + emit_insn_before_scope (seq, if_info->jump, + INSN_SCOPE (if_info->insn_a)); + return TRUE; + } end_sequence (); - emit_insn_before_scope (seq, if_info->jump, - INSN_SCOPE (if_info->insn_a)); - return TRUE; } - end_sequence (); /* If that fails, construct conditional increment or decrement using setcc. */ |