aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorAndrew Stubbs <ams@codesourcery.com>2021-05-07 15:31:05 +0100
committerAndrew Stubbs <ams@codesourcery.com>2021-05-07 23:47:38 +0100
commit07d7d37d1a33efb04f1262e56f4b82d6e1089e75 (patch)
tree9265b0ef8ef7bae044a42c212f73acf1a7b2911d /gcc/builtins.c
parenta87ceadf17b4a899f3e74e2da8b6b209461d2742 (diff)
downloadgcc-07d7d37d1a33efb04f1262e56f4b82d6e1089e75.zip
gcc-07d7d37d1a33efb04f1262e56f4b82d6e1089e75.tar.gz
gcc-07d7d37d1a33efb04f1262e56f4b82d6e1089e75.tar.bz2
Ensure emit_move_insn operands are valid
Some architectures are fine with PLUS in move instructions, but others are not (amdgcn is the motivating example). 2021-05-07 Jakub Jelinek <jakub@redhat.com> Andrew Stubbs <amd@codesourcery.com> gcc/ChangeLog: PR target/100418 * builtins.c (try_store_by_multiple_pieces): Use force_operand for emit_move_insn operands.
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 6f67eb7..bc40bad 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -6775,9 +6775,10 @@ try_store_by_multiple_pieces (rtx to, rtx len, unsigned int ctz_len,
/* Adjust PTR, TO and REM. Since TO's address is likely
PTR+offset, we have to replace it. */
- emit_move_insn (ptr, XEXP (to, 0));
+ emit_move_insn (ptr, force_operand (XEXP (to, 0), NULL_RTX));
to = replace_equiv_address (to, ptr);
- emit_move_insn (rem, plus_constant (ptr_mode, rem, -blksize));
+ rtx rem_minus_blksize = plus_constant (ptr_mode, rem, -blksize);
+ emit_move_insn (rem, force_operand (rem_minus_blksize, NULL_RTX));
}
/* Iterate over power-of-two block sizes from the maximum length to
@@ -6811,9 +6812,10 @@ try_store_by_multiple_pieces (rtx to, rtx len, unsigned int ctz_len,
/* Adjust REM and PTR, unless this is the last iteration. */
if (i != sctz_len)
{
- emit_move_insn (ptr, XEXP (to, 0));
+ emit_move_insn (ptr, force_operand (XEXP (to, 0), NULL_RTX));
to = replace_equiv_address (to, ptr);
- emit_move_insn (rem, plus_constant (ptr_mode, rem, -blksize));
+ rtx rem_minus_blksize = plus_constant (ptr_mode, rem, -blksize);
+ emit_move_insn (rem, force_operand (rem_minus_blksize, NULL_RTX));
}
if (label)