OSDN Git Service

PR libgomp/32468
[pf3gnuchains/gcc-fork.git] / gcc / df-problems.c
index dc5270e..f286f4f 100644 (file)
@@ -46,6 +46,9 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 #include "dce.h"
 #include "vecprim.h"
 
+/* Note that turning REG_DEAD_DEBUGGING on will cause
+   gcc.c-torture/unsorted/dump-noaddr.c to fail because it prints
+   addresses in the dumps.  */  
 #if 0
 #define REG_DEAD_DEBUGGING
 #endif
@@ -331,6 +334,7 @@ df_ru_alloc (bitmap all_blocks)
          bb_info->out = BITMAP_ALLOC (&problem_data->ru_bitmaps);
        }
     }
+  df_ru->optional_p = true;
 }
 
 
@@ -711,7 +715,8 @@ static struct df_problem problem_RU =
   NULL,                       /* Incremental solution verify start.  */
   NULL,                       /* Incremental solution verfiy end.  */
   NULL,                       /* Dependent problem.  */
-  TV_DF_RU                    /* Timing variable.  */ 
+  TV_DF_RU,                   /* Timing variable.  */
+  true                        /* Reset blocks on dropping out of blocks_to_analyze.  */
 };
 
 
@@ -841,6 +846,7 @@ df_rd_alloc (bitmap all_blocks)
          bb_info->out = BITMAP_ALLOC (&problem_data->rd_bitmaps);
        }
     }
+  df_rd->optional_p = true;
 }
 
 
@@ -1207,7 +1213,8 @@ static struct df_problem problem_RD =
   NULL,                       /* Incremental solution verify start.  */
   NULL,                       /* Incremental solution verfiy end.  */
   NULL,                       /* Dependent problem.  */
-  TV_DF_RD                    /* Timing variable.  */ 
+  TV_DF_RD,                   /* Timing variable.  */ 
+  true                        /* Reset blocks on dropping out of blocks_to_analyze.  */
 };
 
 
@@ -1320,6 +1327,8 @@ df_lr_alloc (bitmap all_blocks ATTRIBUTE_UNUSED)
           bb_info->ause = NULL;
        }
     }
+
+  df_lr->optional_p = false;
 }
 
 
@@ -1478,6 +1487,13 @@ df_lr_bb_local_compute (unsigned int bb_index)
        }
     }
 #endif
+
+  /* If the df_live problem is not defined, such as at -O0 and -O1, we
+     still need to keep the luids up to date.  This is normally done
+     in the df_live problem since this problem has a forwards
+     scan.  */
+  if (!df_live)
+    df_recompute_luids (bb);
 }
 
 
@@ -1818,7 +1834,8 @@ static struct df_problem problem_LR =
   df_lr_verify_solution_start,/* Incremental solution verify start.  */
   df_lr_verify_solution_end,  /* Incremental solution verify end.  */
   NULL,                       /* Dependent problem.  */
-  TV_DF_LR                    /* Timing variable.  */ 
+  TV_DF_LR,                   /* Timing variable.  */ 
+  false                       /* Reset blocks on dropping out of blocks_to_analyze.  */
 };
 
 
@@ -2016,6 +2033,7 @@ df_live_alloc (bitmap all_blocks ATTRIBUTE_UNUSED)
          bb_info->out = BITMAP_ALLOC (NULL);
        }
     }
+  df_live->optional_p = (optimize <= 1);
 }
 
 
@@ -2368,7 +2386,8 @@ static struct df_problem problem_LIVE =
   df_live_verify_solution_start,/* Incremental solution verify start.  */
   df_live_verify_solution_end,  /* Incremental solution verify end.  */
   &problem_LR,                  /* Dependent problem.  */
-  TV_DF_LIVE                    /* Timing variable.  */ 
+  TV_DF_LIVE,                   /* Timing variable.  */
+  false                         /* Reset blocks on dropping out of blocks_to_analyze.  */
 };
 
 
@@ -2386,6 +2405,19 @@ df_live_add_problem (void)
 }
 
 
+/* Set all of the blocks as dirty.  This needs to be done if this
+   problem is added after all of the insns have been scanned.  */
+
+void
+df_live_set_all_dirty (void)
+{
+  basic_block bb;
+  FOR_ALL_BB (bb)
+    bitmap_set_bit (df_live->out_of_date_transfer_functions, 
+                   bb->index);
+}
+
+
 /* Verify that all of the lr related info is consistent and
    correct.  */
 
@@ -2555,6 +2587,7 @@ df_urec_alloc (bitmap all_blocks)
          bb_info->earlyclobber = BITMAP_ALLOC (NULL);
        }
     }
+  df_urec->optional_p = true;
 }
 
 
@@ -3041,7 +3074,8 @@ static struct df_problem problem_UREC =
   NULL,                       /* Incremental solution verify start.  */
   NULL,                       /* Incremental solution verfiy end.  */
   &problem_LR,                /* Dependent problem.  */
-  TV_DF_UREC                  /* Timing variable.  */ 
+  TV_DF_UREC,                 /* Timing variable.  */ 
+  false                       /* Reset blocks on dropping out of blocks_to_analyze.  */
 };
 
 
@@ -3213,6 +3247,7 @@ df_chain_alloc (bitmap all_blocks ATTRIBUTE_UNUSED)
   df_chain_remove_problem ();
   df_chain->block_pool = create_alloc_pool ("df_chain_block pool", 
                                         sizeof (struct df_link), 50);
+  df_chain->optional_p = true;
 }
 
 
@@ -3520,7 +3555,8 @@ static struct df_problem problem_CHAIN =
   NULL,                       /* Incremental solution verify start.  */
   NULL,                       /* Incremental solution verfiy end.  */
   &problem_RD,                /* Dependent problem.  */
-  TV_DF_CHAIN                 /* Timing variable.  */ 
+  TV_DF_CHAIN,                /* Timing variable.  */
+  false                       /* Reset blocks on dropping out of blocks_to_analyze.  */
 };
 
 
@@ -3543,6 +3579,12 @@ df_chain_add_problem (enum df_chain_flags chain_flags)
    This pass computes REG_DEAD and REG_UNUSED notes.
    ----------------------------------------------------------------------------*/
 
+static void 
+df_note_alloc (bitmap all_blocks ATTRIBUTE_UNUSED)
+{
+  df_note->optional_p = true;
+}
+
 #ifdef REG_DEAD_DEBUGGING
 static void 
 df_print_note (const char *prefix, rtx insn, rtx note)
@@ -3715,11 +3757,10 @@ df_set_unused_notes_for_mw (rtx insn, rtx old, struct df_mw_hardreg *mws,
       /* Only do this if the value is totally dead.  */
     }
   else
-    for (r=mws->start_regno; r <= mws->end_regno; r++)
+    for (r = mws->start_regno; r <= mws->end_regno; r++)
       {
-       
-       if ((!bitmap_bit_p (live, r))
-           && (!bitmap_bit_p (artificial_uses, r)))
+       if (!bitmap_bit_p (live, r)
+           && !bitmap_bit_p (artificial_uses, r))
          {
            old = df_set_note (REG_UNUSED, insn, old, regno_reg_rtx[r]);
 #ifdef REG_DEAD_DEBUGGING
@@ -3781,17 +3822,15 @@ df_set_dead_notes_for_mw (rtx insn, rtx old, struct df_mw_hardreg *mws,
   else
     {
       for (r = mws->start_regno; r <= mws->end_regno; r++)
-       {
-         if ((!bitmap_bit_p (live, r))
-             && (!bitmap_bit_p (artificial_uses, r))
-             && (!bitmap_bit_p (do_not_gen, r)))
-           {
-             old = df_set_note (REG_DEAD, insn, old, regno_reg_rtx[r]);
+       if (!bitmap_bit_p (live, r)
+           && !bitmap_bit_p (artificial_uses, r)
+           && !bitmap_bit_p (do_not_gen, r))
+         {
+           old = df_set_note (REG_DEAD, insn, old, regno_reg_rtx[r]);
 #ifdef REG_DEAD_DEBUGGING
-             df_print_note ("adding 2: ", insn, REG_NOTES (insn));
+           df_print_note ("adding 2: ", insn, REG_NOTES (insn));
 #endif
-           }
-       }
+         }
     }
   return old;
 }
@@ -3921,8 +3960,8 @@ df_note_bb_compute (unsigned int bb_index,
              df_print_regset (dump_file, live);
            }
 #endif
-         /* We only care about real sets for calls.  Clobbers only
-            may clobbers cannot be depended on.  */
+         /* We only care about real sets for calls.  Clobbers cannot
+            be depended on to really die.  */
          mws_rec = DF_INSN_UID_MWS (uid);
          while (*mws_rec)
            {
@@ -3946,6 +3985,12 @@ df_note_bb_compute (unsigned int bb_index,
                  = df_create_unused_note (insn, old_unused_notes, 
                                           def, live, do_not_gen, 
                                           artificial_uses);
+
+             /* However a may or must clobber still needs to kill the
+                reg so that REG_DEAD notes are later placed
+                appropriately.  */ 
+             else 
+               bitmap_clear_bit (live, DF_REF_REGNO (def));
            }
        }
       else
@@ -4077,7 +4122,7 @@ static struct df_problem problem_NOTE =
 {
   DF_NOTE,                    /* Problem id.  */
   DF_NONE,                    /* Direction.  */
-  NULL,                       /* Allocate the problem specific data.  */
+  df_note_alloc,              /* Allocate the problem specific data.  */
   NULL,                       /* Reset global information.  */
   NULL,                       /* Free basic block info.  */
   df_note_compute,            /* Local compute function.  */
@@ -4099,7 +4144,8 @@ static struct df_problem problem_NOTE =
      but it will produce information if built one of uninitialized
      register problems (UR, UREC) is also run.  */
   &problem_LR,                /* Dependent problem.  */
-  TV_DF_NOTE                  /* Timing variable.  */ 
+  TV_DF_NOTE,                 /* Timing variable.  */
+  false                       /* Reset blocks on dropping out of blocks_to_analyze.  */
 };