diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7ddbfafd227..ab5ed590294 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-02-14 Olivier Hainque + + * loop.c (check_dbra_loop): Use gen_int_mode instead of GEN_INT + for start_value when it is directly moved into reg, and factorize + the retrieval of GET_MODE (reg). + 2004-02-14 Richard Sandiford * config/mips/mips-protos.h (mips_load_got_page): Delete. diff --git a/gcc/loop.c b/gcc/loop.c index 911d561fd6b..b09708d1961 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -8015,6 +8015,7 @@ check_dbra_loop (struct loop *loop, int insn_count) struct loop_ivs *ivs = LOOP_IVS (loop); struct iv_class *bl; rtx reg; + enum machine_mode mode; rtx jump_label; rtx final_value; rtx start_value; @@ -8435,6 +8436,7 @@ check_dbra_loop (struct loop *loop, int insn_count) /* Save some info needed to produce the new insns. */ reg = bl->biv->dest_reg; + mode = GET_MODE (reg); jump_label = condjump_label (PREV_INSN (loop_end)); new_add_val = GEN_INT (-INTVAL (bl->biv->add_val)); @@ -8446,12 +8448,12 @@ check_dbra_loop (struct loop *loop, int insn_count) if (initial_value == const0_rtx && GET_CODE (comparison_value) == CONST_INT) { - start_value = GEN_INT (comparison_val - add_adjust); + start_value + = gen_int_mode (comparison_val - add_adjust, mode); loop_insn_hoist (loop, gen_move_insn (reg, start_value)); } else if (GET_CODE (initial_value) == CONST_INT) { - enum machine_mode mode = GET_MODE (reg); rtx offset = GEN_INT (-INTVAL (initial_value) - add_adjust); rtx add_insn = gen_add3_insn (reg, comparison_value, offset); @@ -8467,7 +8469,6 @@ check_dbra_loop (struct loop *loop, int insn_count) } else if (! add_adjust) { - enum machine_mode mode = GET_MODE (reg); rtx sub_insn = gen_sub3_insn (reg, comparison_value, initial_value); @@ -8525,7 +8526,7 @@ check_dbra_loop (struct loop *loop, int insn_count) /* Add new compare/branch insn at end of loop. */ start_sequence (); emit_cmp_and_jump_insns (reg, const0_rtx, cmp_code, NULL_RTX, - GET_MODE (reg), 0, + mode, 0, XEXP (jump_label, 0)); tem = get_insns (); end_sequence (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e0ff48e75c2..7d293d36e4d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-02-14 Eric Botcazou + + * gcc.c-torture/compile/20040214-1.c: New test. + 2004-02-14 Kriang Lerdsuwanakij PR c++/13635 @@ -20794,3 +20798,4 @@ rlsruhe.de> * New file. + diff --git a/gcc/testsuite/gcc.c-torture/compile/20040214-1.c b/gcc/testsuite/gcc.c-torture/compile/20040214-1.c new file mode 100644 index 00000000000..90b09dcdbab --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20040214-1.c @@ -0,0 +1,7 @@ +void foo(void) +{ + char c; + + for (c = -75; c <= 75; c++) + ; +}