I am not a gatekeeper, but excuse me, I wonder if why not do such kind of
stuff with WGEN.
Regards,
Yiran
On Tue, Dec 6, 2011 at 6:53 PM, Gang Yu <yugang...@gmail.com> wrote:
> 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