AArch64: Fix overflow in memcopy expansion on aarch64.
authorTamar Christina <tamar.christina@arm.com>
Tue, 27 Oct 2020 16:30:31 +0000 (16:30 +0000)
committerTamar Christina <tamar.christina@arm.com>
Tue, 27 Oct 2020 16:59:12 +0000 (16:59 +0000)
commit0f801e0b6cc9f67c9a8983127e23161f6025c5b6
treed2db0ba0a2b09c0067459200b9c9103e10dc964e
parent8eb8dcac6ed265d9da2d1971ff5a47e04fbf9fb5
AArch64: Fix overflow in memcopy expansion on aarch64.

Currently the inline memcpy expansion code for AArch64 is using a signed int
to hold the number of elements to copy.  When you giver give it a value larger
than INT_MAX it will overflow.

The overflow causes the maximum number of instructions we want to expand to
check to fail since this assumes an unsigned number.

This patch changes the maximum isns arithmetic to be unsigned HOST_WIDE_INT.

note that the calculation *must* remained signed as the memcopy issues
overlapping unaligned copies.  This means the pointer must be moved back and
so you need signed arithmetic.

gcc/ChangeLog:

PR target/97535
* config/aarch64/aarch64.c (aarch64_expand_cpymem): Use unsigned
arithmetic in check.

gcc/testsuite/ChangeLog:

PR target/97535
* gcc.target/aarch64/pr97535.c: New test.
gcc/config/aarch64/aarch64.c
gcc/testsuite/gcc.target/aarch64/pr97535.c [new file with mode: 0644]