]> gcc.gnu.org Git - gcc.git/blobdiff - gcc/loop-doloop.c
backport: basic-block.h: Include vec.h, errors.h.
[gcc.git] / gcc / loop-doloop.c
index 0396957c0f1d118975fc7bc70160f9c4792bf1cf..1b5ca4dc6d22fa2228598bfa79113e7ead9c0ff3 100644 (file)
@@ -129,7 +129,7 @@ doloop_condition_get (rtx pattern)
     return condition;
 
   /* ??? If a machine uses a funny comparison, we could return a
-     canonicalised form here.  */
+     canonicalized form here.  */
 
   return 0;
 }
@@ -144,6 +144,7 @@ doloop_valid_p (struct loop *loop, struct niter_desc *desc)
   basic_block *body = get_loop_body (loop), bb;
   rtx insn;
   unsigned i;
+  bool result = true;
 
   /* Check for loops that may not terminate under special conditions.  */
   if (!desc->simple_p
@@ -174,7 +175,8 @@ doloop_valid_p (struct loop *loop, struct niter_desc *desc)
         enable count-register loops in this case.  */
       if (dump_file)
        fprintf (dump_file, "Doloop: Possible infinite iteration case.\n");
-      return false;
+      result = false;
+      goto cleanup;
     }
 
   for (i = 0; i < loop->num_nodes; i++)
@@ -187,28 +189,33 @@ doloop_valid_p (struct loop *loop, struct niter_desc *desc)
        {
          /* A called function may clobber any special registers required for
             low-overhead looping.  */
-         if (GET_CODE (insn) == CALL_INSN)
+         if (CALL_P (insn))
            {
              if (dump_file)
                fprintf (dump_file, "Doloop: Function call in loop.\n");
-             return false;
+             result = false;
+             goto cleanup;
            }
 
          /* Some targets (eg, PPC) use the count register for branch on table
             instructions.  ??? This should be a target specific check.  */
-         if (GET_CODE (insn) == JUMP_INSN
+         if (JUMP_P (insn)
              && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
                  || GET_CODE (PATTERN (insn)) == ADDR_VEC))
            {
              if (dump_file)
                fprintf (dump_file, "Doloop: Computed branch in the loop.\n");
-             return false;
+             result = false;
+             goto cleanup;
            }
        }
     }
+  result = true;
+
+cleanup:
   free (body);
 
-  return true;
+  return result;
 }
 
 /* Adds test of COND jumping to DEST to the end of BB.  */
@@ -285,7 +292,7 @@ doloop_modify (struct loop *loop, struct niter_desc *desc,
   if (GET_CODE (counter_reg) == PLUS)
     counter_reg = XEXP (counter_reg, 0);
 
-  count = desc->niter_expr;
+  count = copy_rtx (desc->niter_expr);
   increment_count = false;
   switch (GET_CODE (condition))
     {
@@ -338,7 +345,7 @@ doloop_modify (struct loop *loop, struct niter_desc *desc,
 
   if (desc->noloop_assumptions)
     {
-      rtx ass = desc->noloop_assumptions;
+      rtx ass = copy_rtx (desc->noloop_assumptions);
       basic_block preheader = loop_preheader_edge (loop)->src;
       basic_block set_zero
              = loop_split_edge_with (loop_preheader_edge (loop), NULL_RTX);
@@ -351,11 +358,11 @@ doloop_modify (struct loop *loop, struct niter_desc *desc,
       /* Expand the condition testing the assumptions and if it does not pass,
         reset the count register to 0.  */
       add_test (XEXP (ass, 0), preheader, set_zero);
-      preheader->succ->flags &= ~EDGE_FALLTHRU;
-      cnt = preheader->succ->count;
-      preheader->succ->probability = 0;
-      preheader->succ->count = 0;
-      irr = preheader->succ->flags & EDGE_IRREDUCIBLE_LOOP;
+      EDGE_SUCC (preheader, 0)->flags &= ~EDGE_FALLTHRU;
+      cnt = EDGE_SUCC (preheader, 0)->count;
+      EDGE_SUCC (preheader, 0)->probability = 0;
+      EDGE_SUCC (preheader, 0)->count = 0;
+      irr = EDGE_SUCC (preheader, 0)->flags & EDGE_IRREDUCIBLE_LOOP;
       te = make_edge (preheader, new_preheader, EDGE_FALLTHRU | irr);
       te->probability = REG_BR_PROB_BASE;
       te->count = cnt;
@@ -367,7 +374,7 @@ doloop_modify (struct loop *loop, struct niter_desc *desc,
       for (ass = XEXP (ass, 1); ass; ass = XEXP (ass, 1))
        {
          bb = loop_split_edge_with (te, NULL_RTX);
-         te = bb->succ;
+         te = EDGE_SUCC (bb, 0);
          add_test (XEXP (ass, 0), bb, set_zero);
          make_edge (bb, set_zero, irr);
        }
@@ -507,7 +514,7 @@ doloop_optimize (struct loop *loop)
     {
       while (NEXT_INSN (doloop_pat) != NULL_RTX)
        doloop_pat = NEXT_INSN (doloop_pat);
-      if (GET_CODE (doloop_pat) == JUMP_INSN)
+      if (JUMP_P (doloop_pat))
        doloop_pat = PATTERN (doloop_pat);
       else
        doloop_pat = NULL_RTX;
This page took 0.033506 seconds and 5 git commands to generate.