Hi All,

Previously I allowed 0s unconditionally through aarch64_can_const_movi_rtx_p
because we should always be able to use movi with 0 regardless of the mode.

However this was causing issues when a vector contained a 0 element and
another value which was too complex for a movi. In theory this should have
worked but it's failing an integrity check because of the type of the 0 element
being a none floating type.

Moving the exception to only allow floating point 0s restores the previous
behavior of the compiler.

Ok for trunk?

Bootstrapped and regtested on aach64-none-linux-gnu and no issues.

Thanks,
Tamar


gcc/
2017-08-01  Tamar Christina  <tamar.christ...@arm.com>

        * config/aarch64/aarch64.c
        (aarch64_can_const_movi_rtx_p): Move 0 check.

-- 
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 055ebafb8305412e192c77e4177d08c914d5ccee..5a2ad7e9156a6f0389c09470cf1414bff45d8099 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -4787,10 +4787,6 @@ aarch64_can_const_movi_rtx_p (rtx x, machine_mode mode)
   if (!TARGET_SIMD)
      return false;
 
-  /* We make a general exception for 0.  */
-  if (aarch64_float_const_zero_rtx_p (x))
-      return true;
-
   machine_mode vmode, imode;
   unsigned HOST_WIDE_INT ival;
 
@@ -4800,6 +4796,10 @@ aarch64_can_const_movi_rtx_p (rtx x, machine_mode mode)
       if (!aarch64_reinterpret_float_as_int (x, &ival))
 	return false;
 
+      /* We make a general exception for 0.  */
+      if (aarch64_float_const_zero_rtx_p (x))
+	return true;
+
       imode = int_mode_for_mode (mode);
     }
   else if (GET_CODE (x) == CONST_INT

Reply via email to