expand: Simplify removing subregs when expanding a copy [PR95254]
authorFei Yang <felix.yang@huawei.com>
Fri, 5 Jun 2020 09:34:59 +0000 (10:34 +0100)
committerRichard Sandiford <richard.sandiford@arm.com>
Fri, 5 Jun 2020 09:34:59 +0000 (10:34 +0100)
commit9a182ef9ee011935d827ab5c6c9a7cd8e22257d8
treeb887ecf2cc31b2256c9326d2d5ff45f71e819fd0
parent892b51cb73f24157391cd18c2215e8d703af97e7
expand: Simplify removing subregs when expanding a copy [PR95254]

In rtl expand, if we have a copy that matches one of the following patterns:
  (set (subreg:M1 (reg:M2 ...)) (subreg:M1 (reg:M2 ...)))
  (set (subreg:M1 (reg:M2 ...)) (mem:M1 ADDR))
  (set (mem:M1 ADDR) (subreg:M1 (reg:M2 ...)))
  (set (subreg:M1 (reg:M2 ...)) (constant C))
where mode M1 is equal in size to M2, try to detect whether the mode change
involves an implicit round trip through memory.  If so, see if we can avoid
that by removing the subregs and doing the move in mode M2 instead.

2020-06-05  Felix Yang  <felix.yang@huawei.com>

gcc/
PR target/95254
* expr.c (emit_move_insn): Check src and dest of the copy to see
if one or both of them are subregs, try to remove the subregs when
innermode and outermode are equal in size and the mode change involves
an implicit round trip through memory.

gcc/testsuite/
PR target/95254
* gcc.target/aarch64/pr95254.c: New test.
* gcc.target/i386/pr67609.c: Check "movq\t%xmm0" instead of "movdqa".
gcc/expr.c
gcc/testsuite/gcc.target/aarch64/pr95254.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr67609.c