diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-05-28 15:35:56 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-05-28 15:35:56 +0200 |
commit | 005d613b2d1f0aa304895c9fce7551ead06e9964 (patch) | |
tree | aef948112082031f151b429a6974d2d490c0650b /gcc/builtins.c | |
parent | 773c1c8d20959a8e2d1e6bece62490292e29c559 (diff) | |
download | gcc-005d613b2d1f0aa304895c9fce7551ead06e9964.zip gcc-005d613b2d1f0aa304895c9fce7551ead06e9964.tar.gz gcc-005d613b2d1f0aa304895c9fce7551ead06e9964.tar.bz2 |
re PR target/43636 (ICE in extract_insn, at recog.c:2103)
PR target/43636
* builtins.c (expand_movstr): Use a temporary pseudo instead
of target even when target is not NULL and not const0_rtx, but
fails movstr predicate.
* config/m32c/blkmov.md (movstr): Add predicate to first operand.
* gcc.c-torture/compile/pr43636.c: New test.
From-SVN: r159972
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index e16240b..e57449dd 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -3560,6 +3560,7 @@ expand_movstr (tree dest, tree src, rtx target, int endp) dest_mem = get_memory_rtx (dest, NULL); src_mem = get_memory_rtx (src, NULL); + data = insn_data + CODE_FOR_movstr; if (!endp) { target = force_reg (Pmode, XEXP (dest_mem, 0)); @@ -3568,18 +3569,18 @@ expand_movstr (tree dest, tree src, rtx target, int endp) } else { - if (target == 0 || target == const0_rtx) + if (target == 0 + || target == const0_rtx + || ! (*data->operand[0].predicate) (target, Pmode)) { end = gen_reg_rtx (Pmode); - if (target == 0) + if (target != const0_rtx) target = end; } else end = target; } - data = insn_data + CODE_FOR_movstr; - if (data->operand[0].mode != VOIDmode) end = gen_lowpart (data->operand[0].mode, end); |