https://gcc.gnu.org/g:9c82afd42e7b5c3bdb849c66879138e59d8eb866

commit r15-5673-g9c82afd42e7b5c3bdb849c66879138e59d8eb866
Author: Robin Dapp <rd...@ventanamicro.com>
Date:   Mon Nov 25 12:40:53 2024 +0100

    RISC-V: avlprop: Do not propagate VL from slidedown.
    
    In the following situation (found in the
    rvv/autovec/vls-vlmax/shuffle-slide.c test which is not yet pushed)
    
            vsetivli        zero,4,e8,mf4,ta,ma
            vle8.v  v2,0(a1)                        # (1)
            vle8.v  v1,0(a2)                        # (2)
            vsetivli        zero,2,e8,mf4,tu,ma
            vslidedown.vi   v1,v2,2
            vsetivli        zero,4,e8,mf4,ta,ma
            vse8.v  v1,0(a2)
    
    we wrongly "propagate" VL=2 from vslidedown into the load.
    
    Although we check whether the "target" instruction has a merge operand
    the check only handles cases where the merge operand itself is
    loaded, like (2) in the snippet above.  For (1) we load the non-merged
    operand, assume propagation is valid and continue despite (2).
    
    This patch just re-uses avl_can_be_propagated_p in order to disable
    slides altogether in such situations.
    
    gcc/ChangeLog:
    
            * config/riscv/riscv-avlprop.cc 
(pass_avlprop::get_vlmax_ta_preferred_avl):
            Check whether the use insn is valid for propagation.

Diff:
---
 gcc/config/riscv/riscv-avlprop.cc | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/gcc/config/riscv/riscv-avlprop.cc 
b/gcc/config/riscv/riscv-avlprop.cc
index 91d80aa00d62..62491f9be2d4 100644
--- a/gcc/config/riscv/riscv-avlprop.cc
+++ b/gcc/config/riscv/riscv-avlprop.cc
@@ -351,7 +351,8 @@ 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 ()))
+             || !has_vl_op (use_insn->rtl ())
+             || !avl_can_be_propagated_p (use_insn->rtl ()))
            return NULL_RTX;
 
          /* We should only propagate non-VLMAX AVL into VLMAX insn when

Reply via email to