re PR target/54938 (sh libgcc_unpack_df.o fails to build: ../../../srcw/libgcc/fp...
authorEaswaran Raman <eraman@google.com>
Wed, 31 Oct 2012 23:28:45 +0000 (23:28 +0000)
committerEaswaran Raman <eraman@gcc.gnu.org>
Wed, 31 Oct 2012 23:28:45 +0000 (23:28 +0000)
2012-10-31   Easwaran Raman  <eraman@google.com>

PR target/54938
PR middle-end/54957
* optabs.c (emit_cmp_and_jump_insn_1): Add REG_BR_PROB note
only if it doesn't already exist.
* stmt.c (get_outgoing_edge_probs): Return 0 if BB is NULL.
(emit_case_dispatch_table): Handle the case where STMT_BB is
NULL.
(expand_sjlj_dispatch_table): Pass BB containing before_case
to emit_case_dispatch_table.

From-SVN: r193052

gcc/ChangeLog
gcc/optabs.c
gcc/stmt.c

index ead3e1ae632ad7cd5a2c4e75615289b1f7330438..21fd7265c6e6940c175f90a3224620f2522c51f1 100644 (file)
@@ -1,3 +1,15 @@
+2012-10-31   Easwaran Raman  <eraman@google.com>
+
+       PR target/54938
+       PR middle-end/54957
+       * optabs.c (emit_cmp_and_jump_insn_1): Add REG_BR_PROB note
+       only if it doesn't already exist.
+       * stmt.c (get_outgoing_edge_probs): Return 0 if BB is NULL.
+       (emit_case_dispatch_table): Handle the case where STMT_BB is
+       NULL.
+       (expand_sjlj_dispatch_table): Pass BB containing before_case
+       to emit_case_dispatch_table.
+
 2012-10-31  Lawrence Crowl  <crowl@google.com>
 
        * is-a.h: New.
index e22031615fac49016df4a5219841edea76d7c661..bba93c2d5618d1fdcc85a6a89ddc6258476a260d 100644 (file)
@@ -4268,11 +4268,9 @@ emit_cmp_and_jump_insn_1 (rtx test, enum machine_mode mode, rtx label, int prob)
       && profile_status != PROFILE_ABSENT
       && insn
       && JUMP_P (insn)
-      && any_condjump_p (insn))
-    {
-      gcc_assert (!find_reg_note (insn, REG_BR_PROB, 0));
-      add_reg_note (insn, REG_BR_PROB, GEN_INT (prob));
-    }
+      && any_condjump_p (insn)
+      && !find_reg_note (insn, REG_BR_PROB, 0))
+    add_reg_note (insn, REG_BR_PROB, GEN_INT (prob));
 }
 
 /* Generate code to compare X with Y so that the condition codes are
index 14a28abcc58a2246881d373803b18245d47596a8..b84fa670e70e55f21ab895f134bd760a963cbcf8 100644 (file)
@@ -1867,6 +1867,8 @@ get_outgoing_edge_probs (basic_block bb)
   edge e;
   edge_iterator ei;
   int prob_sum = 0;
+  if (!bb)
+    return 0;
   FOR_EACH_EDGE(e, ei, bb->succs)
     prob_sum += e->probability;
   return prob_sum;
@@ -1916,8 +1918,8 @@ emit_case_dispatch_table (tree index_expr, tree index_type,
   rtx fallback_label = label_rtx (case_list->code_label);
   rtx table_label = gen_label_rtx ();
   bool has_gaps = false;
-  edge default_edge = EDGE_SUCC(stmt_bb, 0);
-  int default_prob = default_edge->probability;
+  edge default_edge = stmt_bb ? EDGE_SUCC(stmt_bb, 0) : NULL;
+  int default_prob = default_edge ? default_edge->probability : 0;
   int base = get_outgoing_edge_probs (stmt_bb);
   bool try_with_tablejump = false;
 
@@ -1997,7 +1999,8 @@ emit_case_dispatch_table (tree index_expr, tree index_type,
       default_prob = 0;
     }
 
-  default_edge->probability = default_prob;
+  if (default_edge)
+    default_edge->probability = default_prob;
 
   /* We have altered the probability of the default edge. So the probabilities
      of all other edges need to be adjusted so that it sums up to
@@ -2289,7 +2292,8 @@ expand_sjlj_dispatch_table (rtx dispatch_index,
 
       emit_case_dispatch_table (index_expr, index_type,
                                case_list, default_label,
-                               minval, maxval, range, NULL);
+                               minval, maxval, range,
+                                BLOCK_FOR_INSN (before_case));
       emit_label (default_label);
       free_alloc_pool (case_node_pool);
     }