]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix ICE in pass_rpad.
authorliuhongt <hongtao.liu@intel.com>
Sat, 18 Sep 2021 02:49:54 +0000 (10:49 +0800)
committerliuhongt <hongtao.liu@intel.com>
Sat, 18 Sep 2021 07:52:20 +0000 (15:52 +0800)
Besides conversion instructions, pass_rpad also handles scalar
sqrt/rsqrt/rcp/round instructions, while r12-3614 should only want to
handle conversion instructions, so fix it.

gcc/ChangeLog:

* config/i386/i386-features.c (remove_partial_avx_dependency):
Restrict TARGET_USE_VECTOR_FP_CONVERTS and
TARGET_USE_VECTOR_CONVERTS to conversion instructions only.

gcc/config/i386/i386-features.c

index a525a83afd3ad4fb6dded9bb3ee035e146dce205..14f816feee0079af324c2ced65e2979729890a94 100644 (file)
@@ -2165,7 +2165,7 @@ make_pass_insert_endbr_and_patchable_area (gcc::context *ctxt)
 }
 
 /* At entry of the nearest common dominator for basic blocks with
-   conversions, generate a single
+   conversions/rcp/sqrt/rsqrt/round, generate a single
        vxorps %xmmN, %xmmN, %xmmN
    for all
        vcvtss2sd  op, %xmmN, %xmmX
@@ -2211,13 +2211,27 @@ remove_partial_avx_dependency (void)
            continue;
 
          /* Convert PARTIAL_XMM_UPDATE_TRUE insns, DF -> SF, SF -> DF,
-            SI -> SF, SI -> DF, DI -> SF, DI -> DF, to vec_dup and
-            vec_merge with subreg.  */
+            SI -> SF, SI -> DF, DI -> SF, DI -> DF, sqrt, rsqrt, rcp,
+            round, to vec_dup and vec_merge with subreg.  */
          rtx src = SET_SRC (set);
          rtx dest = SET_DEST (set);
          machine_mode dest_mode = GET_MODE (dest);
-         machine_mode src_mode = GET_MODE (XEXP (src, 0));
+         bool convert_p = false;
+         switch (GET_CODE (src))
+           {
+           case FLOAT:
+           case FLOAT_EXTEND:
+           case FLOAT_TRUNCATE:
+           case UNSIGNED_FLOAT:
+             convert_p = true;
+             break;
+           default:
+             break;
+           }
 
+         /* Only hanlde conversion here.  */
+         machine_mode src_mode
+           = convert_p ? GET_MODE (XEXP (src, 0)) : VOIDmode;
          switch (src_mode)
            {
            case E_SFmode:
@@ -2232,8 +2246,11 @@ remove_partial_avx_dependency (void)
                  || !TARGET_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY)
                continue;
              break;
-           default:
+           case E_VOIDmode:
+             gcc_assert (!convert_p);
              break;
+           default:
+             gcc_unreachable ();
            }
 
          if (!v4sf_const0)