Daily bump.
[gcc.git] / gcc / tree-ssa-pre.c
index 6e86024917b25ae0e970ac3e76e160586bdae53e..e5ec931b96fd5f663c9ec9984ea015721b3e108c 100644 (file)
@@ -2792,6 +2792,23 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref,
        return folded;
       }
       break;
+    case WITH_SIZE_EXPR:
+      {
+       tree genop0 = create_component_ref_by_pieces_1 (block, ref, operand,
+                                                       stmts, domstmt);
+       pre_expr op1expr = get_or_alloc_expr_for (currop->op0);
+       tree genop1;
+
+       if (!genop0)
+         return NULL_TREE;
+
+       genop1 = find_or_generate_expression (block, op1expr, stmts, domstmt);
+       if (!genop1)
+         return NULL_TREE;
+
+       return fold_build2 (currop->opcode, currop->type, genop0, genop1);
+      }
+      break;
     case BIT_FIELD_REF:
       {
        tree folded;
@@ -4194,6 +4211,7 @@ eliminate (void)
              tree sprime = NULL;
              pre_expr lhsexpr = get_or_alloc_expr_for_name (lhs);
              pre_expr sprimeexpr;
+             gimple orig_stmt = stmt;
 
              sprimeexpr = bitmap_find_leader (AVAIL_OUT (b),
                                               get_expr_value_id (lhsexpr),
@@ -4231,6 +4249,16 @@ eliminate (void)
                  propagate_tree_value_into_stmt (&gsi, sprime);
                  stmt = gsi_stmt (gsi);
                  update_stmt (stmt);
+
+                 /* If we removed EH side-effects from the statement, clean
+                    its EH information.  */
+                 if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
+                   {
+                     bitmap_set_bit (need_eh_cleanup,
+                                     gimple_bb (stmt)->index);
+                     if (dump_file && (dump_flags & TDF_DETAILS))
+                       fprintf (dump_file, "  Removed EH side-effects.\n");
+                   }
                  continue;
                }
 
@@ -4286,7 +4314,7 @@ eliminate (void)
 
                  /* If we removed EH side-effects from the statement, clean
                     its EH information.  */
-                 if (maybe_clean_or_replace_eh_stmt (stmt, stmt))
+                 if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
                    {
                      bitmap_set_bit (need_eh_cleanup,
                                      gimple_bb (stmt)->index);
@@ -4530,8 +4558,10 @@ eliminate (void)
          gsi = gsi_for_stmt (stmt);
          unlink_stmt_vdef (stmt);
          gsi_remove (&gsi, true);
-         if (gimple_purge_dead_eh_edges (bb))
-           todo |= TODO_cleanup_cfg;
+         /* ???  gsi_remove doesn't tell us whether the stmt was
+            in EH tables and thus whether we need to purge EH edges.
+            Simply schedule the block for a cleanup.  */
+         bitmap_set_bit (need_eh_cleanup, bb->index);
          if (TREE_CODE (lhs) == SSA_NAME)
            bitmap_clear_bit (inserted_exprs, SSA_NAME_VERSION (lhs));
          release_defs (stmt);
@@ -4806,6 +4836,9 @@ init_pre (bool do_fre)
 static void
 fini_pre (bool do_fre)
 {
+  bool do_eh_cleanup = !bitmap_empty_p (need_eh_cleanup);
+  bool do_ab_cleanup = !bitmap_empty_p (need_ab_cleanup);
+
   free (postorder);
   VEC_free (bitmap_set_t, heap, value_expressions);
   BITMAP_FREE (inserted_exprs);
@@ -4821,22 +4854,18 @@ fini_pre (bool do_fre)
 
   free_dominance_info (CDI_POST_DOMINATORS);
 
-  if (!bitmap_empty_p (need_eh_cleanup))
-    {
-      gimple_purge_all_dead_eh_edges (need_eh_cleanup);
-      cleanup_tree_cfg ();
-    }
-
-  BITMAP_FREE (need_eh_cleanup);
+  if (do_eh_cleanup)
+    gimple_purge_all_dead_eh_edges (need_eh_cleanup);
 
-  if (!bitmap_empty_p (need_ab_cleanup))
-    {
-      gimple_purge_all_dead_abnormal_call_edges (need_ab_cleanup);
-      cleanup_tree_cfg ();
-    }
+  if (do_ab_cleanup)
+    gimple_purge_all_dead_abnormal_call_edges (need_ab_cleanup);
 
+  BITMAP_FREE (need_eh_cleanup);
   BITMAP_FREE (need_ab_cleanup);
 
+  if (do_eh_cleanup || do_ab_cleanup)
+    cleanup_tree_cfg ();
+
   if (!do_fre)
     loop_optimizer_finalize ();
 }