On Sun, Jan 16, 2022 at 12:44 AM Uros Bizjak via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > On Sat, Jan 15, 2022 at 5:39 PM Hongyu Wang <wwwhhhyyy...@gmail.com> wrote: > > > > Thanks for the suggestion, here is the updated patch that survived > > bootstrap/regtest. > > LGTM for me, but please get the final approval from Hongtao. > Ok, thanks. > Thanks, > Uros. > > > > Please note reg_mentioned_p in the above condition. This function > > > returns nonzero if register op0 appears somewhere within op1 and is > > > critical for the correct operation of your patch. > > I added reg_mentioned_p for all insns except fp16 complex mult, since > > they have constraint & to the dest so it must be allocated different > > register from src. > > > > Uros Bizjak <ubiz...@gmail.com> 于2022年1月14日周五 23:49写道: > > > > > > > > > > On Fri, Jan 14, 2022 at 2:44 PM Hongyu Wang <wwwhhhyyy...@gmail.com> > > > wrote: > > > > > > > > > Are there any technical obstacles to introduce subst to > > > > > define_{,insn_and_}split? > > > > > > > > gccint says: define_subst can be used only in define_insn and > > > > define_expand, it cannot be used in other expressions (e.g. in > > > > define_insn_and_split). > > > > > > Hm, hm ... annoying ... > > > > > > > I have no idea how to implement it in current infrastructure. > > > > > > > > > In the proposed patch, if the output register is also mentioned in the > > > > > input, then clearing before insn will clear the value in the input > > > > > register. The solution in the i386.md also takes care of this issue. > > > > > > > > > > > > > For this, I think we can add REGNO checks for operands in condition > > > > (which means there is true dependency). > > > > > > Let's go in your direction, considering the limitations of current > > > infrastructure. > > > +{ > > > + if (TARGET_DEST_FALSE_DEPENDENCY > > > + && get_attr_dest_false_dep (insn) == > > > + DEST_FALSE_DEP_TRUE) > > > + output_asm_insn ("vxorps\t{%x0, %x0, %x0}", operands); > > > + return "vgetmant<ssemodesuffix>\t{%2, <round_saeonly_mask_op3>%1, > > > %0<mask_operand3>|%0<mask_operand3>, %1<round_saeonly_mask_op3>, %2}"; > > > +} > > > > > > There is no need to pass the information via attributes. IMO, you > > > shoud use subst attribute directly in the condition: > > > > > > { > > > if (TARGET_DEST_FALSE_DEPENDENCY > > > && <mask3_dest_false_dep_attr> > > > && !reg_mentioned_p (operands[0], operands[1])) > > > output_asm_insn ("vxorps\t{%x0, %x0, %x0}", operands); > > > return "....."; > > > } > > > > > > Assume the above works, so please: > > > > > > - rename TARGET_DEST_FALSE_DEPENDENCY to something less generic, maybe > > > following existing BMI example with TARGET_AVOID_FALSE_DEP_FOR_AVX512F > > > - rename "mask3_dest_false_dep_attr" to "mask3_false_dep_for_avx512f_cond" > > > > > > Please note reg_mentioned_p in the above condition. This function > > > returns nonzero if register op0 appears somewhere within op1 and is > > > critical for the correct operation of your patch. > > > > > > Uros.
-- BR, Hongtao