From c0a3eeacdacc658c531709c785772d329d3c4ebd Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Wed, 13 Mar 2002 13:00:25 +0000 Subject: [PATCH] expr.c (expand_expr, [...]): Do not call copy_to_reg with VOIDmode operand. * expr.c (expand_expr, case NE_EXPR): Do not call copy_to_reg with VOIDmode operand. Add compile-time optimization for constant results. From-SVN: r50734 --- gcc/ChangeLog | 5 +++++ gcc/expr.c | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c1aaaf1224..cf1127efd73 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-03-13 Ulrich Weigand + + * expr.c (expand_expr, case NE_EXPR): Do not call copy_to_reg with + VOIDmode operand. Add compile-time optimization for constant results. + 2002-03-12 Jason Merrill * c-typeck.c (convert_for_assignment): Don't allow conversions diff --git a/gcc/expr.c b/gcc/expr.c index ac756432f20..5aed1dc0828 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -7944,8 +7944,25 @@ expand_expr (exp, target, tmode, modifier) temp = expand_expr (TREE_OPERAND (exp, 0), original_target, VOIDmode, 0); + /* If temp is constant, we can just compute the result. */ + if (GET_CODE (temp) == CONST_INT) + { + if (INTVAL (temp) != 0) + emit_move_insn (target, const1_rtx); + else + emit_move_insn (target, const0_rtx); + + return target; + } + if (temp != original_target) - temp = copy_to_reg (temp); + { + enum machine_mode mode1 = GET_MODE (temp); + if (mode1 == VOIDmode) + mode1 = tmode != VOIDmode ? tmode : mode; + + temp = copy_to_mode_reg (mode1, temp); + } op1 = gen_label_rtx (); emit_cmp_and_jump_insns (temp, const0_rtx, EQ, NULL_RTX, -- 2.30.2