https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70319
--- Comment #8 from Eric Botcazou <ebotcazou at gcc dot gnu.org> --- > Comment #1 was incorrect about the problem starting in r233398. It was my > bswap pattern addition in r233414 that introduced the problem. On the other > hand, I looked at the bswapdi operation in gdb and it seems correct. The problem in .final is: (insn 21 20 22 (set (reg:DI 19 %r19 [orig:97 B1 ] [97]) (mem/c:DI (plus:DI (reg/f:DI 30 %r30) (const_int -128 [0xffffffffffffff80])) [1 B1+0 S8 A128])) q2.c:51 128 {*pa.md:4152} (expr_list:REG_EQUIV (mem/c:DI (plus:DI (reg/f:DI 30 %r30) (const_int -128 [0xffffffffffffff80])) [1 B1+0 S8 A128]) (nil))) (insn 22 21 23 (set (reg:DI 28 %r28 [96]) (bswap:DI (reg:DI 19 %r19 [orig:97 B1 ] [97]))) q2.c:51 47 {bswapdi2} (nil)) [...] (insn 35 33 36 (set (reg:DI 28 %r28 [105]) (bswap:DI (reg:DI 19 %r19 [orig:106 B1 ] [106]))) q2.c:51 47 {bswapdi2} (expr_list:REG_DEAD (reg:DI 19 %r19 [orig:106 B1 ] [106]) (nil))) Now the bswapdi2 pattern clobbers %r19.