on 2024/2/6 14:01, Michael Meissner wrote:
> On Tue, Jan 23, 2024 at 04:44:32PM +0800, Kewen.Lin wrote:
...
>>> diff --git a/gcc/config/rs6000/rs6000-opts.h
>>> b/gcc/config/rs6000/rs6000-opts.h
>>> index 33fd0efc936..25890ae3034 100644
>>> --- a/gcc/config/rs6000/rs6000-opts.h
>>> +++ b/gcc/config/rs6000/rs6000-opts.h
>>> @@ -67,7 +67,9 @@ enum processor_type
>>> PROCESSOR_MPCCORE,
>>> PROCESSOR_CELL,
>>> PROCESSOR_PPCA2,
>>> - PROCESSOR_TITAN
>>> + PROCESSOR_TITAN,
>>> +
>>
>> Nit: unintentional empty line?
>>
>>> + PROCESSOR_FUTURE
>>> };
>
> It was more as a separation. The MPCCORE, CELL, PPCA2, and TITAN are rather
> old processors. I don't recall why we kept them after the POWER<x>.
>
> Logically we should re-order the list and move MPCCORE, etc. earlier, but I
> will delete the blank line in future patches.
Thanks for clarifying, the re-order thing can be done in a separate patch and
in this context one comment line would be better than a blank line. :)
...
>>> + power10 tuning until future tuning is added. */
>>> if (rs6000_tune_index >= 0)
>>> - tune_index = rs6000_tune_index;
>>> + {
>>> + enum processor_type cur_proc
>>> + = processor_target_table[rs6000_tune_index].processor;
>>> +
>>> + if (cur_proc == PROCESSOR_FUTURE)
>>> + {
>>> + static bool issued_future_tune_warning = false;
>>> + if (!issued_future_tune_warning)
>>> + {
>>> + issued_future_tune_warning = true;
>>
>> This seems to ensure we only warn this once, but I noticed that in rs6000/
>> only some OPT_Wpsabi related warnings adopt this way, I wonder if we don't
>> restrict it like this, for a tiny simple case, how many times it would warn?
>
> In a simple case, you would only get the warning once. But if you use
> __attribute__((__target__(...))) or #pragma target ... you might see it more
> than once.
OK, considering we only get this warning once for a simple case, I'm inclined
not to keep a static variable for it, it's the same as what we do currently
for option conflict errors emission. But I'm fine for either.
>>> else
>>> {
>>> - size_t i;
>>> enum processor_type tune_proc
>>> = (TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT);
>>>
>>> - tune_index = -1;
>>> - for (i = 0; i < ARRAY_SIZE (processor_target_table); i++)
>>> - if (processor_target_table[i].processor == tune_proc)
>>> - {
>>> - tune_index = i;
>>> - break;
>>> - }
>>> + tune_index = rs600_cpu_index_lookup (tune_proc == PROCESSOR_FUTURE
>>> + ? PROCESSOR_POWER10
>>> + : tune_proc);
>>
>> This part looks useless, as tune_proc is impossible to be PROCESSOR_FUTURE.
>
> Well in theory, you could configure the compiler with --with-cpu=future or
> --with-tune=future.
Sorry for the possible confusion here, the "tune_proc" that I referred to is
the variable in the above else branch:
enum processor_type tune_proc = (TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 :
PROCESSOR_DEFAULT);
It's either PROCESSOR_DEFAULT64 or PROCESSOR_DEFAULT, so it doesn't have a
chance to be PROCESSOR_FUTURE, so the checking "tune_proc == PROCESSOR_FUTURE"
is useless.
That's why I suggested the below flow, it does a final check out of those
checks,
it looks a bit more clear IMHO.
>
>>> }
>>
>> Maybe re-structure the above into:
>>
>> bool explicit_tune = false;
>> if (rs6000_tune_index >= 0)
>> {
>> tune_index = rs6000_tune_index;
>> explicit_tune = true;
>> }
>> else if (cpu_index >= 0)
>> // as before
>> rs6000_tune_index = tune_index = cpu_index;
>> else
>> {
>> //as before
>> ...
>> }
>>
>> // Check tune_index here instead.
>>
>> if (processor_target_table[tune_index].processor == PROCESSOR_FUTURE)
>> {
>> tune_index = rs6000_cpu_index_lookup (PROCESSOR_POWER10);
>> if (explicit_tune)
>> warn ...
>> }
>>
>> // as before
>> rs6000_tune = processor_target_table[tune_index].processor;
>>
>>>
BR,
Kewen