loop.c (check_dbra_loop): Use gen_int_mode instead of GEN_INT for start_value when...
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 14 Feb 2004 14:43:21 +0000 (14:43 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 14 Feb 2004 14:43:21 +0000 (14:43 +0000)
* 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).

From-SVN: r77803

gcc/ChangeLog
gcc/loop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20040214-1.c [new file with mode: 0644]

index 7ddbfafd2270ad96fdfabfb379cdb614f0b3332e..ab5ed59029418606f948f687078101537f2ffeb4 100644 (file)
@@ -1,3 +1,9 @@
+2004-02-14  Olivier Hainque  <hainque@act-europe.fr>
+
+       * 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  <rsandifo@redhat.com>
 
        * config/mips/mips-protos.h (mips_load_got_page): Delete.
index 911d561fd6b9662408b70a8f031e90a3484e4e8d..b09708d19610ad7e78880bfa67d7ee629d75d571 100644 (file)
@@ -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 ();
index e0ff48e75c21cb9c69bc57a24ec146a4c524f72f..7d293d36e4d70bcd9789786b1cfe2f7c6198cc11 100644 (file)
@@ -1,3 +1,7 @@
+2004-02-14  Eric Botcazou  <ebotcazou@act-europe.fr>
+
+       * gcc.c-torture/compile/20040214-1.c: New test.
+
 2004-02-14  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        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 (file)
index 0000000..90b09dc
--- /dev/null
@@ -0,0 +1,7 @@
+void foo(void)
+{
+  char c;
+
+  for (c = -75; c <= 75; c++)
+    ;
+}