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