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