This patch addresses an ICE for a missing instruction when targeting power6. The issue is that we shouldn't generate x-form load rtx if TARGET_AVOID_XFORM is true because it won't end up being matched. More generally, on big endian we do not need to use ldbrx et. al. which are index loads, but can just use ld and other normal d-form loads. So this is going to generate better code for BE in general which is why I have changed it to do this for big endian or TARGET_AVOID_XFORM.
Bootstrap/regtest passes on ppc32 and ppc64 (power 6/7/8), ok for trunk? Thanks! Aaron 2018-11-02 Aaron Sawdey <acsaw...@linux.ibm.com> * config/rs6000/rs6000-string.c (expand_strncmp_gpr_sequence): Pay attention to TARGET_AVOID_XFORM. Index: gcc/config/rs6000/rs6000-string.c =================================================================== --- gcc/config/rs6000/rs6000-string.c (revision 265733) +++ gcc/config/rs6000/rs6000-string.c (working copy) @@ -1798,12 +1798,18 @@ rid of the extra bytes. */ cmp_bytes = bytes_to_compare; - rtx offset_reg = gen_reg_rtx (Pmode); - emit_move_insn (offset_reg, GEN_INT (offset)); - - rtx addr1 = gen_rtx_PLUS (Pmode, src1_addr, offset_reg); + rtx offset_rtx; + if (BYTES_BIG_ENDIAN || TARGET_AVOID_XFORM) + offset_rtx = GEN_INT (offset); + else + { + offset_rtx = gen_reg_rtx (Pmode); + emit_move_insn (offset_rtx, GEN_INT (offset)); + } + rtx addr1 = gen_rtx_PLUS (Pmode, src1_addr, offset_rtx); + rtx addr2 = gen_rtx_PLUS (Pmode, src2_addr, offset_rtx); + do_load_for_compare_from_addr (load_mode, tmp_reg_src1, addr1, orig_src1); - rtx addr2 = gen_rtx_PLUS (Pmode, src2_addr, offset_reg); do_load_for_compare_from_addr (load_mode, tmp_reg_src2, addr2, orig_src2); /* We must always left-align the data we read, and -- 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