https://gcc.gnu.org/g:ae88da5e070659d37b3c3daa4b880531769183bf

commit r15-4133-gae88da5e070659d37b3c3daa4b880531769183bf
Author: Prathamesh Kulkarni <prathame...@nvidia.com>
Date:   Tue Oct 8 12:38:31 2024 +0530

    Recompute TYPE_MODE and DECL_MODE for vector_type for accelerator.
    
    gcc/ChangeLog:
            PR ipa/96265
            * lto-streamer-in.cc (lto_read_tree_1): Set TYPE_MODE and DECL_MODE
            for vector_type if offloading is enabled.
            (lto_input_mode_table): Remove handling of vector modes.
            * tree-streamer-out.cc (pack_ts_decl_common_value_fields): Stream 
out
            VOIDmode for vector_type if offloading is enabled.
            (pack_ts_decl_common_value_fields): Likewise.
    
    Signed-off-by: Prathamesh Kulkarni <prathame...@nvidia.com>

Diff:
---
 gcc/lto-streamer-in.cc   | 38 ++++++++++++++++++++++++--------------
 gcc/tree-streamer-out.cc |  6 ++++--
 2 files changed, 28 insertions(+), 16 deletions(-)

diff --git a/gcc/lto-streamer-in.cc b/gcc/lto-streamer-in.cc
index 9d0ec5d589c4..15181c3f5746 100644
--- a/gcc/lto-streamer-in.cc
+++ b/gcc/lto-streamer-in.cc
@@ -1753,16 +1753,30 @@ lto_read_tree_1 (class lto_input_block *ib, class 
data_in *data_in, tree expr)
         with -g1, see for example PR113488.  */
       else if (DECL_P (expr) && DECL_ABSTRACT_ORIGIN (expr) == expr)
        DECL_ABSTRACT_ORIGIN (expr) = NULL_TREE;
+    }
 
 #ifdef ACCEL_COMPILER
-      if ((VAR_P (expr)
-          || TREE_CODE (expr) == PARM_DECL
-          || TREE_CODE (expr) == FIELD_DECL)
-         && AGGREGATE_TYPE_P (TREE_TYPE (expr))
-         && DECL_MODE (expr) == VOIDmode)
-       SET_DECL_MODE (expr, TYPE_MODE (TREE_TYPE (expr)));
-#endif
+  if ((VAR_P (expr)
+       || TREE_CODE (expr) == PARM_DECL
+       || TREE_CODE (expr) == FIELD_DECL)
+      && DECL_MODE (expr) == VOIDmode)
+    {
+      tree type = TREE_TYPE (expr);
+      if (AGGREGATE_TYPE_P (type))
+       SET_DECL_MODE (expr, TYPE_MODE (type));
+      else if (VECTOR_TYPE_P (type))
+       SET_DECL_MODE (expr, TYPE_MODE_RAW (type));
     }
+
+  if (VECTOR_TYPE_P (expr) && TYPE_MODE (expr) == VOIDmode)
+    {
+      poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (expr);
+      tree innertype = TREE_TYPE (expr);
+      machine_mode vmode
+       = mode_for_vector (SCALAR_TYPE_MODE (innertype), nunits).else_blk ();
+      SET_TYPE_MODE (expr, vmode);
+    }
+#endif
 }
 
 /* Read the physical representation of a tree node with tag TAG from
@@ -2106,13 +2120,9 @@ lto_input_mode_table (struct lto_file_decl_data 
*file_data)
            case MODE_VECTOR_UFRACT:
            case MODE_VECTOR_ACCUM:
            case MODE_VECTOR_UACCUM:
-             /* For unsupported vector modes just use BLKmode,
-                if the scalar mode is supported.  */
-             if (table[(int) inner] != VOIDmode)
-               {
-                 table[m] = BLKmode;
-                 break;
-               }
+             /* Vector modes are recomputed on accel side and shouldn't have
+                been streamed-out from host.  */
+             gcc_unreachable ();
              /* FALLTHRU */
            default:
              /* This is only used for offloading-target compilations and
diff --git a/gcc/tree-streamer-out.cc b/gcc/tree-streamer-out.cc
index 7de4447a1b53..81f5aeb30a6d 100644
--- a/gcc/tree-streamer-out.cc
+++ b/gcc/tree-streamer-out.cc
@@ -194,7 +194,8 @@ pack_ts_decl_common_value_fields (struct bitpack_d *bp, 
tree expr)
       && (VAR_P (expr)
          || TREE_CODE (expr) == PARM_DECL
          || TREE_CODE (expr) == FIELD_DECL)
-      && AGGREGATE_TYPE_P (TREE_TYPE (expr)))
+      && (AGGREGATE_TYPE_P (TREE_TYPE (expr))
+         || VECTOR_TYPE_P (TREE_TYPE (expr))))
     bp_pack_machine_mode (bp, VOIDmode);
   else
     bp_pack_machine_mode (bp, DECL_MODE (expr));
@@ -332,7 +333,8 @@ pack_ts_type_common_value_fields (struct bitpack_d *bp, 
tree expr)
      whose size is 256-bits, which is not representable on accelerator.
      Instead stream out VOIDmode, and while streaming-in, recompute
      appropriate TYPE_MODE for accelerator.  */
-  if (lto_stream_offload_p && AGGREGATE_TYPE_P (expr))
+  if (lto_stream_offload_p
+      && (AGGREGATE_TYPE_P (expr) || VECTOR_TYPE_P (expr)))
     bp_pack_machine_mode (bp, VOIDmode);
   /* for VECTOR_TYPE, TYPE_MODE reevaluates the mode using target_flags
      not necessary valid in a global context.

Reply via email to