aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>2023-08-31 20:23:44 +0800
committerPan Li <pan2.li@intel.com>2023-08-31 20:42:17 +0800
commit4da3065a6422062b029df9660a226297802455f4 (patch)
tree72e0e25fca9294bba0908d759b2d40ee40fb0df2 /gcc
parent9ea1248604d7b65009af32103814332f35bd33e2 (diff)
downloadgcc-4da3065a6422062b029df9660a226297802455f4.zip
gcc-4da3065a6422062b029df9660a226297802455f4.tar.gz
gcc-4da3065a6422062b029df9660a226297802455f4.tar.bz2
RISC-V: Add Vector cost model framework for RVV
Hi, currently RVV vectorization only support picking LMUL according to compile option --param=riscv-autovec-lmul= which is no ideal. Compiler should be able to pick optimal LMUL/vectorization factor to vectorize the loop according to the loop_vec_info and SSA-based register pressure analysis. Now, I figure out current GCC cost model provide the approach that we can choose LMUL/vectorization factor by adjusting the COST. This patch is just add the minimum COST model framework which is still applying the default cost model (No vector codes changed from before). Regression all pased and no difference. gcc/ChangeLog: * config.gcc: Add vector cost model framework for RVV. * config/riscv/riscv.cc (riscv_vectorize_create_costs): Ditto. (TARGET_VECTORIZE_CREATE_COSTS): Ditto. * config/riscv/t-riscv: Ditto. * config/riscv/riscv-vector-costs.cc: New file. * config/riscv/riscv-vector-costs.h: New file.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config.gcc2
-rw-r--r--gcc/config/riscv/riscv-vector-costs.cc66
-rw-r--r--gcc/config/riscv/riscv-vector-costs.h44
-rw-r--r--gcc/config/riscv/riscv.cc15
-rw-r--r--gcc/config/riscv/t-riscv8
5 files changed, 134 insertions, 1 deletions
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 415e0e1..0ba1a7f 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -530,7 +530,7 @@ pru-*-*)
;;
riscv*)
cpu_type=riscv
- extra_objs="riscv-builtins.o riscv-c.o riscv-sr.o riscv-shorten-memrefs.o riscv-selftests.o riscv-v.o riscv-vsetvl.o"
+ extra_objs="riscv-builtins.o riscv-c.o riscv-sr.o riscv-shorten-memrefs.o riscv-selftests.o riscv-v.o riscv-vsetvl.o riscv-vector-costs.o"
extra_objs="${extra_objs} riscv-vector-builtins.o riscv-vector-builtins-shapes.o riscv-vector-builtins-bases.o"
extra_objs="${extra_objs} thead.o"
d_target_objs="riscv-d.o"
diff --git a/gcc/config/riscv/riscv-vector-costs.cc b/gcc/config/riscv/riscv-vector-costs.cc
new file mode 100644
index 0000000..1a5e13d
--- /dev/null
+++ b/gcc/config/riscv/riscv-vector-costs.cc
@@ -0,0 +1,66 @@
+/* Cost model implementation for RISC-V 'V' Extension for GNU compiler.
+ Copyright (C) 2023-2023 Free Software Foundation, Inc.
+ Contributed by Juzhe Zhong (juzhe.zhong@rivai.ai), RiVAI Technologies Ltd.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+#define IN_TARGET_CODE 1
+
+#define INCLUDE_STRING
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "target.h"
+#include "function.h"
+#include "tree.h"
+#include "basic-block.h"
+#include "rtl.h"
+#include "gimple.h"
+#include "targhooks.h"
+#include "cfgloop.h"
+#include "fold-const.h"
+#include "tm_p.h"
+#include "tree-vectorizer.h"
+
+/* This file should be included last. */
+#include "riscv-vector-costs.h"
+
+namespace riscv_vector {
+
+costs::costs (vec_info *vinfo, bool costing_for_scalar)
+ : vector_costs (vinfo, costing_for_scalar)
+{}
+
+unsigned
+costs::add_stmt_cost (int count, vect_cost_for_stmt kind,
+ stmt_vec_info stmt_info, slp_tree, tree vectype,
+ int misalign, vect_cost_model_location where)
+{
+ /* TODO: Use default STMT cost model.
+ We will support more accurate STMT cost model later. */
+ int stmt_cost = default_builtin_vectorization_cost (kind, vectype, misalign);
+ return record_stmt_cost (stmt_info, where, count * stmt_cost);
+}
+
+void
+costs::finish_cost (const vector_costs *scalar_costs)
+{
+ vector_costs::finish_cost (scalar_costs);
+}
+
+} // namespace riscv_vector
diff --git a/gcc/config/riscv/riscv-vector-costs.h b/gcc/config/riscv/riscv-vector-costs.h
new file mode 100644
index 0000000..57b1be0
--- /dev/null
+++ b/gcc/config/riscv/riscv-vector-costs.h
@@ -0,0 +1,44 @@
+/* Cost model declaration of RISC-V 'V' Extension for GNU compiler.
+ Copyright (C) 2023-2023 Free Software Foundation, Inc.
+ Contributed by Juzhe Zhong (juzhe.zhong@rivai.ai), RiVAI Technologies Ltd.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef GCC_RISCV_VECTOR_COST_H
+#define GCC_RISCV_VECTOR_COST_H
+
+namespace riscv_vector {
+
+/* rvv-specific vector costs. */
+class costs : public vector_costs
+{
+ using vector_costs::vector_costs;
+
+public:
+ costs (vec_info *, bool);
+
+private:
+ unsigned int add_stmt_cost (int count, vect_cost_for_stmt kind,
+ stmt_vec_info stmt_info, slp_tree node,
+ tree vectype, int misalign,
+ vect_cost_model_location where) override;
+ void finish_cost (const vector_costs *) override;
+};
+
+} // namespace riscv_vector
+
+#endif // GCC_RISCV_VECTOR_COST_H
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 8bca807..8d8f7b4 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -74,6 +74,7 @@ along with GCC; see the file COPYING3. If not see
/* This file should be included last. */
#include "target-def.h"
+#include "riscv-vector-costs.h"
/* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF. */
#define UNSPEC_ADDRESS_P(X) \
@@ -9058,6 +9059,17 @@ riscv_frame_pointer_required (void)
return riscv_save_frame_pointer && !crtl->is_leaf;
}
+/* Implement targetm.vectorize.create_costs. */
+
+static vector_costs *
+riscv_vectorize_create_costs (vec_info *vinfo, bool costing_for_scalar)
+{
+ if (TARGET_VECTOR)
+ return new riscv_vector::costs (vinfo, costing_for_scalar);
+ /* Default vector costs. */
+ return new vector_costs (vinfo, costing_for_scalar);
+}
+
/* Initialize the GCC target structure. */
#undef TARGET_ASM_ALIGNED_HI_OP
#define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
@@ -9365,6 +9377,9 @@ riscv_frame_pointer_required (void)
#undef TARGET_FRAME_POINTER_REQUIRED
#define TARGET_FRAME_POINTER_REQUIRED riscv_frame_pointer_required
+#undef TARGET_VECTORIZE_CREATE_COSTS
+#define TARGET_VECTORIZE_CREATE_COSTS riscv_vectorize_create_costs
+
struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-riscv.h"
diff --git a/gcc/config/riscv/t-riscv b/gcc/config/riscv/t-riscv
index f3ce66c..b1f80d1 100644
--- a/gcc/config/riscv/t-riscv
+++ b/gcc/config/riscv/t-riscv
@@ -67,6 +67,14 @@ riscv-vsetvl.o: $(srcdir)/config/riscv/riscv-vsetvl.cc \
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
$(srcdir)/config/riscv/riscv-vsetvl.cc
+riscv-vector-costs.o: $(srcdir)/config/riscv/riscv-vector-costs.cc \
+ $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TARGET_H) $(FUNCTION_H) \
+ $(TREE_H) basic-block.h $(RTL_H) gimple.h targhooks.h cfgloop.h \
+ fold-const.h $(TM_P_H) tree-vectorizer.h \
+ $(srcdir)/config/riscv/riscv-vector-costs.h
+ $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ $(srcdir)/config/riscv/riscv-vector-costs.cc
+
riscv-d.o: $(srcdir)/config/riscv/riscv-d.cc \
$(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H)
$(COMPILE) $<