From f55b94653531277c15fbda2a69b5fa61dccbd589 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Wed, 2 Nov 2005 23:06:26 +0000 Subject: [PATCH] re PR target/24600 (unrecognizable instruction) ChangeLog: PR target/24600 * loop.c (loop_givs_rescan): Use force_operand to expand complex GIVs. testsuite/ChangeLog: PR target/24600 * gcc.dg/pr24600.c: New test. From-SVN: r106404 --- gcc/ChangeLog | 6 ++++++ gcc/loop.c | 13 ++++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr24600.c | 16 ++++++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr24600.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 64a4297da81..e590fffa0b2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-11-02 Ulrich Weigand + + PR target/24600 + * loop.c (loop_givs_rescan): Use force_operand to expand + complex GIVs. + 2005-11-02 Andrew Pinski PR 22429 diff --git a/gcc/loop.c b/gcc/loop.c index b16c6a75eb5..6df63026ab8 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -5497,9 +5497,16 @@ loop_givs_rescan (struct loop *loop, struct iv_class *bl, rtx *reg_map) /* Not replaceable; emit an insn to set the original giv reg from the reduced giv. */ else if (REG_P (*v->location)) - loop_insn_emit_before (loop, 0, v->insn, - gen_move_insn (*v->location, - v->new_reg)); + { + rtx tem; + start_sequence (); + tem = force_operand (v->new_reg, *v->location); + if (tem != *v->location) + emit_move_insn (*v->location, tem); + tem = get_insns (); + end_sequence (); + loop_insn_emit_before (loop, 0, v->insn, tem); + } else if (GET_CODE (*v->location) == PLUS && REG_P (XEXP (*v->location, 0)) && CONSTANT_P (XEXP (*v->location, 1))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aa01d33892a..b0e73c3b9c7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-11-02 Ulrich Weigand + + PR target/24600 + * gcc.dg/pr24600.c: New test. + 2005-11-02 Mark Mitchell PR c++/19253 diff --git a/gcc/testsuite/gcc.dg/pr24600.c b/gcc/testsuite/gcc.dg/pr24600.c new file mode 100644 index 00000000000..62bb7cad600 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr24600.c @@ -0,0 +1,16 @@ +/* This used to ICE on s390 due to a old-loop bug. */ + +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +char *strcpy (char *dest, const char *src); + +void test (char *Line, int len) +{ + int z; + + for (z = 1; z <= len; z++) + if (Line[z - 1]) + strcpy (Line + z + 1, Line); +} + -- 2.30.2