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

Reply via email to