Re: [PATCH,rs6000 2/2] Fusion patterns for add-logical/logical-add
One last addendum to this. I discovered that that needs a "sort" in front of "keys %logicals_addsub" because otherwise you may get the operators in different orders sometimes which leads to fusion.md having the patterns in different orders which isn't helpful for sane debugging. Segher and I discussed it offline so I'm posting the final patch for posterity. Also coming will be some updates to the test cases. Things optimize differently with -m32 apparently so I'll have to add different counts of the counts of the different fusion patterns for "{ target ilp32 }" as the current counts in those files only apply to "{ target lp64 }". Aaron gcc/ChangeLog: * config/rs6000/genfusion.pl (gen_logical_addsubf): Refactor to add generation of logical-add and add-logical fusion pairs. * config/rs6000/rs6000-cpus.def: Add new fusion to ISA 3.1 mask and powerpc mask. * config/rs6000/rs6000.c (rs6000_option_override_internal): Turn on logical-add and add-logical fusion by default. * config/rs6000.opt: Add -mpower10-fusion-logical-add and -mpower10-fusion-add-logical options. * config/rs6000/fusion.md: Regenerate file. gcc/testsuite/ChangeLog: * gcc.target/powerpc/fusion-p10-logadd.c: New file. --- gcc/config/rs6000/fusion.md | 872 +- gcc/config/rs6000/genfusion.pl| 83 +- gcc/config/rs6000/rs6000-cpus.def | 4 + gcc/config/rs6000/rs6000.c| 8 + gcc/config/rs6000/rs6000.opt | 12 +- .../gcc.target/powerpc/fusion-p10-logadd.c| 97 ++ 6 files changed, 797 insertions(+), 279 deletions(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/fusion-p10-logadd.c diff --git a/gcc/config/rs6000/fusion.md b/gcc/config/rs6000/fusion.md index 4d810e6ba13..51912106663 100644 --- a/gcc/config/rs6000/fusion.md +++ b/gcc/config/rs6000/fusion.md @@ -355,11 +355,11 @@ (define_insn_and_split "*lbz_cmpldi_cr0_QI_GPR_CCUNS_zero" (set_attr "length" "8")]) -;; logical-logical fusion pattern generated by gen_2logical +;; logical-logical fusion pattern generated by gen_logical_addsubf ;; scalar and -> and (define_insn "*fuse_and_and" [(set (match_operand:GPR 3 "gpc_reg_operand" "=0,1,,r") -(and:GPR (and:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r") +(and:GPR (and:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r") (match_operand:GPR 1 "gpc_reg_operand" "%r,r,r,r")) (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))) (clobber (match_scratch:GPR 4 "=X,X,X,"))] @@ -373,11 +373,11 @@ (define_insn "*fuse_and_and" (set_attr "cost" "6") (set_attr "length" "8")]) -;; logical-logical fusion pattern generated by gen_2logical +;; logical-logical fusion pattern generated by gen_logical_addsubf ;; scalar andc -> and (define_insn "*fuse_andc_and" [(set (match_operand:GPR 3 "gpc_reg_operand" "=0,1,,r") -(and:GPR (and:GPR (not:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")) +(and:GPR (and:GPR (not:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")) (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r")) (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))) (clobber (match_scratch:GPR 4 "=X,X,X,"))] @@ -391,11 +391,11 @@ (define_insn "*fuse_andc_and" (set_attr "cost" "6") (set_attr "length" "8")]) -;; logical-logical fusion pattern generated by gen_2logical +;; logical-logical fusion pattern generated by gen_logical_addsubf ;; scalar eqv -> and (define_insn "*fuse_eqv_and" [(set (match_operand:GPR 3 "gpc_reg_operand" "=0,1,,r") -(and:GPR (not:GPR (xor:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r") +(and:GPR (not:GPR (xor:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r") (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r"))) (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))) (clobber (match_scratch:GPR 4 "=X,X,X,"))] @@ -409,11 +409,11 @@ (define_insn "*fuse_eqv_and" (set_attr "cost" "6") (set_attr "length" "8")]) -;; logical-logical fusion pattern generated by gen_2logical +;; logical-logical fusion pattern generated by gen_logical_addsubf ;; scalar nand -> and (define_insn "*fuse_nand_and" [(set (match_operand:GPR 3 "gpc_reg_operand" "=0,1,,r") -(and:GPR (ior:GPR (not:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")) +(and:GPR (ior:GPR (not:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")) (not:GPR (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r"))) (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))) (clobber (match_scratch:GPR 4 "=X,X,X,"))] @@ -427,11 +427,11 @@ (define_insn "*fuse_nand_and" (set_attr "cost" "6") (set_attr "length" "8")]) -;; logical-logical fusion pattern generated by gen_2logical
Re: [PATCH,rs6000 2/2] Fusion patterns for add-logical/logical-add
On Mon, Apr 26, 2021 at 03:21:30PM -0500, acsaw...@linux.ibm.com wrote: > This patch modifies the function in genfusion.pl for generating > the logical-logical patterns so that it can also generate the > add-logical and logical-add patterns which are very similar. > + $outer_32 = "%2,%3"; > + $outer_42 = "%2,%4"; I think you had trouble thinking of good names here :-) > +mpower10-fusion-logical-add > +Target Undocumented Mask(P10_FUSION_LOGADD) Var(rs6000_isa_flags) > +Fuse certain integer operations together for better performance on power10. > + > +mpower10-fusion-add-logical > +Target Undocumented Mask(P10_FUSION_ADDLOG) Var(rs6000_isa_flags) > +Fuse certain integer operations together for better performance on power10. Do you not want to say something a little more precise here? > --- /dev/null > +++ b/gcc/testsuite/gcc.target/powerpc/fusion-p10-logadd.c > @@ -0,0 +1,98 @@ > +/* { dg-do compile { target { powerpc*-*-* } } } */ > +/* { dg-skip-if "" { powerpc*-*-darwin* } } */ Same issues here as in the previous patch. Other than those things, okay for trunk and backport to 11. Thanks! Segher
[PATCH,rs6000 2/2] Fusion patterns for add-logical/logical-add
From: Aaron Sawdey This patch modifies the function in genfusion.pl for generating the logical-logical patterns so that it can also generate the add-logical and logical-add patterns which are very similar. gcc/ChangeLog: * config/rs6000/genfusion.pl (gen_logical_addsubf): Refactor to add generation of logical-add and add-logical fusion pairs. * config/rs6000/rs6000-cpus.def: Add new fusion to ISA 3.1 mask and powerpc mask. * config/rs6000/rs6000.c (rs6000_option_override_internal): Turn on logical-add and add-logical fusion by default. * config/rs6000.opt: Add -mpower10-fusion-logical-add and -mpower10-fusion-add-logical options. * config/rs6000/fusion.md: Regenerate file. gcc/testsuite/ChangeLog: * gcc.target/powerpc/fusion-p10-logadd.c: New file. --- gcc/config/rs6000/fusion.md | 876 -- gcc/config/rs6000/genfusion.pl| 87 +- gcc/config/rs6000/rs6000-cpus.def | 4 + gcc/config/rs6000/rs6000.c| 6 + gcc/config/rs6000/rs6000.opt | 8 + .../gcc.target/powerpc/fusion-p10-logadd.c| 98 ++ 6 files changed, 798 insertions(+), 281 deletions(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/fusion-p10-logadd.c diff --git a/gcc/config/rs6000/fusion.md b/gcc/config/rs6000/fusion.md index 6dfe1fa4508..6c7c94c44c1 100644 --- a/gcc/config/rs6000/fusion.md +++ b/gcc/config/rs6000/fusion.md @@ -355,11 +355,11 @@ (define_insn_and_split "*lbz_cmpldi_cr0_QI_GPR_CCUNS_zero" (set_attr "length" "8")]) -;; logical-logical fusion pattern generated by gen_2logical +;; logical-logical fusion pattern generated by gen_logical_addsubf ;; scalar and -> and (define_insn "*fuse_and_and" [(set (match_operand:GPR 3 "gpc_reg_operand" "=0,1,,r") -(and:GPR (and:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r") +(and:GPR (and:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r") (match_operand:GPR 1 "gpc_reg_operand" "%r,r,r,r")) (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))) (clobber (match_scratch:GPR 4 "=X,X,X,"))] @@ -373,11 +373,11 @@ (define_insn "*fuse_and_and" (set_attr "cost" "6") (set_attr "length" "8")]) -;; logical-logical fusion pattern generated by gen_2logical +;; logical-logical fusion pattern generated by gen_logical_addsubf ;; scalar andc -> and (define_insn "*fuse_andc_and" [(set (match_operand:GPR 3 "gpc_reg_operand" "=0,1,,r") -(and:GPR (and:GPR (not:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")) +(and:GPR (and:GPR (not:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")) (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r")) (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))) (clobber (match_scratch:GPR 4 "=X,X,X,"))] @@ -391,11 +391,11 @@ (define_insn "*fuse_andc_and" (set_attr "cost" "6") (set_attr "length" "8")]) -;; logical-logical fusion pattern generated by gen_2logical +;; logical-logical fusion pattern generated by gen_logical_addsubf ;; scalar eqv -> and (define_insn "*fuse_eqv_and" [(set (match_operand:GPR 3 "gpc_reg_operand" "=0,1,,r") -(and:GPR (not:GPR (xor:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r") +(and:GPR (not:GPR (xor:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r") (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r"))) (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))) (clobber (match_scratch:GPR 4 "=X,X,X,"))] @@ -409,11 +409,11 @@ (define_insn "*fuse_eqv_and" (set_attr "cost" "6") (set_attr "length" "8")]) -;; logical-logical fusion pattern generated by gen_2logical +;; logical-logical fusion pattern generated by gen_logical_addsubf ;; scalar nand -> and (define_insn "*fuse_nand_and" [(set (match_operand:GPR 3 "gpc_reg_operand" "=0,1,,r") -(and:GPR (ior:GPR (not:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")) +(and:GPR (ior:GPR (not:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")) (not:GPR (match_operand:GPR 1 "gpc_reg_operand" "r,r,r,r"))) (match_operand:GPR 2 "gpc_reg_operand" "r,r,r,r"))) (clobber (match_scratch:GPR 4 "=X,X,X,"))] @@ -427,11 +427,11 @@ (define_insn "*fuse_nand_and" (set_attr "cost" "6") (set_attr "length" "8")]) -;; logical-logical fusion pattern generated by gen_2logical +;; logical-logical fusion pattern generated by gen_logical_addsubf ;; scalar nor -> and (define_insn "*fuse_nor_and" [(set (match_operand:GPR 3 "gpc_reg_operand" "=0,1,,r") -(and:GPR (and:GPR (not:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")) +(and:GPR (and:GPR (not:GPR (match_operand:GPR 0 "gpc_reg_operand" "r,r,r,r")) (not:GPR (match_operand:GPR 1 "gpc_reg_operand"