sounds good. thanks,
David On Thu, Oct 18, 2012 at 1:52 AM, Richard Biener <richard.guent...@gmail.com> wrote: > On Wed, Oct 17, 2012 at 6:55 PM, Xinliang David Li <davi...@google.com> wrote: >> On Wed, Oct 17, 2012 at 2:08 AM, Richard Biener >> <richard.guent...@gmail.com> wrote: >>> On Wed, Oct 17, 2012 at 9:05 AM, Xinliang David Li <davi...@google.com> >>> wrote: >>>> A more simpler use model is not to guard the dump statement at all -- >>>> just express the intention a) what to dump; b) as what kind or to >>>> where >>>> >>>> >>>> 1) I want to dump the something as optimized message: >>>> >>>> dump_printf (MSG_OPTIMIZED, "blah...") >>>> >>>> dump_printf_loc (MSG_OPTIMIZED, "blah") >>>> >>>> 2) I want to dump something together with tree dump regardless of the flag: >>>> >>>> dump_printf (TDF_TREE, ...); >>>> >>>> 3) I want to dump something with tree dump when detailed flags is set: >>>> >>>> dump_printf (TDF_DETAILS, ...); >>>> >>>> >>>> The dumping code is not in the critical path, so the compile time >>>> should not be a concern. >>> >>> That's not true in all cases which is why I asked for the predicate to be >>> available, especially for the case where it guards multiple dump_* >>> statement. >>> >>> Look for example at CCPs ccp_visit_stmt which calls >>> >>> if (dump_file && (dump_flags & TDF_DETAILS)) >>> { >>> fprintf (dump_file, "\nVisiting statement:\n"); >>> print_gimple_stmt (dump_file, stmt, 0, dump_flags); >>> } >>> >> >> Yes -- that means guarding is for performance reason and can be made >> optional. >> >>> and ends up calling evaluate_stmt most of the time: >> >> That looks too expensive even with the guard. Can it be turned off in >> non debug build? >> >>> >>> if (dump_file && (dump_flags & TDF_DETAILS)) >>> { >>> fprintf (dump_file, "which is likely "); >>> switch (likelyvalue) >>> { >>> case CONSTANT: >>> fprintf (dump_file, "CONSTANT"); >>> break; >>> case UNDEFINED: >>> fprintf (dump_file, "UNDEFINED"); >>> break; >>> case VARYING: >>> fprintf (dump_file, "VARYING"); >>> break; >>> default:; >>> } >>> fprintf (dump_file, "\n"); >>> } >>> >>> such code is not something you'd want to do unconditionally. >>> >> >> ok. >> >> >>> I agree the use of the predicate can be reduced in some cases but it has >>> to be available for cases like the above. And eventually have a fast-path >>> inlined like >>> >>> inline bool dump_kind_p (int flags) >>> { >>> return any_dump_enabled_p ? dump_kind_p_1 (flags) : false; >>> } >>> >>> or a new inline function >>> >>> inline bool dump_enabled_p () >>> { >>> return any_dump_enabled_p; >>> } >>> >>> at the cost of one extra global flag we'd need to maintain. Probably the >>> latter would be what you prefer? That way we don't get redundant >>> or even conflicting flags on the predicate check vs. the dump stmts. >>> >> >> Another way: >> >> To make the dumping code as concise as possible, we can make >> dump_printf a inlinable wrapper: >> >> inline void dump_printf (...) >> { >> if (!any_dump_enabled_p) >> return; >> >> // regular stuff >> } > > You still have the issue that // regular stuff may appear to possibly > clobber any_dump_enabled_p and thus repeated any_dump_enabled_p > checks are not optimized by the compiler (we don't have predicated > value-numbering (yet)). > > So I prefer the guard. I suppose after this discussion I prefer > a any_dump_enabled_p () guard instead of one with (repeated) flags. > > Richard. > >> thanks, >> >> David >> >> >>> Thanks, >>> Richard. >>> >>>> David >>>> >>>> >>>> On Tue, Oct 16, 2012 at 11:42 PM, Sharad Singhai <sing...@google.com> >>>> wrote: >>>>>> 1. OK, I understand that e.g. >>>>>> >>>>>> if (dump_file && (dump_flags & TDF_DETAILS)) >>>>>> >>>>>> should be converted into: >>>>>> >>>>>> if (dump_kind_p (TDF_DETAILS)) >>>>>> >>>>>> But what about current code that does not care about dump_flags? >>>>>> E.g. converting simple >>>>>> >>>>>> if (dump_file) >>>>>> >>>>>> to >>>>>> >>>>>> if (dump_kind_p (0)) >>>>>> >>>>>> won't work, dump_kind_p will always return zero in such cases. >>>>> >>>>> >>>>> Yes, you are right, the conversion is not completely mechanical and >>>>> some care must be taken to preserve the original intent. I think one >>>>> of the following might work in the case where a pass doesn't care >>>>> about the dump_flags >>>>> >>>>> 1. use generic pass type flags, such as TDF_TREE, TDF_IPA, TDF_RTL >>>>> which are guaranteed to be set depending on the pass type, >>>>> 2. this dump statement might be a better fit for MSG_* flags if it >>>>> deals with optimizations. Sometimes "if (dump_file) fpritnf >>>>> (dump_file, ...)" idiom was used for these situations and now these >>>>> sites might be perfect candidate for converting into MSG_* flags. >>>>> >>>>> If a cleaner way to handle this is desired, perhaps we can add an >>>>> unconditional "dump_printf_always (...)", but currently it seems >>>>> unnecessary. Note that for optimization messages which should always >>>>> be printed, one can use MSG_ALL flag. However, no analogous flag >>>>> exists for regular dumps. How about adding a corresponding TDF_ALL >>>>> flag? Would that work? >>>>> >>>>>> >>>>>> >>>>>> 2. dump_kind_p seems to always return 0 if current_function_decl is >>>>>> NULL. However, that precludes its use in IPA passes in which this >>>>>> can happen regularly. Why is this restriction necessary? >>>>> >>>>> >>>>> This is an oversight on my part. Originally, I wanted to be able to >>>>> print source location information and this is a remnant of that. I am >>>>> testing a patch to fix that. >>>>> >>>>> Thanks, >>>>> Sharad