aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/riscv/riscv-avlprop.cc17
-rw-r--r--gcc/config/riscv/t-riscv3
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/pr112399.c31
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_switch-2.c3
4 files changed, 49 insertions, 5 deletions
diff --git a/gcc/config/riscv/riscv-avlprop.cc b/gcc/config/riscv/riscv-avlprop.cc
index 1dfaa87..1f6ba40 100644
--- a/gcc/config/riscv/riscv-avlprop.cc
+++ b/gcc/config/riscv/riscv-avlprop.cc
@@ -78,6 +78,7 @@ along with GCC; see the file COPYING3. If not see
#include "rtl-ssa.h"
#include "cfgcleanup.h"
#include "insn-attr.h"
+#include "tm-constrs.h"
using namespace rtl_ssa;
using namespace riscv_vector;
@@ -285,8 +286,20 @@ pass_avlprop::get_vlmax_ta_preferred_avl (insn_info *insn) const
if (!use_insn->can_be_optimized () || use_insn->is_asm ()
|| use_insn->is_call () || use_insn->has_volatile_refs ()
|| use_insn->has_pre_post_modify ()
- || !has_vl_op (use_insn->rtl ())
- || !tail_agnostic_p (use_insn->rtl ()))
+ || !has_vl_op (use_insn->rtl ()))
+ return NULL_RTX;
+
+ /* We should only propagate non-VLMAX AVL into VLMAX insn when
+ such insn potential tail elements (after propagation) are
+ not used. So, we should make sure the outcome of VLMAX insn
+ is not depend on. */
+ extract_insn_cached (use_insn->rtl ());
+ int merge_op_idx = get_attr_merge_op_idx (use_insn->rtl ());
+ if (merge_op_idx != INVALID_ATTRIBUTE
+ && !satisfies_constraint_vu (recog_data.operand[merge_op_idx])
+ && refers_to_regno_p (set->regno (),
+ recog_data.operand[merge_op_idx])
+ && !tail_agnostic_p (use_insn->rtl ()))
return NULL_RTX;
int new_sew = get_sew (use_insn->rtl ());
diff --git a/gcc/config/riscv/t-riscv b/gcc/config/riscv/t-riscv
index f8ca3f4..95becfc 100644
--- a/gcc/config/riscv/t-riscv
+++ b/gcc/config/riscv/t-riscv
@@ -80,7 +80,8 @@ riscv-vector-costs.o: $(srcdir)/config/riscv/riscv-vector-costs.cc \
riscv-avlprop.o: $(srcdir)/config/riscv/riscv-avlprop.cc \
$(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(REGS_H) \
- $(TARGET_H) tree-pass.h df.h rtl-ssa.h cfgcleanup.h insn-attr.h
+ $(TARGET_H) tree-pass.h df.h rtl-ssa.h cfgcleanup.h insn-attr.h \
+ tm-constrs.h
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
$(srcdir)/config/riscv/riscv-avlprop.cc
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr112399.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr112399.c
new file mode 100644
index 0000000..948e12b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr112399.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -fno-vect-cost-model -ffast-math -fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+
+/*
+** foo:
+** ...
+** vsetvli\s*[a-x0-9]+,\s*[a-x0-9]+,\s*e64,\s*m1,\s*tu,\s*m[au]
+** slli\s*[a-x0-9]+,\s*[a-x0-9]+,\s*3
+** vle64\.v\s*v[0-9]+,\s*0\([a-x0-9]+\)
+** vle64\.v\s*v[0-9]+,\s*0\([a-x0-9]+\)
+** vfmul\.vv\s*v[0-9]+,\s*v[0-9]+,\s*v[0-9]+
+** vle64\.v\s*\s*v[0-9]+,\s*0\([a-x0-9]+\)
+** vfmacc\.vv\s*\s*v[0-9]+,\s*v[0-9]+,\s*v[0-9]+
+** add\s*[a-x0-9]+,\s*[a-x0-9]+,\s*[a-x0-9]+
+** add\s*[a-x0-9]+,\s*[a-x0-9]+,\s*[a-x0-9]+
+** add\s*[a-x0-9]+,\s*[a-x0-9]+,\s*[a-x0-9]+
+** sub\s*[a-x0-9]+,\s*[a-x0-9]+,\s*[a-x0-9]+
+** ...
+*/
+
+double
+foo (double *__restrict a, double *__restrict b, double *__restrict c, int n)
+{
+ double result = 0;
+ for (int i = 0; i < n; i++)
+ result += a[i] * b[i] * c[i];
+ return result;
+}
+
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_switch-2.c b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_switch-2.c
index 2e58f08..c55faa5 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_switch-2.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_switch-2.c
@@ -23,6 +23,5 @@ void f (void * restrict in, void * restrict out, void * restrict mask_in, int n)
/* { dg-final { scan-assembler-times {vsetivli\s+zero,\s*19,\s*e32,\s*mf2,\s*t[au],\s*m[au]} 2 { target { no-opts "-O0" no-opts "-g" no-opts "-funroll-loops" } } } } */
/* { dg-final { scan-assembler-times {vsetivli\s+zero,\s*19,\s*e16,\s*mf2,\s*t[au],\s*m[au]} 1 { target { no-opts "-O0" no-opts "-g" no-opts "-funroll-loops" } } } } */
/* { dg-final { scan-assembler-times {vsetvli\s+[a-x0-9]+,\s*zero,\s*e32,\s*mf2,\s*t[au],\s*m[au]} 1 { target { no-opts "-O0" no-opts "-g" no-opts "-funroll-loops" } } } } */
-/* { dg-final { scan-assembler-times {vsetvli\s+[a-x0-9]+,\s*zero,\s*e8,\s*mf8,\s*t[au],\s*m[au]} 1 { target { no-opts "-O0" no-opts "-g" no-opts "-funroll-loops" } } } } */
-/* { dg-final { scan-assembler-times {vsetvli} 2 { target { no-opts "-O0" no-opts "-g" no-opts "-funroll-loops" } } } } */
+/* { dg-final { scan-assembler-times {vsetvli} 1 { target { no-opts "-O0" no-opts "-g" no-opts "-funroll-loops" } } } } */
/* { dg-final { scan-assembler-times {vsetivli} 4 { target { no-opts "-O0" no-opts "-g" no-opts "-funroll-loops" } } } } */