summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>2005-11-02 23:06:26 +0000
committeruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>2005-11-02 23:06:26 +0000
commitf37ca8000c2c0db7e030a3e0e5cf49b74d30769b (patch)
tree676c9dc6ae244c11a41cdeb64a78997e9e74f62b
parentda6a20f5690b7f41bf71bbe6d3f7ac38c5583d86 (diff)
downloadgcc-f37ca8000c2c0db7e030a3e0e5cf49b74d30769b.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@106404 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/loop.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr24600.c16
4 files changed, 37 insertions, 3 deletions
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 <uweigand@de.ibm.com>
+
+ PR target/24600
+ * loop.c (loop_givs_rescan): Use force_operand to expand
+ complex GIVs.
+
2005-11-02 Andrew Pinski <pinskia@physics.uc.edu>
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 <uweigand@de.ibm.com>
+
+ PR target/24600
+ * gcc.dg/pr24600.c: New test.
+
2005-11-02 Mark Mitchell <mark@codesourcery.com>
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);
+}
+