https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112447
Bug ID: 112447
Summary: risc-v regression: FAIL:
gcc.c-torture/execute/memset-3.c -O3
Product: gcc
Version: 13.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: vineetg at gcc dot gnu.org
Reporter: vineetg at gcc dot gnu.org
CC: jeffreyalaw at gmail dot com, juzhe.zhong at rivai dot ai,
lehua.ding at rivai dot ai, rdapp at gcc dot gnu.org
Target Milestone: ---
As reported in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111311#c8
we have following execute failures on trunk.
=== gcc: Unexpected fails for rv64gcv lp64d medlow ===
FAIL: gcc.c-torture/execute/memset-3.c -O3 -g execution test
The issue is an extraneous VSETVLI instruction (with wrong SEW) being generated
which creates wrong fill pattern for memset.
```
main:
[...]
.L36: ; 2. loop start for @off 0
vse8.v v1,0(t3)
vse8.v v1,0(t6)
vse8.v v1,0(s1)
vse8.v v3,0(a5)
...
; loop epilogue
li a7,15
beq a4,a7,.L171
vsetvli zero,zero,e32,m2,ta,ma <--- wrong
j .L36
```
vsetvli pass dumps:
```
Phase 3: Reduce global vsetvl infos.
Compute LCM insert and delete data:
Expr[2]: VALID (insn 2847, bb 3)
Demand fields: demand_sew_lmul demand_avl
SEW=8, VLMUL=mf2, RATIO=16, MAX_SEW=64
TAIL_POLICY=agnostic, MASK_POLICY=agnostic
AVL=(const_int 8 [0x8])
VL=(nil)
VSETVL infos after phase 3
bb 3:
probability: always (guessed)
Header vsetvl info:VALID (insn 2847, bb 3) (deleted) <---
Demand fields: demand_sew_lmul demand_avl
SEW=8, VLMUL=mf2, RATIO=16, MAX_SEW=64
TAIL_POLICY=agnostic, MASK_POLICY=agnostic
AVL=(const_int 8 [0x8])
VL=(nil)
```
So it seems LCM is deleting the valid VSETVLI insn which later causes Phase 4
to insert a different/incorrect one.
I revert the following commit and the issue goes away.
2023-10-18 f0e28d8c1371 RISC-V: Fix failed hoist in LICM of vmv.v.x
instruction
This at least tells us the cause of issue, next step is to fix the issue.