]> git.ipfire.org Git - thirdparty/gcc.git/commit
[RS6000] altivec style lvx/stvx addresses vs power10
authorAlan Modra <amodra@gmail.com>
Fri, 23 Oct 2020 01:41:15 +0000 (12:11 +1030)
committerPat Haugen <pthaugen@linux.ibm.com>
Mon, 6 Jun 2022 15:35:18 +0000 (10:35 -0500)
commit9ed3943385d1674bbaf3c985b2c9687d0c549405
treec8de2032f13ba690c72d0c870403a82e3ebc50f5
parent267572704689294381963457eb52ac8fa24a9b46
[RS6000] altivec style lvx/stvx addresses vs power10

gcc.target/powerpc/fold-vec-st-pixel.c and other testcases fail on
power10, generating
addi 9,5,12
rldicr 9,9,0,59
stxv 34,0(9)
rather than
addi 5,5,12
stvx 2,0,5
for an altivec lvx/stvx style address.

The problem starts with fwprop creating
(insn 9 4 0 2 (set (mem:V8HI (and:DI (plus:DI (reg/v/f:DI 121 [ vpp ])
                    (const_int 12 [0xc]))
                (const_int -16 [0xfffffffffffffff0])) [0 MEM <vector(8) short int> [(void *)_4 & -16B]+0 S16 A128])
        (reg/v:V8HI 120 [ vp1 ])) "pixel.c":6:10 1237 {vsx_movv8hi_64bit}
which is finally thrown out as invalid by lra.  lra of course does that
by reloading the entire address.

fwprop creates the invalid address due to rs6000_legitimate_address_p
trimming off the outer AND of altivec style addresses before applying
other predicates.  address_is_prefixed then allows the inner address.

Now at the time the AND stripping was added (git commit 850e8d3d56d),
rs6000_legitimate_address looked a lot simpler.  This patch allows
through just those addresses that were legitimate in those simpler
days.

* config/rs6000/rs6000.c (rs6000_legitimate_address_p): Limit
AND addressing to just lvx/stvx style addresses.

(cherry picked from commit d0e2ffcca0ef6d526de8d221ba41567526b4cb40)
gcc/config/rs6000/rs6000.c