https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98190

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So, do we need to special case MEM_REF stores that store all bits (i.e. bitpos
0 bitsize equal to mode bitsize) into non-MEM variables which are promoted?
Something like:
--- gcc/expr.c.jj       2020-12-02 11:40:47.000000000 +0100
+++ gcc/expr.c  2020-12-08 19:57:05.147004740 +0100
@@ -5451,6 +5451,14 @@ expand_assignment (tree to, tree from, b
                                               mode1, to_rtx, to, from,
                                               reversep))
            result = NULL;
+         else if (TREE_CODE (to) == MEM_REF
+                  && !REF_REVERSE_STORAGE_ORDER (to)
+                  && mem_ref_refers_to_non_mem_p (to)
+                  && SUBREG_P (to_rtx)
+                  && SUBREG_PROMOTED_VAR_P (to_rtx)
+                  && known_eq (bitpos, 0)
+                  && known_eq (bitsize, GET_MODE_BITSIZE (GET_MODE (to_rtx))))
+           result = store_expr (from, to_rtx, 0, nontemporal, false);
          else
            result = store_field (to_rtx, bitsize, bitpos,
                                  bitregion_start, bitregion_end,

Not sure if it additionally doesn't have to check same mode, or if e.g. should
wrap from into a VCE if it has significantly different type.
It will not handle reverse storage order though.

Reply via email to