fixed another bug with header blocks, and modified to use existing header
authorceriel <none@none>
Wed, 5 Aug 1987 09:46:38 +0000 (09:46 +0000)
committerceriel <none@none>
Wed, 5 Aug 1987 09:46:38 +0000 (09:46 +0000)
block when possible

util/ego/sr/sr.c
util/ego/sr/sr_reduce.c
util/ego/sr/sr_xform.c

index 51a6ea8..00cea57 100644 (file)
@@ -155,6 +155,27 @@ STATIC opt_proc(p)
 
 
 
+STATIC bblock_p header(lp)
+       loop_p lp;
+{
+       /* Try to determine the 'header' block of loop lp.
+        * If 'e' is the entry block of loop L, then block 'b' is
+        * called the header block of L, iff:
+        *      SUCC(b) = {e} & b dominates e.
+        * If lp has no header block, 0 is returned.
+        */
+
+       bblock_p x = lp->lp_entry->b_idom;
+
+       if (x != (bblock_p) 0 && Lnrelems(x->b_succ) == 1 &&
+           (bblock_p) Lelem(Lfirst(x->b_succ)) == lp->lp_entry) {
+               return x;
+       }
+       return (bblock_p) 0;
+}
+
+
+
 STATIC sr_extproc(p)
        proc_p p;
 {
@@ -167,11 +188,14 @@ STATIC sr_extproc(p)
           pi = Lnext(pi,p->p_loops)) {
                lp = (loop_p) Lelem(pi);
                lp->lp_extend = newsrlpx();
+               lp->LP_HEADER = header(lp);
+               if (lp->LP_HEADER) {
+                       lp->LP_INSTR = last_instr(lp->LP_HEADER);
+               }
        }
 }
 
 
-
 STATIC sr_cleanproc(p)
        proc_p p;
 {
index 2d287ff..a823611 100644 (file)
@@ -146,6 +146,25 @@ STATIC replcode(code,text)
        /* Note that the old code is still accessible via code->co_lfirst */
 }
 
+STATIC line_p add_code(pl, l)
+       line_p pl, l;
+{
+       if (! pl) {
+               PREV(l) = 0;
+       }
+       else {
+               line_p n = pl->l_next;
+
+               DLINK(pl, l);
+               if (n) {
+                       while (l->l_next) l = l->l_next;
+                       DLINK(l, n);
+               }
+               l = pl;
+       }
+       return l;
+}
+
 
 
 STATIC init_code(code,tmp)
@@ -193,21 +212,20 @@ STATIC init_code(code,tmp)
        PREV(l->l_next) = l;
        /* Now insert the code at the end of the header block */
        p = &code->co_loop->LP_INSTR;
-       if (*p == (line_p) 0) {
+       if (*p == (line_p) 0 || (PREV((*p)) == 0 && INSTR((*p)) == op_bra)) {
                /* LP_INSTR points to last instruction of header block,
                 * so if it is 0, the header block is empty yet.
                 */
                code->co_loop->LP_HEADER->b_start =
-                   code->co_lfirst;
-       } else {
-               (*p)->l_next = code->co_lfirst;
-               PREV(code->co_lfirst) = *p;
+                 add_code(code->co_loop->LP_HEADER->b_start, code->co_lfirst);
+       } else if (INSTR((*p)) == op_bra) {
+               add_code(PREV((*p)), code->co_lfirst);
        }
-       *p = l->l_next; /* new last instruction */
+       else    add_code(*p, code->co_lfirst);
+       while (l->l_next) l = l->l_next;
+       *p = l; /* new last instruction */
 }
 
-
-
 STATIC incr_code(code,tmp)
        code_p  code;
        offset  tmp;
index 2b10e0e..977feff 100644 (file)
@@ -116,17 +116,25 @@ STATIC adjust_jump(newtarg,oldtarg,c)
         * start of the new target.
         */
 
-       line_p l;
+       line_p l = last_instr(c);
+
+       assert(l != (line_p) 0);
 
        if (INSTR(oldtarg->b_start) == op_lab) {
                /* If old target has no label, it cannot be jumped to */
-               l = last_instr(c);
-               assert(l != (line_p) 0);
                if (TYPE(l) == OPINSTRLAB &&
                    INSTRLAB(l) == INSTRLAB(oldtarg->b_start)) {
                        INSTRLAB(l) = label(newtarg);
                }
        }
+
+       if (c->b_next == oldtarg && INSTR(l) != op_bra) {
+               line_p new = newline(OPINSTRLAB);
+
+               INSTRLAB(new) = label(newtarg);
+               new->l_instr = op_bra;
+               DLINK(l, new);
+       }
 }