I had to make one more change to make this actually work. In rs6000_force_indexed_or_indirect_mem() it was necessary to return the updated rtx.
Bootstrap/regtest passes on ppc64le (power7, power9), ok for trunk? Thanks! Aaron 2018-10-30 Aaron Sawdey <acsaw...@linux.ibm.com> * config/rs6000/rs6000.md (bswapdi2): Force address into register if not in indexed or indirect form. (bswapdi2_load): Change predicate to indexed_or_indirect_operand. (bswapdi2_store): Ditto. * config/rs6000/rs6000.c (rs6000_force_indexed_or_indirect_mem): New helper function. * config/rs6000/rs6000-protos.h (rs6000_force_indexed_or_indirect_mem): Prototype for helper function. Index: gcc/config/rs6000/rs6000-protos.h =================================================================== --- gcc/config/rs6000/rs6000-protos.h (revision 265588) +++ gcc/config/rs6000/rs6000-protos.h (working copy) @@ -47,6 +47,7 @@ extern bool legitimate_indirect_address_p (rtx, int); extern bool legitimate_indexed_address_p (rtx, int); extern bool avoiding_indexed_address_p (machine_mode); +extern rtx rs6000_force_indexed_or_indirect_mem (rtx x); extern rtx rs6000_got_register (rtx); extern rtx find_addr_reg (rtx); Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 265588) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -8423,7 +8423,23 @@ return false; } +/* Helper function for making sure we will make full + use of indexed addressing. */ +rtx +rs6000_force_indexed_or_indirect_mem (rtx x) +{ + machine_mode m = GET_MODE (x); + if (!indexed_or_indirect_operand (x, m)) + { + rtx addr = XEXP (x, 0); + addr = force_reg (Pmode, addr); + x = replace_equiv_address_nv (x, addr); + } + return x; +} + + /* Implement the TARGET_LEGITIMATE_COMBINED_INSN hook. */ static bool Index: gcc/config/rs6000/rs6000.md =================================================================== --- gcc/config/rs6000/rs6000.md (revision 265588) +++ gcc/config/rs6000/rs6000.md (working copy) @@ -2512,9 +2512,15 @@ if (TARGET_POWERPC64 && TARGET_LDBRX) { if (MEM_P (src)) - emit_insn (gen_bswapdi2_load (dest, src)); + { + src = rs6000_force_indexed_or_indirect_mem (src); + emit_insn (gen_bswapdi2_load (dest, src)); + } else if (MEM_P (dest)) - emit_insn (gen_bswapdi2_store (dest, src)); + { + dest = rs6000_force_indexed_or_indirect_mem (dest); + emit_insn (gen_bswapdi2_store (dest, src)); + } else if (TARGET_P9_VECTOR) emit_insn (gen_bswapdi2_xxbrd (dest, src)); else @@ -2535,13 +2541,13 @@ ;; Power7/cell has ldbrx/stdbrx, so use it directly (define_insn "bswapdi2_load" [(set (match_operand:DI 0 "gpc_reg_operand" "=r") - (bswap:DI (match_operand:DI 1 "memory_operand" "Z")))] + (bswap:DI (match_operand:DI 1 "indexed_or_indirect_operand" "Z")))] "TARGET_POWERPC64 && TARGET_LDBRX" "ldbrx %0,%y1" [(set_attr "type" "load")]) (define_insn "bswapdi2_store" - [(set (match_operand:DI 0 "memory_operand" "=Z") + [(set (match_operand:DI 0 "indexed_or_indirect_operand" "=Z") (bswap:DI (match_operand:DI 1 "gpc_reg_operand" "r")))] "TARGET_POWERPC64 && TARGET_LDBRX" "stdbrx %1,%y0" -- Aaron Sawdey, Ph.D. acsaw...@linux.vnet.ibm.com 050-2/C113 (507) 253-7520 home: 507/263-0782 IBM Linux Technology Center - PPC Toolchain