https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118945
--- Comment #1 from Vineet Gupta <vineetg at gcc dot gnu.org> --- Looking at the VSETVL dumps: Splitting with gen_split_2313 (vector.md:1777) scanning new insn with uid = 70. # New VSETVL for vector load deleting insn with uid = 16. # orig VSETVL for vector load deleted ... Entering Lazy VSETVL PASS scanning new insn with uid = 71. ... Phase 1: Fuse local vsetvl infos. Try fuse basic block 4 Ignore curr info since prev info available with it: prev_info: VALID (insn 70, bb 4) Demand fields: demand_ratio_only demand_avl SEW=8, VLMUL=mf2, RATIO=16, MAX_SEW=64 TAIL_POLICY=agnostic, MASK_POLICY=agnostic AVL=(reg:DI 11 a1 [orig:138 ivtmp_27 ] [138]) VL=(reg:DI 15 a5 [orig:139 _29 ] [139]) use_by_non_rvv_insn=true curr_info: VALID (insn 17, bb 4) Demand fields: demand_ratio_only demand_avl SEW=32, VLMUL=m2, RATIO=16, MAX_SEW=64 TAIL_POLICY=agnostic, MASK_POLICY=agnostic AVL=(reg:DI 15 a5 [orig:139 _29 ] [139]) VL=(nil) Fuse curr info since prev info compatible with it: prev_info: VALID (insn 70, bb 4) Demand fields: demand_ratio_only demand_avl SEW=8, VLMUL=mf2, RATIO=16, MAX_SEW=64 TAIL_POLICY=agnostic, MASK_POLICY=agnostic AVL=(reg:DI 11 a1 [orig:138 ivtmp_27 ] [138]) VL=(reg:DI 15 a5 [orig:139 _29 ] [139]) use_by_non_rvv_insn=true curr_info: VALID (insn 18, bb 4) Demand fields: demand_sew_lmul demand_tail_policy_only demand_avl SEW=32, VLMUL=m2, RATIO=16, MAX_SEW=64 TAIL_POLICY=undisturbed, MASK_POLICY=agnostic AVL=(reg:DI 15 a5 [orig:139 _29 ] [139]) VL=(nil) prev_info after fused: VALID (insn 70, bb 4) Demand fields: demand_sew_lmul demand_tail_policy_only demand_avl SEW=32, VLMUL=m2, RATIO=16, MAX_SEW=64 TAIL_POLICY=undisturbed, MASK_POLICY=agnostic AVL=(reg:DI 11 a1 [orig:138 ivtmp_27 ] [138]) VL=(reg:DI 15 a5 [orig:139 _29 insn 70 and insn 18 are what we need to prevent from fusing/merging. They do have different m_ta={true, false}. However compatible_p() returns true because of demand tail policy being different: insn 70 m_ta = true, m_ma = true, m_sew_lmul_demand = sew_lmul_demand_type::ratio_only, m_policy_demand = policy_demand_type::ignore_policy, ^^^^^^^^^^^^^^^^^^ insn 18 m_ta = false, m_ma = true, m_sew_lmul_demand = sew_lmul_demand_type::sew_lmul, m_policy_demand = policy_demand_type::tail_policy_only ^^^^^^^^^^^^^^^^^^ insn 70 is the new VSETVL which is generated off the no side effect splitter ad policy demand is just initialized to 0 (ignore_policy)