This patch incorporates large offsets for -mcpu=future when we optimization a vector extract from memory and the memory address previously had been a prefixed address with a large offset.
The current code would generate loading up the constant into a temporary and then doing an indexed load. Successive passes would eventually optimize that back into the form we want (having the base register plus a large offset), but it is better to generate the optimial code sooner. I have bootstrapped this change on a little endian power8 system and there were no regressions. Can I check this into the trunk? 2019-12-20 Michael Meissner <meiss...@linux.ibm.com> * config/rs6000/rs6000.c (rs6000_adjust_vec_address): Add support for the offset being 34-bits when -mcpu=future is used. Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 279553) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -6792,9 +6792,17 @@ rs6000_adjust_vec_address (rtx scalar_re HOST_WIDE_INT offset = INTVAL (op1) + INTVAL (element_offset); rtx offset_rtx = GEN_INT (offset); - if (IN_RANGE (offset, -32768, 32767) + /* 16-bit offset. */ + if (SIGNED_INTEGER_16BIT_P (offset) && (scalar_size < 8 || (offset & 0x3) == 0)) new_addr = gen_rtx_PLUS (Pmode, op0, offset_rtx); + + /* 34-bit offset if we have prefixed addresses. */ + else if (TARGET_PREFIXED_ADDR && SIGNED_INTEGER_34BIT_P (offset)) + new_addr = gen_rtx_PLUS (Pmode, op0, offset_rtx); + + /* Offset overflowed, move offset to the temporary (which will likely + be split), and do X-FORM addressing. */ else { emit_move_insn (base_tmp, offset_rtx); @@ -6825,6 +6833,12 @@ rs6000_adjust_vec_address (rtx scalar_re emit_insn (insn); } + /* Make sure we don't overwrite the temporary if the element being + extracted is variable, and we've put the offset into base_tmp + previously. */ + else if (rtx_equal_p (base_tmp, element_offset)) + emit_insn (gen_add2_insn (base_tmp, op1)); + else { /* Make sure base_tmp is not the same as element_offset. This -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.ibm.com, phone: +1 (978) 899-4797