To be fair, needing DCE to happen to build Linux kernel is known for a very
long time. It does not translate into needing to have that at -O0  or -O0
-g on default. One simply add a flag in the build script when he is
building the kernel.
This should take care of compile time concerns (my guess is about 20%
increase to total compile time)
Sun

On Thu, Dec 8, 2011 at 5:04 AM, Gilmore, Doug <doug.gilm...@amd.com> wrote:

>  There was a patch submitted to Path64 that was never committed that****
>
> handled a similar -O0 problem.  It wasn't committed.  (Maybe because****
>
> it didn't handle this situation?)****
>
> ** **
>
> I attached a patch for a prototype fix for this problem that includes****
>
> the simple patch submitted to the Path64 development list and hacking****
>
> away a bug fix that was done by Pathscale.****
>
> ** **
>
> Anyway, it may be that if we clean up the bug fix, we might have****
>
> an acceptable fix to the problem.****
>
> ** **
>
> Comments?****
>
> ** **
>
> Doug****
>
> ** **
>
> PS: there is a tracing fix in the patch, that might be worthwhile****
>
> committing (if I am debugging wgen I usually run with -tra -tt3:0x200****
>
> with this tracing patch supplied).****
>
> ** **
>
> *From:* Gautam Chakrabarti [mailto:gautam.c...@yahoo.com]
> *Sent:* Wednesday, December 07, 2011 9:19 AM
> *To:* Gang Yu; Sun Chan
> *Cc:* open64-devel
>
> *Subject:* Re: [Open64-devel] Review request for fix bug798(O0 does not
> do dce)[WOPT, infrastructure]****
>
>  ** **
>
> Thanks for the answers.****
>
>  ****
>
> I was suspecting debuggability issues by enabling partial WOPT at -g,
> which you seem to confirm below. Because I am not sure if open64 has had
> much testing with debuggability in the presence of WOPT. So this is
> expected to be an issue. And as Sun indicated in a separate thread, this
> might be an important issue.****
>
>  ****
>
> Regarding compilation time increase, long time back when I used to work on
> this more actively, we had good competition from GCC at compile time under
> -O0/-g. An increase in compilation time at these levels may get lot of
> complaints, so this may be an important issue too.****
>
>  ****
>
> So maybe before fully making this patch functional, it might be good to
> get an estimate on these issues and determine if these are easily fixable...
> ****
>
>  ****
>
> Gautam****
>
>  ****
>
> ** **
>
> *From:* Gang Yu <yugang...@gmail.com>
> *To:* Gautam Chakrabarti <gautam.c...@yahoo.com>
> *Cc:* open64-devel <open64-devel@lists.sourceforge.net>
> *Sent:* Tuesday, December 6, 2011 11:15 PM
> *Subject:* Re: [Open64-devel] Review request for fix bug798(O0 does not
> do dce)[WOPT, infrastructure]****
>
> Hi, Gautum****
>
>  ****
>
> Thanks for the questions.****
>
>  ****
>
> The only purpose of this patch is to get gnu compatibility at O0 phase for
> kernel build pass. If this patch does something unexpected deleted,
> then definitely we need further update it. For the compilation time related
> stuff, since we introduce the wopt for O0/O1 phases, the compilation time
> will no doubtly increase. I have no abolutely figures to point out how much
> time it  increased. Since, we have to make this functional first, so
> compile time issue may be next considered.****
>
>  ****
>
> I have some testing(not fully test) on the dwalf issue. I collected some
> typical cases for  code patterns on such issue, These cases are short, I
> still found debuggablity problems for some embedded assembler code, we
> could not focus the loc info, then we could not trace. but I think this is
> not specific to O0 -g.****
>
>  ****
>
> Examples below:****
>
> //TAG: kernel
> //flags: -O0
> extern void __bad_percpu_size(void);
> char *per_cpu__current_task;
> int main(void){****
>
>
>   char * ret__;
> switch (sizeof(per_cpu__current_task))****
>
>   { case 1: asm volatile ("mov" "b ""%%""gs"":%P" "1"",%0" : "=q" (ret__)
> : "p" (&per_cpu__current_task)); break;
>   case 2: asm volatile ("mov" "w ""%%""gs"":%P" "1"",%0" : "=r" (ret__) :
> "p" (&per_cpu__current_task)); break;
>     case 4: asm volatile ("mov" "l ""%%""gs"":%P" "1"",%0" : "=r" (ret__)
> : "p" (&per_cpu__current_task)); break;
>   case 8: asm volatile ("inc %rax"); break;****
>
>   }
>  return 0;
> }****
>
> yug@jupiter:~/work/bugs/bug798> /usr/bin/gcc -O0 -g bug798-5.c -o
> bug798-5-gcc
> yug@jupiter:~/work/bugs/bug798> opencc -O0 -g bug798-5.c -o
> bug798-5-opencc-O0
> yug@jupiter:~/work/bugs/bug798> opencc -O2 -g bug798-5.c -o
> bug798-5-opencc-O2
> yug@jupiter:~/work/bugs/bug798> pathcc -O2 -g bug798-5.c -o
> bug798-5-pathcc-O2****
>
>  ****
>
> Reading symbols from /fc/home/yug/work/bugs/bug798/bug798-5-gcc...done.
> (gdb) b main
> Breakpoint 1 at 0x4004f0: file bug798-5.c, line 14.
> (gdb) r
> Starting program: /fc/home/yug/work/bugs/bug798/bug798-5-gcc****
>
> Breakpoint 1, main () at bug798-5.c:14
> 14        case 8: asm volatile ("inc %rax"); break;
> Reading symbols from
> /fc/home/yug/work/bugs/bug798/bug798-5-opencc-O0...done.
> (gdb) b main
> Breakpoint 1 at 0x400585: file bug798-5.c, line 17.
> yug@jupiter:~/work/bugs/bug798> gdb bug798-5-opencc-O2
> Reading symbols from
> /fc/home/yug/work/bugs/bug798/bug798-5-opencc-O2...done.
> (gdb) b main
> Breakpoint 1 at 0x400588: file bug798-5.c, line 17.****
>
> yug@jupiter:~/work/bugs/bug798> gdb bug798-5-pathcc-O2
> (gdb) b main****
>
> Reading symbols from
> /fc/home/yug/work/bugs/bug798/bug798-5-pathcc-O2...done.
> Breakpoint 1 at 0x400658: file /fc/home/yug/work/bugs/bug798/bug798-5.c,line 
> 17
> .****
>
>
> Regards
> Gang
>
> ****
>
> On Wed, Dec 7, 2011 at 1:39 PM, Gautam Chakrabarti <gautam.c...@yahoo.com>
> wrote:****
>
> Hi Gang,****
>
>  ****
>
> I have a few questions:****
>
>  ****
>
> Is this phase going to be run at -g? From a quick look at the change
> below, it seems yes. I do see similar behavior from GCC at -O0 -g also. But
> for us by adding WOPT, does it affect debuggability? Has this been tested?
> ****
>
>  ****
>
> How does this affect -O0/-g compilation time?****
>
>  ****
>
> Thanks,
> Gautam****
>
>  ****
>
> ** **
>
> *From:* Gang Yu <yugang...@gmail.com>
> *To:* open64-devel <open64-devel@lists.sourceforge.net>
> *Sent:* Tuesday, December 6, 2011 6:53 PM
> *Subject:* [Open64-devel] Review request for fix bug798(O0 does not do
> dce)[WOPT, infrastructure]****
>
> ** **
>
> Hi, ****
>
>  ****
>
>    Could a gatekeeper please help review the fix for bug798(
> http://bugs.open64.net/show_bug.cgi?id=798)?****
>
>  ****
>
> This is a bug for a long time, a typical bug case below:****
>
>  ****
>
> int defined_fun()
> {
> }
>
> int main()
> {
>
>   int t;
>   switch(sizeof(t))
>   {
>    case 4:
>      defined_fun();
>      break;
>    default:
>      undefined_fun();
> }
> }
>
> opencc -O0 b.c
> /tmp/cco.c7KVi5: In function `main':
> b.c:15: undefined reference to `undefined_fun'****
>
>  ****
>
> open64 does not invoke wopt at O0, so call to undefined_fun() is not
> deleted, then the linker asserts. We may have many methods to solve this
> issue, hacking wgen to cut down the unreachable branch, adding special dce
> phase before CG expansion ..... , but the simplest way is to invoke limited
> wopt functionality at O0.****
>
>  ****
>
> This is inspired by Fred Chow and Previously Sun Chan and Suneel Jain's
> comment on bug588.****
>
>  ****
>
> >My recommendation would be to do this kind of dead code
> >elimination at -O0 in Open64. That will provide greater compatibility
> >with gcc.****
>
> >- Suneel****
>
>  ****
>
> >can you do an experiment, please use the following options "-O0
> >-phase:p" and see if the compile will go through.
> >Thx!****
>
> >Sun****
>
>  ****
>
> We introduce a special phase q to backend, indicating invoke preopt for
> dce only. the Suggest patch below:****
>
>  ****
>
> osprey/be/be/driver.cxx    -- 207cd21..22e93a8 100644
> --- a/osprey/be/be/driver.cxx
> +++ b/osprey/be/be/driver.cxx
> @@ -441,6 +441,7 @@ load_components (INT argc, char **argv)
>      INT phase_argc;
>      char **phase_argv;****
>
> +
>      if (!(Run_lno || Run_wopt || Run_preopt || Run_cg ||
>           Run_prompf || Run_w2c || Run_w2f
>            || Run_w2fc_early || Run_ipl))
> @@ -468,6 +469,10 @@ load_components (INT argc, char **argv)
>        CG_Process_Command_Line (phase_argc, phase_argv, argc, argv);
>      }****
>
> +    /* run preopt for dce only also invoke preopt */
> +    if (Run_preopt_dceonly)
> +      Run_preopt = TRUE;
> +
>      if (Run_wopt || Run_preopt || Run_lno || Run_autopar) {
>        Get_Phase_Args (PHASE_WOPT, &phase_argc, &phase_argv);
>  #if !defined(BUILD_FAST_BIN)****
>
> osprey/be/be/driver_util.cxx    -- e8f58f9..d5c4698 100644
> --- a/osprey/be/be/driver_util.cxx
> +++ b/osprey/be/be/driver_util.cxx
> @@ -481,6 +481,12 @@ Process_Command_Line (INT argc, char **argv)
>             if (strcmp (myname, "preopt") == 0)
>                 Run_preopt = TRUE;
>             break;
> +        case 'q':
> +            if (strcmp (myname, "preopt") == 0) {
> +              Run_preopt = TRUE;
> +              Run_preopt_dceonly = TRUE;
> +            }
> +            break;
>         case 'c':
>             if (strcmp (myname, "cg") == 0)
>                 Run_cg = TRUE;****
>
> osprey/be/opt/opt_main.cxx    -- 4b8957c..a7e4679 100644
> --- a/osprey/be/opt/opt_main.cxx
> +++ b/osprey/be/opt/opt_main.cxx
> @@ -731,6 +731,51 @@ private:
>        WOPT_Enable_Combine_Operations = FALSE;
>        WOPT_Enable_SLT = FALSE;
>        OPT_Enable_WHIRL_SSA = FALSE;
> +      if (Run_preopt_dceonly) {
> +          WOPT_Enable_Add_Do_Loop_Info =
> +          WOPT_Enable_Add_Label_Loop_Info =
> +          WOPT_Enable_Aggressive_dce =
> +          WOPT_Enable_Aggressive_Code_Motion =
> +          WOPT_Enable_Alias_Classification =
> +          WOPT_Enable_Alias_Class_Fortran_Rule =
> +          WOPT_Enable_Combine_Operations =
> +          WOPT_Enable_Compare_Simp =
> +          WOPT_Enable_CRSIMP =
> +          WOPT_Enable_DCE_Alias =
> +          WOPT_Enable_Edge_Placement =
> +          WOPT_Enable_Exp_PRE =
> +          WOPT_Enable_Fold2const =
> +          WOPT_Enable_LNO_Copy_Propagate =
> +          WOPT_Enable_FSA =
> +          WOPT_Enable_Goto =
> +          WOPT_Enable_Input_Prop =
> +          WOPT_Enable_Itself_Prop =
> +          WOPT_Enable_Ivar_Common =
> +          WOPT_Enable_IVE =
> +          WOPT_Enable_IVR =
> +          WOPT_Enable_Ldx =
> +          WOPT_Enable_Load_PRE =
> +          WOPT_Enable_Local_Rvi =
> +          WOPT_Enable_Output_Copy =
> +          WOPT_Enable_Parm =
> +          WOPT_Enable_Phi_Simp =
> +          WOPT_Enable_RVI =
> +          WOPT_Enable_SLT =
> +          WOPT_Enable_Store_PRE =
> +          WOPT_Enable_SSA_PRE =
> +          WOPT_Enable_Vsym_Unique =
> +          OPT_Enable_WHIRL_SSA =
> +          WOPT_Enable_WOVP =
> +          Enable_WN_Simp =                     // disable WHIRL simplifier
> +          // WOPT_Enable_Zero_Version =
> +          WOPT_Enable_Tail_Recur =
> +          FALSE;
> +
> +        WOPT_Enable_Verify = 1;
> +        WOPT_Enable_DCE = WOPT_Enable_Copy_Propagate = TRUE;
> +
> +
> +      }
>        break;
>      } // switch
>      WOPT_Enable_Ldx = Indexed_Loads_Allowed;****
>
> osprey/common/com/config.cxx    -- c972676..387f9c1 100644
> --- a/osprey/common/com/config.cxx
> +++ b/osprey/common/com/config.cxx
> @@ -621,6 +621,8 @@ static OPTION_DESC Options_PHASE[] = {
>        &Run_wopt,       NULL},
>      { OVK_BOOL,        OV_INTERNAL,    FALSE, "preopt", "p",    0, 0, 0,
>        &Run_preopt,     NULL},
> +    { OVK_BOOL,        OV_INTERNAL,    FALSE, "q",       "",    0, 0, 0,
> +      &Run_preopt_dceonly,     NULL},
>      { OVK_BOOL,        OV_INTERNAL,    FALSE, "cg",      "c",   0, 0, 0,
>        &Run_cg, NULL},
>      { OVK_BOOL,        OV_INTERNAL,    FALSE, "clist",  NULL,   0, 0, 0,
> @@ -998,6 +1000,7 @@ BOOL Enable_EBO_Post_Proc_Rgn = TRUE ;
>  BOOL Run_lno = FALSE;              /* run loop-nest optimizer */
>  BOOL Run_wopt = FALSE;             /* run WHIRL global optimizer */
>  BOOL Run_preopt = FALSE;           /* run WHIRL preopt optimizer */
> +BOOL Run_preopt_dceonly = FALSE;        /* run WHIRL preopt only for dce
> */
>  BOOL Run_ipl = FALSE;              /* run procedure summary phase  */
>  BOOL Run_cg = FALSE;               /* run code generator */
>  BOOL Run_w2c = FALSE;              /* run whirl2c */****
>
> osprey/common/com/config.h    -- 3df7f78..9bdab1d 100644
> --- a/osprey/common/com/config.h
> +++ b/osprey/common/com/config.h
> @@ -732,6 +732,7 @@ extern BOOL Run_lego;               /* run
> lego-lowering */
>  extern BOOL Run_lego_given;         /* was run lego-lowering given/not */
>  extern BOOL Run_wopt;              /* run WHIRL global optimizer */
>  extern BOOL Run_preopt;                    /* run WHIRL preopt optimizer
> */
> +extern BOOL Run_preopt_dceonly;     /* run WHIRL preopt only for dce */
>  extern BOOL Run_cg;                /* run code generator */
>  extern BOOL Run_w2c;               /* run whirl2c */
>  extern BOOL Run_w2f;               /* run whirl2f */****
>
> osprey/driver/special_options.c    -- a65a384..abe35f5 100644
> --- a/osprey/driver/special_options.c
> +++ b/osprey/driver/special_options.c
> @@ -416,13 +416,19 @@ add_special_options (void)
>              *
>              *                          -O0/-O1 -O2             -O3
>              *                          ===========================
> -            *          .B,.I,.P:       cg      wopt/cg         lno/wopt/cg
> -            *          .N:             cg      wopt/cg         wopt/cg
> +            *          .B,.I:          q/cg    wopt/cg         lno/wopt/cg
> +             *          .P:             cg      wopt/cg
> lno/wopt/cg
> +            *          .N:             q/cg    wopt/cg         wopt/cg
>              *          .O:             cg      cg              cg
> +             * q means preopt for dce only.
>              */
>             if (source_kind == S_O)
>                 warning("compiles of WOPT-generated .O files will usually
> fail due to missing state information");
>             if (olevel <= 1 || source_kind == S_O)
> +              if ( source_kind != S_P )
> +              /* bug798 open64.net. add phase q for DCE on O0 .I .B*/****
>
> +                flag = add_string_option(O_PHASE_, "q:c");
> +              else
>                 flag = add_string_option(O_PHASE_, "c");
>             else if (olevel == 2 || source_kind == S_N)
>                 flag = add_string_option(O_PHASE_, "w:c");****
>
>  ****
>
> could a gatekeeper pleae help a review? thanks****
>
>  ****
>
>
> Regards
> Gang****
>
> ** **
>
>
> ------------------------------------------------------------------------------
> Cloud Services Checklist: Pricing and Packaging Optimization
> This white paper is intended to serve as a reference, checklist and point
> of
> discussion for anyone considering optimizing the pricing and packaging
> model
> of a cloud services business. Read Now!
> http://www.accelacomm.com/jaw/sfnl/114/51491232/
> _______________________________________________
> Open64-devel mailing list
> Open64-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/open64-devel
>
> ****
>
> ** **
>
> ** **
>
------------------------------------------------------------------------------
Cloud Services Checklist: Pricing and Packaging Optimization
This white paper is intended to serve as a reference, checklist and point of 
discussion for anyone considering optimizing the pricing and packaging model 
of a cloud services business. Read Now!
http://www.accelacomm.com/jaw/sfnl/114/51491232/
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to