Sun:
If you don't think this behavior compatibility is essential, I am OK
with that. We can save time to do more relevant things, but I am still
interested in this topic. Any comments or inputs are welcome.
Thanks
Regards
Gang
On Mon, Nov 21, 2011 at 11:27 AM, Sun Chan <sun.c...@gmail.com> wrote:
> 1. I don't agree with "this patch must be updated". I don't see a bug
> here. A compatibility (behavior-wise) with other compilers, may be
> 2. I'd like to see some example where you don't accidentally "dfe" some
> functions that cannot be deleted. IOWs, I don't believe you thought about
> this problem and understood what the underlying condition before a certain
> function can be deleted. You just looked at what gcc or others behavior and
> turn on/off some global flag. This is dangerous and not my recommended way
> to change code
> Sun
>
> On Mon, Nov 21, 2011 at 11:21 AM, Gang Yu <yugang...@gmail.com> wrote:
>
>> Sun,
>>
>> Thanks for the input.
>>
>> 'non-callable' should be right called 'non-called', means the function
>> marked MARK_DELETED(deletable) by function Mark_Deletable_Funcs at
>> ipa_cg.cxx. Informally, those functions unreachable by the call-graph can
>> be marked 'DELETABLE' or 'non-called'.
>>
>> I think you refer IPA means IPA general, you are right. lwinline
>> (inliner) is multiplexing part of the IPA general. lwinline does *the DFE*
>> in inline.cxx before perform_inline:
>>
>> in inline.cxx:
>> 1058BOOL
>> 1059Inliner(char* input_name, char* output_name)
>> 1060{
>> 1188 if (IPA_Enable_DFE) {
>> 1189#ifdef _LIGHTWEIGHT_INLINER
>> 1190 if (!(INLINE_Inlined_Pu_Call_Graph ||
>> INLINE_Inlined_Pu_Call_Graph2))
>> 1191#endif // _LIGHTWEIGHT_INLINER
>> 1192 {
>> 1193 set_timer();
>> 1194
>> 1195 Total_Prog_Size = Orig_Prog_Weight -
>> Eliminate_Dead_Func(FALSE);
>> 1196
>> 1197 get_timer(PHASE_DFE);
>> 1198
>> 1199 }
>> 1200 }
>> 1212 Perform_inlining();
>> My suggested change does not affect IPA, inline_driver.cxx is not IPA
>> part, and changes in ipa_cg.cxx(bug838), inline.cxx are enclosed
>> in _LIGHTWEIGHT_INLINER.
>>
>> The suggested patch does not affect the inline behaviour, control should
>> not go real inline performed, for those functions inlined then deleted, the
>> control should never go there.
>>
>> This patch definitely should be updated, but I post out to see comments
>> on the idea. the mentioned DFE and real inline should be departured.
>>
>> Regards
>> Gang
>>
>>
>> On Mon, Nov 21, 2011 at 7:50 AM, Sun Chan <sun.c...@gmail.com> wrote:
>>
>>> it's not clear what you meant by 'non-callable". please educate me.
>>>
>>> your change probably match the gcc behavior, but it's not clear it will
>>> actually accomplish what you want as "DFE" behavior. I don't believe
>>> O0/1/2/3 does no dfe, only IPA does. May be you can show me which part of
>>> compiler will do DFE besides IPA? Even if dfe is performed, "inlined" does
>>> not imply the function body can be removed, it's a lot more complicated
>>> than "inlined"
>>> Sun
>>>
>>> On Sun, Nov 20, 2011 at 7:59 PM, Gang Yu <yugang...@gmail.com> wrote:
>>>
>>>> Hi,
>>>>
>>>> could a gatekeeper help a review? any suggestions or comments are
>>>> highly appreciated.
>>>>
>>>> This is an accidentally discovered issue when I review
>>>> bug597<https://bugs.open64.net/show_bug.cgi?id=597>cases:
>>>>
>>>> cat bug921 <https://bugs.open64.net/show_bug.cgi?id=921>.c
>>>> void static test(void)
>>>> {
>>>> asm("wrongthing");
>>>> }
>>>> yug@jupiter:~/work/bugs/bug921<https://bugs.open64.net/show_bug.cgi?id=921>>
>>>> gcc -c bug921 <https://bugs.open64.net/show_bug.cgi?id=921>.c -O2
>>>> yug@jupiter:~/work/bugs/bug921<https://bugs.open64.net/show_bug.cgi?id=921>>
>>>> gcc -c bug921 <https://bugs.open64.net/show_bug.cgi?id=921>.c -O3
>>>> yug@jupiter:~/work/bugs/bug921<https://bugs.open64.net/show_bug.cgi?id=921>>
>>>> gcc -c bug921 <https://bugs.open64.net/show_bug.cgi?id=921>.c -O1
>>>> yug@jupiter:~/work/bugs/bug921<https://bugs.open64.net/show_bug.cgi?id=921>>
>>>> clang -c bug921 <https://bugs.open64.net/show_bug.cgi?id=921>.c -O3
>>>> yug@jupiter:~/work/bugs/bug921<https://bugs.open64.net/show_bug.cgi?id=921>>
>>>> clang -c bug921 <https://bugs.open64.net/show_bug.cgi?id=921>.c -O2
>>>> yug@jupiter:~/work/bugs/bug921<https://bugs.open64.net/show_bug.cgi?id=921>>
>>>> clang -c bug921 <https://bugs.open64.net/show_bug.cgi?id=921>.c -O1
>>>> yug@jupiter:~/work/bugs/bug921<https://bugs.open64.net/show_bug.cgi?id=921>>
>>>> clang -c bug921 <https://bugs.open64.net/show_bug.cgi?id=921>.c -O0
>>>> yug@jupiter:~/work/bugs/bug921<https://bugs.open64.net/show_bug.cgi?id=921>>
>>>> opencc -c bug921 <https://bugs.open64.net/show_bug.cgi?id=921>.c -O3
>>>> yug@jupiter:~/work/bugs/bug921<https://bugs.open64.net/show_bug.cgi?id=921>>
>>>> opencc -c bug921 <https://bugs.open64.net/show_bug.cgi?id=921>.c -O2
>>>> /tmp/ccspin#.Efw754.s: Assembler messages:
>>>> /tmp/ccspin#.Efw754.s:30: Error: no such instruction: `wrongthing'
>>>> yug@jupiter:~/work/bugs/bug921<https://bugs.open64.net/show_bug.cgi?id=921>>
>>>> opencc -c bug921 <https://bugs.open64.net/show_bug.cgi?id=921>.c -O1
>>>> /tmp/ccspin#.9hLp6w.s: Assembler messages:
>>>> /tmp/ccspin#.9hLp6w.s:30: Error: no such instruction: `wrongthing'
>>>> yug@jupiter:~/work/bugs/bug921<https://bugs.open64.net/show_bug.cgi?id=921>>
>>>> gcc -c bug921 <https://bugs.open64.net/show_bug.cgi?id=921>.c
>>>> /tmp/cczPHnnc.s: Assembler messages:
>>>> /tmp/cczPHnnc.s:11: Error: no such instruction: `wrongthing'
>>>>
>>>> obviously, opencc does not delete non-callable static functions at
>>>> O1/O2, while other compilers do, clang even does more.
>>>>
>>>> Investigation shows driver launches the inliner according to wgen
>>>> return value, i.e, if any function with INLINE attribute, inliner comes. At
>>>> O3 phase, gcc marks all static functions a GS_DECL_INLINE flag at spin
>>>> tree, which makes the inliner always run. However, at O1/O2 level, it does
>>>> not, so the inliner unfortunately ignored.
>>>>
>>>> The lwinliner actually does two things: DFE then inline. The right
>>>> logic should be:
>>>> - at O0 phase, if there are non-callable static functions declared with
>>>> inline attribute, they should be deleted by DFE, no inline. futhur if there
>>>> are inline arguments, call DFE and inline. Otherwise, silent.
>>>> - at optimisation phases, if there are functions with inline
>>>> attributed, do DFE and inline. Otherwise, we should also launch inliner for
>>>> *DFE only*. At O3, gcc can help us always call inliner, at O1 or O2, we
>>>> should open inliner ourselves and tell it only do DFE. since inline costs
>>>> much.
>>>>
>>>> The suggested patch below:
>>>> osprey/driver/phases.c -- 525b7d1..a47394a 100644
>>>> --- a/osprey/driver/phases.c
>>>> +++ b/osprey/driver/phases.c
>>>> @@ -3197,6 +3197,7 @@ run_compiler (int argc, char *argv[])
>>>> string_list_t *args;
>>>> boolean inst_info_updated = FALSE;
>>>> boolean cmd_line_updated = FALSE;
>>>> + boolean dfe_only = FALSE;
>>>> buffer_t rii_file_name;
>>>> buffer_t ii_file_name;
>>>> @@ -3215,8 +3216,14 @@ run_compiler (int argc, char *argv[])
>>>> /* special case where the frontend decided that
>>>> inliner should not be run */
>>>> if (run_inline == FALSE && // bug 11325
>>>> - phase_order[i] == P_inline)
>>>> - continue;
>>>> + phase_order[i] == P_inline) {
>>>> + if (olevel == 0)
>>>> + continue;
>>>> + else {
>>>> + dfe_only = TRUE;
>>>> + run_inline = TRUE;
>>>> + }
>>>> + }
>>>> if (is_matching_phase(get_phase_mask(phase_order[i]),
>>>> P_any_ld)) {
>>>> source_kind = S_o;
>>>> @@ -3236,8 +3243,10 @@ run_compiler (int argc, char *argv[])
>>>> option_was_seen(O_inline) ||
>>>> option_was_seen(O_finline) ||
>>>> option_was_seen(O_finline_functions))) {
>>>> - prepend_option_seen
>>>> (add_string_option(O_INLINE_, "none"));
>>>> + dfe_only = TRUE;
>>>> }
>>>> + if (dfe_only)
>>>> + add_string(args,"-dfe-only");
>>>> copy_phase_options (args, phase_order[i]);
>>>> if (!cmd_line_updated &&
>>>> @@ -3256,6 +3265,9 @@ run_compiler (int argc, char *argv[])
>>>> if (has_current_errors()) break;
>>>> run_phase (phase_order[i],
>>>> get_full_phase_name(phase_order[i]),
>>>> args);
>>>> + /* clear dfe-only flag */
>>>> + dfe_only = FALSE;
>>>> +
>>>> /* undefine the environment variable
>>>> * DEPENDENCIES_OUTPUT after the pre-processor
>>>> phase -
>>>> * bug 386.
>>>> osprey/ipa/inline/inline.cxx -- 7a2e8ad..d90abf7 100644
>>>> --- a/osprey/ipa/inline/inline.cxx
>>>> +++ b/osprey/ipa/inline/inline.cxx
>>>> @@ -177,6 +177,9 @@ SCOPE* Orig_Scope_tab;
>>>> extern IP_FILE_HDR_TABLE IP_File_header; // array of IP_FILE_HDR,
>>>> which
>>>> // holds per file information
>>>> +#ifdef _LIGHTWEIGHT_INLINER
>>>> +extern BOOL DFE_Only;
>>>> +#endif // _LIGHTWEIGHT_INLINER
>>>> #ifdef _LIGHTWEIGHT_INLINER
>>>> AUX_PU_TAB Aux_Pu_Table;
>>>> @@ -1204,7 +1207,10 @@ Inliner(char* input_name, char* output_name)
>>>> fclose(f);
>>>> #endif
>>>> - Perform_inlining();
>>>> +#ifdef _LIGHTWEIGHT_INLINER
>>>> + if (!DFE_Only)
>>>> + Perform_inlining();
>>>> +#endif
>>>> #ifdef _LIGHTWEIGHT_INLINER
>>>> if (INLINE_Inlined_Pu_Call_Graph || INLINE_Inlined_Pu_Call_Graph2)
>>>> {
>>>> osprey/ipa/inline/inline_driver.cxx -- c56f5f5..7382653 100644
>>>> --- a/osprey/ipa/inline/inline_driver.cxx
>>>> +++ b/osprey/ipa/inline/inline_driver.cxx
>>>> @@ -97,7 +97,10 @@ BOOL Verbose = FALSE;
>>>> */
>>>> SKIPLIST *IPA_Skip_List = NULL; /* List of skip options
>>>> */
>>>> -
>>>> +/* The DFE_only flag to indicate whether call lwinline
>>>> + * for DFE only.
>>>> + */
>>>> +BOOL DFE_Only = FALSE;
>>>> /* ====================================================================
>>>> *
>>>> @@ -211,9 +214,11 @@ Process_Command_Line (INT argc, char **argv)
>>>> break; /* ignore the -PHASE: option */
>>>> case 'd': /* accept and ignore the -dsm flags
>>>> */
>>>> - if (strncmp (argv[i]+1, "dsm", 3) != 0)
>>>> - ErrMsg ( EC_Unknown_Flag, argv[i][0], argv[i] );
>>>> - break;
>>>> + if (strncmp (argv[i] +1, "dfe-only", 8) == 0)
>>>> + DFE_Only = TRUE;
>>>> + else if (strncmp (argv[i]+1, "dsm", 3) != 0)
>>>> + ErrMsg ( EC_Unknown_Flag, argv[i][0], argv[i] );
>>>> + break;
>>>> default: /* What's this? */
>>>> ErrMsg ( EC_Unknown_Flag, argv[i][0], argv[i] );
>>>>
>>>> Regards
>>>> Gang
>>>>
>>>>
>>>> ------------------------------------------------------------------------------
>>>> All the data continuously generated in your IT infrastructure
>>>> contains a definitive record of customers, application performance,
>>>> security threats, fraudulent activity, and more. Splunk takes this
>>>> data and makes sense of it. IT sense. And common sense.
>>>> http://p.sf.net/sfu/splunk-novd2d
>>>> _______________________________________________
>>>> Open64-devel mailing list
>>>> Open64-devel@lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/open64-devel
>>>>
>>>>
>>>
>>
>
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure
contains a definitive record of customers, application performance,
security threats, fraudulent activity, and more. Splunk takes this
data and makes sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-novd2d
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel