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