Hi Segher,
on 2019/5/17 下午2:49, Segher Boessenkool wrote:
> Hi Kewen,
>
> On Thu, May 16, 2019 at 10:35:30PM -0500, [email protected] wrote:
>> 2) For the other part of target invalid stmt check, as the
>> hook invalid_within_doloop grep data shows, no all targets
>> need to check whether invalid instructions exist in doloop.
>> If we scan all stmts as generic, it can waste time for those
>> targets which don't need to check.
>
> So make the default version of the hook NULL, and only run the hook if
> non-null? There are many examples of this.
>
Good tips!
>> Besides, the scope of
>> the current check on SWITCH in rs6000 hook is wide, later
>> if we want it more exact, we may need to check more stmts
>> instead of single. To let target hook scan the BBs/stmts
>> by itself is also more flexible.
>
> If we'll need that flexibility, okay.
>
>> +static bool
>> +invalid_insn_for_doloop_p (struct loop *loop)
>> +{
>> + basic_block *body = get_loop_body (loop);
>> + gimple_stmt_iterator gsi;
>> +
>> + for (unsigned i = 0; i < loop->num_nodes; i++)
>> + for (gsi = gsi_start_bb (body[i]); !gsi_end_p (gsi); gsi_next (&gsi))
>> + {
>> + gimple *stmt = gsi_stmt (gsi);
>> + if (is_gimple_call (stmt) && !gimple_call_internal_p (stmt)
>> + && !is_inexpensive_builtin (gimple_call_fndecl (stmt)))
>> + {
>> + if (dump_file && (dump_flags & TDF_DETAILS))
>> + fprintf (dump_file,
>> + "predict doloop failure due to finding call.\n");
>
> Should this really be for -all dumps only? "X failed because Y" is often
> very interesting info -- and it is not much output.
>
OK, I thought users can firstly check the predict_doloop result whether
meet theirs' expectation and use -details dump for further check why.
And IVOPTs also uses "TDF_DETAILS" for dumping much.
Just remove the flags check? or which TDF level you suggested?
> (Please start the line with a capital if you end it with a period :-) )
>
Some contexts seems missing for this? Or it's for dumping string?
>> + if (dump_file && (dump_flags & TDF_DETAILS))
>> + fprintf (dump_file, "predict doloop failure due to"
>> + "no innermost.\n");
>
> If you paste strings (which is fine for debug output), you still need a
> space between words ;-)
>
Good catches here and later! :)
>> +@deftypefn {Target Hook} bool TARGET_PREDICT_DOLOOP_P (struct loop
>> *@var{loop})
>> +Return true if we can predict it is possible to use low-overhead loops
>> +for a particular loop. The parameter @var{loop} is a pointer to the loop
>
> "... use a low-overhead loop ..."
>
>> +which is going to be checked. This target hook is required only when the
>
> Just remove the whole "which is going to be checked" part?
>
>> +target supports low-overhead loops, and will help some earlier middle-end
>> +passes to make some decisions.
>
> Is it *required* when the target has doloops? And what will happen if you
> do not define this hook, either if or you have doloops or if you don't?
>
> Hook documentation often ends "The default version of this hook returns..."
> which neatly answers all this.
>
OK, will update it with "the default version of this hook return false."
>> + /* For now, we only consider these two RTX classes, to match what we
>> + get in doloop_optimize, excluding operations like zero/sign extend. */
>
> The indentation is broken here.
>
Good catch, contrib/check_GNU_style.sh did NOT catch this. :(
Thanks,
Kewen
>> + if (dump_file && (dump_flags & TDF_DETAILS))
>> + fprintf (dump_file, "predict doloop failure due to"
>> + "target specific checks.\n");
>
> Missing space as well (and more later, please check all).
>
>
> Segher
>