Hi Segher,
on 2022/12/20 21:19, Segher Boessenkool wrote:
> Hi!
>
> On Mon, Dec 19, 2022 at 02:13:49PM +0800, Kewen.Lin wrote:
>> on 2022/12/15 06:29, Segher Boessenkool wrote:
>>> On Wed, Nov 30, 2022 at 04:30:13PM +0800, Kewen.Lin wrote:
>>>> --- a/gcc/config/rs6000/genfusion.pl
>>>> +++ b/gcc/config/rs6000/genfusion.pl
>>>> @@ -167,7 +167,7 @@ sub gen_logical_addsubf
>>>> $inner_comp, $inner_inv, $inner_rtl, $inner_op, $both_commute, $c4,
>>>> $bc, $inner_arg0, $inner_arg1, $inner_exp, $outer_arg2, $outer_exp,
>>>> $ftype, $insn, $is_subf, $is_rsubf, $outer_32, $outer_42,$outer_name,
>>>> - $fuse_type);
>>>> + $fuse_type, $constraint_cond);
>>>> KIND: foreach $kind ('scalar','vector') {
>>>> @outer_ops = @logicals;
>>>> if ( $kind eq 'vector' ) {
>>>> @@ -176,12 +176,14 @@ sub gen_logical_addsubf
>>>> $pred = "altivec_register_operand";
>>>> $constraint = "v";
>>>> $fuse_type = "fused_vector";
>>>> + $constraint_cond = "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode) && ";
>>>> } else {
>>>> $vchr = "";
>>>> $mode = "GPR";
>>>> $pred = "gpc_reg_operand";
>>>> $constraint = "r";
>>>> $fuse_type = "fused_arith_logical";
>>>> + $constraint_cond = "";
>>>> push (@outer_ops, @addsub);
>>>> push (@outer_ops, ( "rsubf" ));
>>>> }
>>>
>>> I don't like this at all. Please use the "isa" attribute where needed?
>>> Or do you need more in some cases? But, again, separate patch.
>>
>> This is to add one more condition for those define_insns, for example:
>
> Sure, I understand that. What I don't like is the generator program is
> much too big and unstructured already, and this doesn't help at all; it
> makes it quite a bit worse even.
OK.
>
>> It's to avoid the pseudo whose mode isn't available for register constraint v
>> causes ICE during reload. I'm not sure how the "isa" attribute helps here,
>> could you elaborate it?
>
> Yeah, it doesn't help. The condition implied by the isa attribute is
> not added to the insn condition automatically; doing that could be too
> expensive, and disruptive as well. Something for stage 1 :-)
>
OK, thanks for the clarification. :)
>>>> + if (TARGET_POWER10
>>>> + && (rs6000_isa_flags_explicit & OPTION_MASK_P10_FUSION) == 0)
>>>> + rs6000_isa_flags |= OPTION_MASK_P10_FUSION;
>>>> + else if (!TARGET_POWER10 && TARGET_P10_FUSION)
>>>> + rs6000_isa_flags &= ~OPTION_MASK_P10_FUSION;
>>>
>>> That's not right. If you want something like this you should check for
>>> TARGET_POWER10 whenever you check for TARGET_P10_FUSION; but there
>>> really is no reason at all to disable P10 fusion on other CPUs (neither
>>> newer nor older!).
>>
>> Good point, and I just noticed that we should check tune setting instead
>> of TARGET_POWER10 here? Something like:
>>
>> if (!(rs6000_isa_flags_explicit & OPTION_MASK_P10_FUSION))
>> {
>> if (processor_target_table[tune_index].processor == PROCESSOR_POWER10)
>> rs6000_isa_flags |= OPTION_MASK_P10_FUSION;
>> else
>> rs6000_isa_flags &= ~OPTION_MASK_P10_FUSION;
>> }
>
> Yeah that looks better :-)
>
I'm going to test this and commit it first. :)
> Maybe you can restructure the Perl code a bit in a first patch, and then
> add the insn condition? If you're not comfortable with Perl, I'll deal
> with it, just update the patch.
OK, I'll give it a try, TBH I just fixed the place for insn condition, didn't
look into this script, with a quick look, I'm going to factor out the main
body from the multiple level loop, do you have some suggestions on which other
candidates to be restructured?
BR,
Kewen