> `.MASK_LEN_FOLD_LEFT_PLUS`(or `mask_len_fold_left_plus_m`) is expecting the
> return value will be the start value even if the length is 0.
>
> However current code gen in RISC-V backend is not meet that semantic, it will
> result a random garbage value if length is 0.
>
> Let example by current code gen for MASK_LEN_FOLD_LEFT_PLUS with f64:
>         # _148 = .MASK_LEN_FOLD_LEFT_PLUS (stmp__148.33_134, vect__70.32_138, 
> { -1, ... }, loop_len_161, 0);
>         vsetvli zero,a5,e64,m1,ta,ma
>         vfmv.s.f        v2,fa5     # insn 1
>         vfredosum.vs    v1,v1,v2   # insn 2
>         vfmv.f.s        fa5,v1     # insn 3
>
> insn 1:
> - vfmv.s.f won't do anything if VL=0, which means v2 will contain garbage 
> value.
> insn 2:
> - vfredosum.vs won't do anything if VL=0, and keep vd unchanged even TA.
> (v-spec say: `If vl=0, no operation is performed and the destination register
>  is not updated.`)
> insn 3:
> - vfmv.f.s will move the value from v1 even VL=0, so this is safe.
>
> So how we fix that? we need two fix for that:
>
> 1. insn 1: need always execute with VL=1, so that we can guarantee it will
>            always work as expect.
> 2. insn 2: Add new pattern to force `vd` use same reg as `vs1` (start value) 
> for
>            all reduction patterns, then we can guarantee vd[0] will contain 
> the
>            start value when vl=0
>
> For 1, it's just a simple change to riscv_vector::expand_reduction, but for 2,
> we have to add _AV variant reduction to force `vd` use same reg as `vs1` 
> (start
> value).

I think I'm OK with both approaches.  If the second one doesn't negatively
affect register pressure it certainly looks a bit nicer.  On the other hand I
would expect the reduction to dominate latency anyway so an additional vsetvl
shouldn't really matter.

Another thing to consider - can we even hit the vl=0 case with the regular
reductions?  They are VLMAX only so just affected by when we enable SELECT_VL
which we only do with one rgroup so vl=0 shouldn't happen (as opposed to
fold left).  I still need to convince myself that this is correct but the fact
that you only saw fallout with fold left partially confirms it.

Reply via email to