[Committed] RISC-V: Fix VSETVL PASS fusion bug
Checks
Commit Message
There is an obvious fusion bug that is exposed by more VLS patterns support.
After more VLS modes support, it cause following FAILs:
FAIL: gcc.target/riscv/rvv/autovec/reduc/reduc_run-2.c execution test
FAIL: gcc.target/riscv/rvv/autovec/reduc/reduc_run-2.c execution test
FAIL: gcc.target/riscv/rvv/autovec/reduc/reduc_run-2.c execution test
FAIL: gcc.target/riscv/rvv/autovec/reduc/reduc_run-2.c execution test
Demand 1: SEW = 64, LMUL = 1, RATIO = 64, demand SEW, demand GE_SEW.
Demand 2: SEW = 64, LMUL = 2, RATIO = 32, demand SEW, demand GE_SEW, demand RATIO.
Before this patch:
merge demand: SEW = 64, LMUL = 1, RATIO = 32, demand SEW, demand LMUL, demand GE_SEW.
It's obvious incorrect of merge LMUL which should be new LMUL = (demand 2 RATIO * greatest SEW) = M2
gcc/ChangeLog:
* config/riscv/riscv-vsetvl.cc (vlmul_for_greatest_sew_second_ratio): New function.
* config/riscv/riscv-vsetvl.def (DEF_SEW_LMUL_FUSE_RULE): Fix bug.
---
gcc/config/riscv/riscv-vsetvl.cc | 8 ++++++++
gcc/config/riscv/riscv-vsetvl.def | 4 ++--
2 files changed, 10 insertions(+), 2 deletions(-)
@@ -1308,6 +1308,14 @@ vlmul_for_first_sew_second_ratio (const vector_insn_info &info1,
return calculate_vlmul (info1.get_sew (), info2.get_ratio ());
}
+static vlmul_type
+vlmul_for_greatest_sew_second_ratio (const vector_insn_info &info1,
+ const vector_insn_info &info2)
+{
+ return calculate_vlmul (MAX (info1.get_sew (), info2.get_sew ()),
+ info2.get_ratio ());
+}
+
static unsigned
ratio_for_second_sew_first_vlmul (const vector_insn_info &info1,
const vector_insn_info &info2)
@@ -329,8 +329,8 @@ DEF_SEW_LMUL_FUSE_RULE (/*SEW*/ DEMAND_TRUE, /*LMUL*/ DEMAND_FALSE,
/*NEW_DEMAND_SEW*/ true,
/*NEW_DEMAND_LMUL*/ false,
/*NEW_DEMAND_RATIO*/ true,
- /*NEW_DEMAND_GE_SEW*/ true, greatest_sew, first_vlmul,
- second_ratio)
+ /*NEW_DEMAND_GE_SEW*/ true, greatest_sew,
+ vlmul_for_greatest_sew_second_ratio, second_ratio)
DEF_SEW_LMUL_FUSE_RULE (/*SEW*/ DEMAND_TRUE, /*LMUL*/ DEMAND_FALSE,
/*RATIO*/ DEMAND_ANY, /*GE_SEW*/ DEMAND_TRUE,
/*SEW*/ DEMAND_FALSE, /*LMUL*/ DEMAND_TRUE,