[Bug rtl-optimization/67609] [5 Regression] Generates wrong code for SSE2 _mm_load_pd

ubizjak at gmail dot com gcc-bugzilla@gcc.gnu.org
Tue Feb 2 20:39:00 GMT 2016


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

--- Comment #44 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to rsandifo@gcc.gnu.org from comment #43)
> FWIW, the proposed patch for PR69577 fixes this testcase
> with the aarch64_cannot_change_mode_class change reverted.
> The code quality looks slightly better too.

The same is true with x86_64. Following revert causes no testsuite regressions:

--cut here--
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c  (revision 233079)
+++ config/i386/i386.c  (working copy)
@@ -43283,25 +43283,12 @@ ix86_cannot_change_mode_class (machine_mode from,

   if (MAYBE_SSE_CLASS_P (regclass) || MAYBE_MMX_CLASS_P (regclass))
     {
-      int from_size = GET_MODE_SIZE (from);
-      int to_size = GET_MODE_SIZE (to);
-
       /* Vector registers do not support QI or HImode loads.  If we don't
         disallow a change to these modes, reload will assume it's ok to
         drop the subreg from (subreg:SI (reg:HI 100) 0).  This affects
         the vec_dupv4hi pattern.  */
-      if (from_size < 4)
+      if (GET_MODE_SIZE (from) < 4)
        return true;
-
-      /* Further, we cannot allow word_mode subregs of full vector modes.
-         Otherwise the middle-end will assume it's ok to store to
-         (subreg:DI (reg:TI 100) 0) in order to modify only the low 64 bits
-         of the 128-bit register.  However, after reload the subreg will
-         be dropped leaving a plain DImode store.  This is indistinguishable
-         from a "normal" DImode move, and so we're justified to use movsd,
-         which modifies the entire 128-bit register.  */
-      if (to_size == UNITS_PER_WORD && from_size > UNITS_PER_WORD)
-       return true;
     }

   return false;
--cut here--


More information about the Gcc-bugs mailing list