comparison lwasm/pass4.c @ 201:4503199d56ba

Short circuit unneeded loops in pass4 Added debugging messages to deduce why pass4.c ran so slow. Short circuit unneeded looping yields approx. 70% reduction in execution time.
author William Astle <lost@l-w.ca>
date Fri, 16 Mar 2012 22:22:14 -0600
parents 348e2816ce32
children 8beb109dfd69
comparison
equal deleted inserted replaced
200:348e2816ce32 201:4503199d56ba
54 debug_message(as, 60, "%d unresolved instructions", cnt); 54 debug_message(as, 60, "%d unresolved instructions", cnt);
55 55
56 // find an unresolved instruction 56 // find an unresolved instruction
57 for ( ; sl && sl -> len != -1; sl = sl -> next) 57 for ( ; sl && sl -> len != -1; sl = sl -> next)
58 { 58 {
59 debug_message(as, 200, "Search line %p", sl);
59 as -> cl = sl; 60 as -> cl = sl;
60 lwasm_reduce_expr(as, sl -> addr); 61 lwasm_reduce_expr(as, sl -> addr);
61 lwasm_reduce_expr(as, sl -> daddr); 62 lwasm_reduce_expr(as, sl -> daddr);
62 63
63 // simplify each expression 64 // simplify each expression
64 for (le = sl -> exprs; le; le = le -> next) 65 for (le = sl -> exprs; le; le = le -> next)
65 lwasm_reduce_expr(as, le -> expr); 66 lwasm_reduce_expr(as, le -> expr);
66 } 67 }
67 68
69 debug_message(as, 200, "Found line %p", sl);
68 // simplify address 70 // simplify address
69 as -> cl = sl; 71 as -> cl = sl;
70 lwasm_reduce_expr(as, sl -> addr); 72 lwasm_reduce_expr(as, sl -> addr);
71 lwasm_reduce_expr(as, sl -> daddr); 73 lwasm_reduce_expr(as, sl -> daddr);
72 74
76 78
77 79
78 if (sl -> len == -1 && sl -> insn >= 0 && instab[sl -> insn].resolve) 80 if (sl -> len == -1 && sl -> insn >= 0 && instab[sl -> insn].resolve)
79 { 81 {
80 (instab[sl -> insn].resolve)(as, sl, 1); 82 (instab[sl -> insn].resolve)(as, sl, 1);
83 debug_message(as, 200, "Try resolve = %d/%d", sl -> len, sl -> dlen);
81 if (force && sl -> len == -1 && sl -> dlen == -1) 84 if (force && sl -> len == -1 && sl -> dlen == -1)
82 { 85 {
83 lwasm_register_error(as, sl, "Instruction failed to resolve."); 86 lwasm_register_error(as, sl, "Instruction failed to resolve.");
84 return; 87 return;
85 } 88 }
86 } 89 }
87 cnt--; 90 if (sl -> len != -1 && sl -> dlen != -1)
88 if (cnt == 0) 91 {
89 return; 92 cnt--;
93 if (cnt == 0)
94 return;
95
96 // this one resolved - try looking for the next one instead
97 // of wasting time running through the rest of the lines
98 continue;
99 }
90 100
91 do 101 do
92 { 102 {
103 debug_message(as, 200, "Flatten after...");
93 rc = 0; 104 rc = 0;
94 for (cl = sl; cl; cl = cl -> next) 105 for (cl = sl; cl; cl = cl -> next)
95 { 106 {
107 debug_message(as, 200, "Flatten line %p", cl);
96 as -> cl = cl; 108 as -> cl = cl;
97 109
98 // simplify address 110 // simplify address
99 lwasm_reduce_expr(as, cl -> addr); 111 lwasm_reduce_expr(as, cl -> addr);
100 lwasm_reduce_expr(as, cl -> daddr); 112 lwasm_reduce_expr(as, cl -> daddr);
114 if (cl -> len == 0) 126 if (cl -> len == 0)
115 cl -> len = cl -> dlen; 127 cl -> len = cl -> dlen;
116 else 128 else
117 cl -> dlen = cl -> len; 129 cl -> dlen = cl -> len;
118 } 130 }
131 debug_message(as, 200, "Flatten resolve returns %d", cl -> len);
119 if (cl -> len != -1 && cl -> dlen != -1) 132 if (cl -> len != -1 && cl -> dlen != -1)
120 { 133 {
121 rc++; 134 rc++;
122 cnt--; 135 cnt--;
123 if (cnt == 0) 136 if (cnt == 0)