aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2010-05-28 15:35:56 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2010-05-28 15:35:56 +0200
commit005d613b2d1f0aa304895c9fce7551ead06e9964 (patch)
treeaef948112082031f151b429a6974d2d490c0650b /gcc/builtins.c
parent773c1c8d20959a8e2d1e6bece62490292e29c559 (diff)
downloadgcc-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.c9
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);