https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91897
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- Index: gcc/expr.c =================================================================== --- gcc/expr.c (revision 276123) +++ gcc/expr.c (working copy) @@ -7232,8 +7232,9 @@ get_inner_reference (tree exp, poly_int6 /* For vector types, with the correct size of access, use the mode of inner type. */ - if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == VECTOR_TYPE - && TREE_TYPE (exp) == TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0))) + if (((TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == VECTOR_TYPE + && TREE_TYPE (exp) == TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)))) + || !INTEGRAL_TYPE_P (TREE_TYPE (exp))) && tree_int_cst_equal (size_tree, TYPE_SIZE (TREE_TYPE (exp)))) mode = TYPE_MODE (TREE_TYPE (exp)); } makes us generate .LFB0: .cfi_startproc vmovapd 32(%rsi), %ymm4 vmovapd 64(%rsi), %ymm5 vmovapd 96(%rsi), %ymm6 vmovapd (%rsi), %ymm3 vmulpd 32(%rdx), %ymm4, %ymm2 vmulpd 64(%rdx), %ymm5, %ymm1 vmulpd 96(%rdx), %ymm6, %ymm0 vmulpd (%rdx), %ymm3, %ymm3 vmovapd %ymm2, 32(%rdi) vmovapd %ymm1, 64(%rdi) vmovapd %ymm0, 96(%rdi) vmovapd %ymm3, (%rdi)