The existing code allows only 4 vectors worth of ieee128 homogeneous aggregates, but it should be 8. This happens because at one spot it is mistakenly qualified as being passed in floating point registers.
This patch fixes it and makes the code easier to read. Committing to trunk; needs backports too. Segher 2018-06-19 Segher Boessenkool <seg...@kernel.crashing.org> * config/rs6000/rs6000.md (rs6000_discover_homogeneous_aggregate): An ieee128 argument takes up only one (vector) register, not two (floating point) registers. --- gcc/config/rs6000/rs6000.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 307c88e..78f6ffe 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -10867,12 +10867,12 @@ rs6000_discover_homogeneous_aggregate (machine_mode mode, const_tree type, if (field_count > 0) { - int n_regs = (SCALAR_FLOAT_MODE_P (field_mode) ? - (GET_MODE_SIZE (field_mode) + 7) >> 3 : 1); + int reg_size = ALTIVEC_OR_VSX_VECTOR_MODE (field_mode) ? 16 : 8; + int field_size = ROUND_UP (GET_MODE_SIZE (field_mode), reg_size); /* The ELFv2 ABI allows homogeneous aggregates to occupy up to AGGR_ARG_NUM_REG registers. */ - if (field_count * n_regs <= AGGR_ARG_NUM_REG) + if (field_count * field_size <= AGGR_ARG_NUM_REG * reg_size) { if (elt_mode) *elt_mode = field_mode; -- 1.8.3.1