OSDN Git Service

PR middle-end/22239
authordanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Jul 2005 03:56:12 +0000 (03:56 +0000)
committerdanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Jul 2005 03:56:12 +0000 (03:56 +0000)
PR target/20126
* loop.c (loop_givs_rescan): Use expand_simple_binop instead of
gen_rtx_MINUS to handle non-replaceable (plus ((x) (const)).

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101863 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/loop.c

index 87a89f4..073b6c4 100644 (file)
@@ -1,3 +1,10 @@
+2005-07-10  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       PR middle-end/22239
+       PR target/20126
+       * loop.c (loop_givs_rescan): Use expand_simple_binop instead of
+       gen_rtx_MINUS to handle non-replaceable (plus ((x) (const)).
+
 2005-07-07  Daniel Berlin  <dberlin@dberlin.org>
 
        * tree-ssa-structalias.c (struct variable_info): Heapify complex.
index c0e3272..ae06307 100644 (file)
@@ -5496,14 +5496,18 @@ loop_givs_rescan (struct loop *loop, struct iv_class *bl, rtx *reg_map)
                                                  v->new_reg));
          else if (GET_CODE (*v->location) == PLUS
                   && REG_P (XEXP (*v->location, 0))
-                  && REG_P (v->new_reg)
                   && CONSTANT_P (XEXP (*v->location, 1)))
-           loop_insn_emit_before (loop, 0, v->insn,
-                                  gen_move_insn (XEXP (*v->location, 0),
-                                                 gen_rtx_MINUS
-                                                 (GET_MODE (*v->location),
-                                                  v->new_reg,
-                                                  XEXP (*v->location, 1))));
+           {
+             rtx tem;
+             start_sequence ();
+             tem = expand_simple_binop (GET_MODE (*v->location), MINUS,
+                                        v->new_reg, XEXP (*v->location, 1),
+                                        NULL_RTX, 0, OPTAB_LIB_WIDEN);
+             emit_move_insn (XEXP (*v->location, 0), tem);
+             tem = get_insns ();
+             end_sequence ();
+             loop_insn_emit_before (loop, 0, v->insn, tem);
+           }
          else
            {
              /* If it wasn't a reg, create a pseudo and use that.  */