+2020-04-16 Michael Meissner <meissner@linux.ibm.com>
+
+ PR target/94557
+ * config/rs6000/rs6000.c (rs6000_adjust_vec_address): Fix
+ regression caused by PR target/93932 backport. Mask variable
+ vector extract index so it does not go beyond the vector when
+ extracting a vector element from memory.
+
2020-04-16 Richard Biener <rguenther@suse.de>
Backport from mainline
element_offset = GEN_INT (INTVAL (element) * scalar_size);
else
{
+ /* Mask the element to make sure the element number is between 0 and the
+ maximum number of elements - 1 so that we don't generate an address
+ outside the vector. */
+ rtx num_ele_m1 = GEN_INT (GET_MODE_NUNITS (GET_MODE (mem)) - 1);
+ rtx and_op = gen_rtx_AND (Pmode, element, num_ele_m1);
+ emit_insn (gen_rtx_SET (base_tmp, and_op));
+
int byte_shift = exact_log2 (scalar_size);
gcc_assert (byte_shift >= 0);
if (byte_shift == 0)
- element_offset = element;
+ element_offset = base_tmp;
else
{
if (TARGET_POWERPC64)
- emit_insn (gen_ashldi3 (base_tmp, element, GEN_INT (byte_shift)));
+ emit_insn (gen_ashldi3 (base_tmp, base_tmp, GEN_INT (byte_shift)));
else
- emit_insn (gen_ashlsi3 (base_tmp, element, GEN_INT (byte_shift)));
+ emit_insn (gen_ashlsi3 (base_tmp, base_tmp, GEN_INT (byte_shift)));
element_offset = base_tmp;
}