https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112447

--- Comment #11 from Vineet Gupta <vineetg at gcc dot gnu.org> ---
As a hack I commented out set_delete() to see what the extraneous vsetvli
would have been.

```
  .L36:
       # bb 3: start of outer loop: off 0

        vsetvli zero,zero,e8,mf2,ta,ma     # insn 2915
        vse8.v  v1,0(t3)                   # insn 2874, bb 3
        vse8.v  v1,0(t6)
        vse8.v  v1,0(s0)
  ...

        # bb 181

        addi    a4,a4,1
        li      a7,15
        bne     a4,a7,.L36                 # insn 1082

       # bb 182: start of outer loop: off 1

        vsetvli zero,zero,e32,mf2,ta,ma    # insn 2919
        vmv.x.s a3,v1                      # insn 1858
        vsetvli zero,zero,e16,mf2,ta,ma
        sw      a3,8(sp)
        vmv.x.s a3,v1
```

Essentially phase 2 is fusing vsetvl info for insn 2874 and insn 1858
But the fused info doesn't seem right. 

        vsetvli zero,zero,e32,m2,ta,ma
        j       .L36

Manually modifying it to orig value fixes the test.

        vsetvli zero,zero,e8,mf2,ta,ma
        j       .L36

Phase 2 logs

```
  Try lift up 1.

      earliest:
        Edge(bb 0 -> bb 2): n_bits = 13, set = {0 }
        Edge(bb 62 -> bb 63): n_bits = 13, set = {4 }
        Edge(bb 180 -> bb 181): n_bits = 13, set = {8 }
        Edge(bb 181 -> bb 3): n_bits = 13, set = {2 }

    Fuse curr info since prev info compatible with it:
      prev_info: VALID (insn 1858, bb 181)       <-- due to Edge(bb 181 -> bb
3)
        Demand fields: demand_sew_only
        SEW=32, VLMUL=mf2, RATIO=64, MAX_SEW=64
        TAIL_POLICY=agnostic, MASK_POLICY=agnostic
        AVL=(nil)
        VL=(nil)
      curr_info: VALID (insn 2874, bb 3)
        Demand fields: demand_ratio_only demand_avl
        SEW=8, VLMUL=mf2, RATIO=16, MAX_SEW=64
        TAIL_POLICY=agnostic, MASK_POLICY=agnostic
        AVL=(const_int 8 [0x8])
        VL=(nil)

      prev_info after fused: VALID (insn 1858, bb 181)
        Demand fields: demand_sew_lmul demand_avl
        SEW=32, VLMUL=m2, RATIO=16, MAX_SEW=64
        TAIL_POLICY=agnostic, MASK_POLICY=agnostic
        AVL=(const_int 8 [0x8])
        VL=(nil)
```

This fuse in turn is happening from 

DEF_SEW_LMUL_RULE (sew_only, ratio_only, sew_lmul,
                   next_ratio_valid_for_prev_sew_p, always_false,
                   modify_lmul_with_next_ratio)

I'm not really sure if the merge callback here is correct.

Reply via email to