diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2005-11-02 23:06:26 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2005-11-02 23:06:26 +0000 |
commit | f55b94653531277c15fbda2a69b5fa61dccbd589 (patch) | |
tree | 676c9dc6ae244c11a41cdeb64a78997e9e74f62b /gcc/loop.c | |
parent | 3532623302b910ef78cc8eb024d59224e3ada4e5 (diff) | |
download | gcc-f55b94653531277c15fbda2a69b5fa61dccbd589.zip gcc-f55b94653531277c15fbda2a69b5fa61dccbd589.tar.gz gcc-f55b94653531277c15fbda2a69b5fa61dccbd589.tar.bz2 |
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
Diffstat (limited to 'gcc/loop.c')
-rw-r--r-- | gcc/loop.c | 13 |
1 files changed, 10 insertions, 3 deletions
@@ -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))) |