]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: add debugging to liveness analysis
authorRuss Cox <rsc@golang.org>
Wed, 11 Feb 2015 00:27:49 +0000 (19:27 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 13 Feb 2015 17:30:24 +0000 (17:30 +0000)
Even with debugmerge = 1, the debugging output only happens
with the -v command-line flag. This is useful because it gets added
in automatically when debugging things like registerization with -R -v.

Change-Id: I9a5c7f562507b72e8e2fe2686fd07d069721345a
Reviewed-on: https://go-review.googlesource.com/4641
Reviewed-by: Austin Clements <austin@google.com>
src/cmd/gc/popt.c

index 11ade8fd91ab10acb27f1416e47e652642125fb2..16bbe438237dbe13a4120153a52291f97558f612 100644 (file)
@@ -567,7 +567,7 @@ mergetemp(Prog *firstp)
        int32 gen;
        Graph *g;
 
-       enum { Debug = 0 };
+       enum { debugmerge = 1 };
 
        g = flowstart(firstp, 0);
        if(g == nil)
@@ -615,7 +615,7 @@ mergetemp(Prog *firstp)
                }
        }
        
-       if(Debug > 1)
+       if(debugmerge > 1 && debug['v'])
                arch.dumpit("before", g->start, 0);
        
        nkill = 0;
@@ -632,7 +632,7 @@ mergetemp(Prog *firstp)
                                p->as = ANOP;
                                p->to = zprog.to;
                                v->removed = 1;
-                               if(Debug)
+                               if(debugmerge > 0 && debug['v'])
                                        print("drop write-only %S\n", v->node->sym);
                        } else
                                fatal("temp used and not set: %P", p);
@@ -656,7 +656,7 @@ mergetemp(Prog *firstp)
                                p1->from = p->from;
                                arch.excise(f);
                                v->removed = 1;
-                               if(Debug)
+                               if(debugmerge > 0 && debug['v'])
                                        print("drop immediate-use %S\n", v->node->sym);
                        }
                        nkill++;
@@ -696,6 +696,9 @@ mergetemp(Prog *firstp)
        nfree = nvar;
        for(i=0; i<nvar; i++) {
                v = bystart[i];
+               if(debugmerge > 0 && debug['v'])
+                       print("consider %#N: removed=%d\n", v->node, v->removed);
+                       
                if(v->removed)
                        continue;
 
@@ -705,10 +708,14 @@ mergetemp(Prog *firstp)
                        inuse[--nfree] = v1;
                }
 
+               if(debugmerge > 0 && debug['v'])
+                       print("consider %#N: removed=%d nfree=%d nvar=%d\n", v->node, v->removed, nfree, nvar);
                // Find old temp to reuse if possible.
                t = v->node->type;
                for(j=nfree; j<nvar; j++) {
                        v1 = inuse[j];
+                       if(debugmerge > 0 && debug['v'])
+                               print("consider %#N: maybe %#N: type=%T,%T addrtaken=%d,%d\n", v->node, v1->node, t, v1->node->type, v->node->addrtaken, v1->node->addrtaken);
                        // Require the types to match but also require the addrtaken bits to match.
                        // If a variable's address is taken, that disables registerization for the individual
                        // words of the variable (for example, the base,len,cap of a slice).
@@ -734,7 +741,7 @@ mergetemp(Prog *firstp)
                inuse[j] = v;
        }
 
-       if(Debug) {
+       if(debugmerge > 0 && debug['v']) {
                print("%S [%d - %d]\n", curfn->nname->sym, nvar, nkill);
                for(v=var; v<var+nvar; v++) {
                        print("var %#N %T %lld-%lld", v->node, v->node->type, v->start, v->end);
@@ -744,12 +751,12 @@ mergetemp(Prog *firstp)
                                print(" dead=1");
                        if(v->merge)
                                print(" merge %#N", v->merge->node);
-                       if(v->start == v->end)
+                       if(v->start == v->end && v->def != nil)
                                print(" %P", v->def->prog);
                        print("\n");
                }
        
-               if(Debug > 1)
+               if(debugmerge > 1 && debug['v'])
                        arch.dumpit("after", g->start, 0);
        }