10 * complete R structure
13 for(r=firstr; r!=R; r=r1) {
44 for(r=firstr; r!=R; r=r->link) {
46 if(p->as == AMOVW || p->as == AMOVF || p->as == AMOVD)
49 if(p->from.type == p->to.type) {
54 if(subprop(r) && copyprop(r)) {
60 if(p->to.type == D_REG) {
67 if(subprop(r) && copyprop(r)) {
77 * look for MOVB x,R; MOVB R,R
79 for(r=firstr; r!=R; r=r->link) {
88 if(p->to.type != D_REG)
98 if(p1->from.type != D_REG || p1->from.reg != p->to.reg)
100 if(p1->to.type != D_REG || p1->to.reg != p->to.reg)
113 p->from = zprog.from;
115 p->reg = zprog.reg; /**/
126 if(r1 == R || r1->p2link != R)
154 if(a->type == D_CONST)
168 if(a->type == D_REG) {
173 if(a->type == D_FREG)
179 * the idea is to substitute
180 * one register for another
181 * from one MOV to another
183 * ADD b, R0 / no use of R1
185 * would be converted to
189 * hopefully, then the former or latter MOV
190 * will be eliminated by copy propagation.
207 for(r=uniqp(r0); r!=R; r=uniqp(r)) {
241 if(p->to.type == v1->type)
242 if(p->to.reg == v1->reg) {
252 if(p->to.type == v1->type)
253 if(p->to.reg == v1->reg)
257 if(copyau(&p->from, v2) ||
261 if(copysub(&p->from, v1, v2, 0) ||
262 copysub1(p, v1, v2, 0) ||
263 copysub(&p->to, v1, v2, 0))
269 copysub(&p->to, v1, v2, 1);
271 print("gotit: %D->%D\n%P", v1, v2, r->prog);
272 if(p->from.type == v2->type)
276 for(r=uniqs(r); r!=r0; r=uniqs(r)) {
278 copysub(&p->from, v1, v2, 1);
279 copysub1(p, v1, v2, 1);
280 copysub(&p->to, v1, v2, 1);
282 print("%P\n", r->prog);
288 print("%P last\n", r->prog);
293 * The idea is to remove redundant copies.
302 * set v2 return success
316 for(r=firstr; r!=R; r=r->link)
318 return copy1(v1, v2, r0->s1, 0);
322 copy1(Adr *v1, Adr *v2, Reg *r, int f)
329 print("act set; return 1\n");
334 print("copy %D->%D f=%d\n", v1, v2, f);
335 for(; r != R; r = r->s1) {
339 if(!f && uniqp(r) == R) {
342 print("; merge; f=%d", f);
346 case 2: /* rar, cant split */
348 print("; %Drar; return 0\n", v2);
353 print("; %Dset; return 1\n", v2);
356 case 1: /* used, substitute */
357 case 4: /* use and set */
362 print("; %Dused+set and f=%d; return 0\n", v2, f);
364 print("; %Dused and f=%d; return 0\n", v2, f);
367 if(copyu(p, v2, v1)) {
369 print("; sub fail; return 0\n");
373 print("; sub%D/%D", v2, v1);
376 print("; %Dused+set; return 1\n", v2);
383 if(!f && (t == 2 || t == 3 || t == 4)) {
386 print("; %Dset and !f; f=%d", v1, f);
392 if(!copy1(v1, v2, r->s2, f))
400 * 1 if v only used (and substitute),
401 * 2 if read-alter-rewrite
404 * 0 otherwise (not touched)
406 copyu(Prog *p, Adr *v, Adr *s)
417 case ANOP: /* read, write */
430 if(copysub(&p->from, v, s, 1))
432 if(!copyas(&p->to, v))
433 if(copysub(&p->to, v, s, 1))
437 if(copyas(&p->to, v)) {
438 if(copyau(&p->from, v))
442 if(copyau(&p->from, v))
444 if(copyau(&p->to, v))
448 case ASGT: /* read, read, write */
476 if(copysub(&p->from, v, s, 1))
478 if(copysub1(p, v, s, 1))
480 if(!copyas(&p->to, v))
481 if(copysub(&p->to, v, s, 1))
485 if(copyas(&p->to, v)) {
488 if(copyau(&p->from, v))
494 if(copyau(&p->from, v))
498 if(copyau(&p->to, v))
502 case ABEQ: /* read, read */
518 if(copysub(&p->from, v, s, 1))
520 return copysub1(p, v, s, 1);
522 if(copyau(&p->from, v))
528 case AJMP: /* funny */
530 if(copysub(&p->to, v, s, 1))
534 if(copyau(&p->to, v))
538 case ARET: /* funny */
542 if(v->type == D_FREG)
543 if(v->reg == FREGRET)
546 case AJAL: /* funny */
547 if(v->type == D_REG) {
548 if(v->reg <= REGEXT && v->reg > exregoffset)
550 if(REGARG && v->reg == REGARG)
553 if(v->type == D_FREG)
554 if(v->reg <= FREGEXT && v->reg > exfregoffset)
558 if(copysub(&p->to, v, s, 1))
562 if(copyau(&p->to, v))
566 case ATEXT: /* funny */
627 * could be set/use depending on
631 copyas(Adr *a, Adr *v)
635 if(a->type == v->type)
642 * either direct or indirect
645 copyau(Adr *a, Adr *v)
651 if(a->type == D_OREG)
658 copyau1(Prog *p, Adr *v)
662 if(p->from.type == v->type || p->to.type == v->type)
663 if(p->reg == v->reg) {
664 if(a2type(p) != v->type)
665 print("botch a2type %P\n", p);
672 * substitute s for v in a
673 * return failure to substitute
676 copysub(Adr *a, Adr *v, Adr *s, int f)
686 copysub1(Prog *p1, Adr *v, Adr *s, int f)