reg.c 21 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. #include "gc.h"
  10. Reg*
  11. rega(void)
  12. {
  13. Reg *r;
  14. r = freer;
  15. if(r == R) {
  16. r = alloc(sizeof(*r));
  17. } else
  18. freer = r->link;
  19. *r = zreg;
  20. return r;
  21. }
  22. int
  23. rcmp(const void *a1, const void *a2)
  24. {
  25. Rgn *p1, *p2;
  26. int c1, c2;
  27. p1 = (Rgn*)a1;
  28. p2 = (Rgn*)a2;
  29. c1 = p2->cost;
  30. c2 = p1->cost;
  31. if(c1 -= c2)
  32. return c1;
  33. return p2->varno - p1->varno;
  34. }
  35. void
  36. regopt(Prog *p)
  37. {
  38. Reg *r, *r1, *r2;
  39. Prog *p1;
  40. int i, z;
  41. int32_t initpc, val, npc;
  42. uint32_t vreg;
  43. Bits bit;
  44. struct
  45. {
  46. int32_t m;
  47. int32_t c;
  48. Reg* p;
  49. } log5[6], *lp;
  50. firstr = R;
  51. lastr = R;
  52. nvar = 0;
  53. regbits = RtoB(D_SP) | RtoB(D_AX);
  54. for(z=0; z<BITS; z++) {
  55. externs.b[z] = 0;
  56. params.b[z] = 0;
  57. consts.b[z] = 0;
  58. addrs.b[z] = 0;
  59. }
  60. /*
  61. * pass 1
  62. * build aux data structure
  63. * allocate pcs
  64. * find use and set of variables
  65. */
  66. val = 5L * 5L * 5L * 5L * 5L;
  67. lp = log5;
  68. for(i=0; i<5; i++) {
  69. lp->m = val;
  70. lp->c = 0;
  71. lp->p = R;
  72. val /= 5L;
  73. lp++;
  74. }
  75. val = 0;
  76. for(; p != P; p = p->link) {
  77. switch(p->as) {
  78. case ADATA:
  79. case AGLOBL:
  80. case ANAME:
  81. case ASIGNAME:
  82. continue;
  83. }
  84. r = rega();
  85. if(firstr == R) {
  86. firstr = r;
  87. lastr = r;
  88. } else {
  89. lastr->link = r;
  90. r->p1 = lastr;
  91. lastr->s1 = r;
  92. lastr = r;
  93. }
  94. r->prog = p;
  95. r->pc = val;
  96. val++;
  97. lp = log5;
  98. for(i=0; i<5; i++) {
  99. lp->c--;
  100. if(lp->c <= 0) {
  101. lp->c = lp->m;
  102. if(lp->p != R)
  103. lp->p->log5 = r;
  104. lp->p = r;
  105. (lp+1)->c = 0;
  106. break;
  107. }
  108. lp++;
  109. }
  110. r1 = r->p1;
  111. if(r1 != R)
  112. switch(r1->prog->as) {
  113. case ARET:
  114. case AJMP:
  115. case AIRETL:
  116. r->p1 = R;
  117. r1->s1 = R;
  118. }
  119. bit = mkvar(r, &p->from, p->as==AMOVL);
  120. if(bany(&bit))
  121. switch(p->as) {
  122. /*
  123. * funny
  124. */
  125. case ALEAL:
  126. for(z=0; z<BITS; z++)
  127. addrs.b[z] |= bit.b[z];
  128. break;
  129. /*
  130. * left side read
  131. */
  132. default:
  133. for(z=0; z<BITS; z++)
  134. r->use1.b[z] |= bit.b[z];
  135. break;
  136. }
  137. bit = mkvar(r, &p->to, 0);
  138. if(bany(&bit))
  139. switch(p->as) {
  140. default:
  141. diag(Z, "reg: unknown op: %A", p->as);
  142. break;
  143. /*
  144. * right side read
  145. */
  146. case ACMPB:
  147. case ACMPL:
  148. case ACMPW:
  149. for(z=0; z<BITS; z++)
  150. r->use2.b[z] |= bit.b[z];
  151. break;
  152. /*
  153. * right side write
  154. */
  155. case ANOP:
  156. case AMOVL:
  157. case AMOVB:
  158. case AMOVW:
  159. case AMOVBLSX:
  160. case AMOVBLZX:
  161. case AMOVWLSX:
  162. case AMOVWLZX:
  163. for(z=0; z<BITS; z++)
  164. r->set.b[z] |= bit.b[z];
  165. break;
  166. /*
  167. * right side read+write
  168. */
  169. case AADDB:
  170. case AADDL:
  171. case AADDW:
  172. case AANDB:
  173. case AANDL:
  174. case AANDW:
  175. case ASUBB:
  176. case ASUBL:
  177. case ASUBW:
  178. case AORB:
  179. case AORL:
  180. case AORW:
  181. case AXORB:
  182. case AXORL:
  183. case AXORW:
  184. case ASALB:
  185. case ASALL:
  186. case ASALW:
  187. case ASARB:
  188. case ASARL:
  189. case ASARW:
  190. case AROLB:
  191. case AROLL:
  192. case AROLW:
  193. case ARORB:
  194. case ARORL:
  195. case ARORW:
  196. case ASHLB:
  197. case ASHLL:
  198. case ASHLW:
  199. case ASHRB:
  200. case ASHRL:
  201. case ASHRW:
  202. case AIMULL:
  203. case AIMULW:
  204. case ANEGL:
  205. case ANOTL:
  206. case AADCL:
  207. case ASBBL:
  208. for(z=0; z<BITS; z++) {
  209. r->set.b[z] |= bit.b[z];
  210. r->use2.b[z] |= bit.b[z];
  211. }
  212. break;
  213. /*
  214. * funny
  215. */
  216. case AFMOVDP:
  217. case AFMOVFP:
  218. case AFMOVLP:
  219. case AFMOVVP:
  220. case AFMOVWP:
  221. case ACALL:
  222. for(z=0; z<BITS; z++)
  223. addrs.b[z] |= bit.b[z];
  224. break;
  225. }
  226. switch(p->as) {
  227. case AIMULL:
  228. case AIMULW:
  229. if(p->to.type != D_NONE)
  230. break;
  231. case AIDIVB:
  232. case AIDIVL:
  233. case AIDIVW:
  234. case AIMULB:
  235. case ADIVB:
  236. case ADIVL:
  237. case ADIVW:
  238. case AMULB:
  239. case AMULL:
  240. case AMULW:
  241. case ACWD:
  242. case ACDQ:
  243. r->regu |= RtoB(D_AX) | RtoB(D_DX);
  244. break;
  245. case AREP:
  246. case AREPN:
  247. case ALOOP:
  248. case ALOOPEQ:
  249. case ALOOPNE:
  250. r->regu |= RtoB(D_CX);
  251. break;
  252. case AMOVSB:
  253. case AMOVSL:
  254. case AMOVSW:
  255. case ACMPSB:
  256. case ACMPSL:
  257. case ACMPSW:
  258. r->regu |= RtoB(D_SI) | RtoB(D_DI);
  259. break;
  260. case ASTOSB:
  261. case ASTOSL:
  262. case ASTOSW:
  263. case ASCASB:
  264. case ASCASL:
  265. case ASCASW:
  266. r->regu |= RtoB(D_AX) | RtoB(D_DI);
  267. break;
  268. case AINSB:
  269. case AINSL:
  270. case AINSW:
  271. case AOUTSB:
  272. case AOUTSL:
  273. case AOUTSW:
  274. r->regu |= RtoB(D_DI) | RtoB(D_DX);
  275. break;
  276. case AFSTSW:
  277. case ASAHF:
  278. r->regu |= RtoB(D_AX);
  279. break;
  280. }
  281. }
  282. if(firstr == R)
  283. return;
  284. initpc = pc - val;
  285. npc = val;
  286. /*
  287. * pass 2
  288. * turn branch references to pointers
  289. * build back pointers
  290. */
  291. for(r = firstr; r != R; r = r->link) {
  292. p = r->prog;
  293. if(p->to.type == D_BRANCH) {
  294. val = p->to.offset - initpc;
  295. r1 = firstr;
  296. while(r1 != R) {
  297. r2 = r1->log5;
  298. if(r2 != R && val >= r2->pc) {
  299. r1 = r2;
  300. continue;
  301. }
  302. if(r1->pc == val)
  303. break;
  304. r1 = r1->link;
  305. }
  306. if(r1 == R) {
  307. nearln = p->lineno;
  308. diag(Z, "ref not found\n%P", p);
  309. continue;
  310. }
  311. if(r1 == r) {
  312. nearln = p->lineno;
  313. diag(Z, "ref to self\n%P", p);
  314. continue;
  315. }
  316. r->s2 = r1;
  317. r->p2link = r1->p2;
  318. r1->p2 = r;
  319. }
  320. }
  321. if(debug['R']) {
  322. p = firstr->prog;
  323. print("\n%L %D\n", p->lineno, &p->from);
  324. }
  325. /*
  326. * pass 2.5
  327. * find looping structure
  328. */
  329. for(r = firstr; r != R; r = r->link)
  330. r->active = 0;
  331. change = 0;
  332. loopit(firstr, npc);
  333. if(debug['R'] && debug['v']) {
  334. print("\nlooping structure:\n");
  335. for(r = firstr; r != R; r = r->link) {
  336. print("%ld:%P", r->loop, r->prog);
  337. for(z=0; z<BITS; z++)
  338. bit.b[z] = r->use1.b[z] |
  339. r->use2.b[z] |
  340. r->set.b[z];
  341. if(bany(&bit)) {
  342. print("\t");
  343. if(bany(&r->use1))
  344. print(" u1=%B", r->use1);
  345. if(bany(&r->use2))
  346. print(" u2=%B", r->use2);
  347. if(bany(&r->set))
  348. print(" st=%B", r->set);
  349. }
  350. print("\n");
  351. }
  352. }
  353. /*
  354. * pass 3
  355. * iterate propagating usage
  356. * back until flow graph is complete
  357. */
  358. loop1:
  359. change = 0;
  360. for(r = firstr; r != R; r = r->link)
  361. r->active = 0;
  362. for(r = firstr; r != R; r = r->link)
  363. if(r->prog->as == ARET)
  364. prop(r, zbits, zbits);
  365. loop11:
  366. /* pick up unreachable code */
  367. i = 0;
  368. for(r = firstr; r != R; r = r1) {
  369. r1 = r->link;
  370. if(r1 && r1->active && !r->active) {
  371. prop(r, zbits, zbits);
  372. i = 1;
  373. }
  374. }
  375. if(i)
  376. goto loop11;
  377. if(change)
  378. goto loop1;
  379. /*
  380. * pass 4
  381. * iterate propagating register/variable synchrony
  382. * forward until graph is complete
  383. */
  384. loop2:
  385. change = 0;
  386. for(r = firstr; r != R; r = r->link)
  387. r->active = 0;
  388. synch(firstr, zbits);
  389. if(change)
  390. goto loop2;
  391. /*
  392. * pass 5
  393. * isolate regions
  394. * calculate costs (paint1)
  395. */
  396. r = firstr;
  397. if(r) {
  398. for(z=0; z<BITS; z++)
  399. bit.b[z] = (r->refahead.b[z] | r->calahead.b[z]) &
  400. ~(externs.b[z] | params.b[z] | addrs.b[z] | consts.b[z]);
  401. if(bany(&bit)) {
  402. nearln = r->prog->lineno;
  403. warn(Z, "used and not set: %B", bit);
  404. if(debug['R'] && !debug['w'])
  405. print("used and not set: %B\n", bit);
  406. }
  407. }
  408. if(debug['R'] && debug['v'])
  409. print("\nprop structure:\n");
  410. for(r = firstr; r != R; r = r->link)
  411. r->act = zbits;
  412. rgp = region;
  413. nregion = 0;
  414. for(r = firstr; r != R; r = r->link) {
  415. if(debug['R'] && debug['v']) {
  416. print("%P\t", r->prog);
  417. if(bany(&r->set))
  418. print("s:%B ", r->set);
  419. if(bany(&r->refahead))
  420. print("ra:%B ", r->refahead);
  421. if(bany(&r->calahead))
  422. print("ca:%B ", r->calahead);
  423. print("\n");
  424. }
  425. for(z=0; z<BITS; z++)
  426. bit.b[z] = r->set.b[z] &
  427. ~(r->refahead.b[z] | r->calahead.b[z] | addrs.b[z]);
  428. if(bany(&bit)) {
  429. nearln = r->prog->lineno;
  430. warn(Z, "set and not used: %B", bit);
  431. if(debug['R'])
  432. print("set and not used: %B\n", bit);
  433. excise(r);
  434. }
  435. for(z=0; z<BITS; z++)
  436. bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
  437. while(bany(&bit)) {
  438. i = bnum(bit);
  439. rgp->enter = r;
  440. rgp->varno = i;
  441. change = 0;
  442. if(debug['R'] && debug['v'])
  443. print("\n");
  444. paint1(r, i);
  445. bit.b[i/32] &= ~(1L<<(i%32));
  446. if(change <= 0) {
  447. if(debug['R'])
  448. print("%L$%d: %B\n",
  449. r->prog->lineno, change, blsh(i));
  450. continue;
  451. }
  452. rgp->cost = change;
  453. nregion++;
  454. if(nregion >= NRGN) {
  455. warn(Z, "too many regions");
  456. goto brk;
  457. }
  458. rgp++;
  459. }
  460. }
  461. brk:
  462. qsort(region, nregion, sizeof(region[0]), rcmp);
  463. /*
  464. * pass 6
  465. * determine used registers (paint2)
  466. * replace code (paint3)
  467. */
  468. rgp = region;
  469. for(i=0; i<nregion; i++) {
  470. bit = blsh(rgp->varno);
  471. vreg = paint2(rgp->enter, rgp->varno);
  472. vreg = allreg(vreg, rgp);
  473. if(debug['R']) {
  474. print("%L$%d %R: %B\n",
  475. rgp->enter->prog->lineno,
  476. rgp->cost,
  477. rgp->regno,
  478. bit);
  479. }
  480. if(rgp->regno != 0)
  481. paint3(rgp->enter, rgp->varno, vreg, rgp->regno);
  482. rgp++;
  483. }
  484. /*
  485. * pass 7
  486. * peep-hole on basic block
  487. */
  488. if(!debug['R'] || debug['P'])
  489. peep();
  490. /*
  491. * pass 8
  492. * recalculate pc
  493. */
  494. val = initpc;
  495. for(r = firstr; r != R; r = r1) {
  496. r->pc = val;
  497. p = r->prog;
  498. p1 = P;
  499. r1 = r->link;
  500. if(r1 != R)
  501. p1 = r1->prog;
  502. for(; p != p1; p = p->link) {
  503. switch(p->as) {
  504. default:
  505. val++;
  506. break;
  507. case ANOP:
  508. case ADATA:
  509. case AGLOBL:
  510. case ANAME:
  511. case ASIGNAME:
  512. break;
  513. }
  514. }
  515. }
  516. pc = val;
  517. /*
  518. * fix up branches
  519. */
  520. if(debug['R'])
  521. if(bany(&addrs))
  522. print("addrs: %B\n", addrs);
  523. r1 = 0; /* set */
  524. for(r = firstr; r != R; r = r->link) {
  525. p = r->prog;
  526. if(p->to.type == D_BRANCH)
  527. p->to.offset = r->s2->pc;
  528. r1 = r;
  529. }
  530. /*
  531. * last pass
  532. * eliminate nops
  533. * free aux structures
  534. */
  535. for(p = firstr->prog; p != P; p = p->link){
  536. while(p->link && p->link->as == ANOP)
  537. p->link = p->link->link;
  538. }
  539. if(r1 != R) {
  540. r1->link = freer;
  541. freer = firstr;
  542. }
  543. }
  544. /*
  545. * add mov b,rn
  546. * just after r
  547. */
  548. void
  549. addmove(Reg *r, int bn, int rn, int f)
  550. {
  551. Prog *p, *p1;
  552. Adr *a;
  553. Var *v;
  554. p1 = alloc(sizeof(*p1));
  555. *p1 = zprog;
  556. p = r->prog;
  557. p1->link = p->link;
  558. p->link = p1;
  559. p1->lineno = p->lineno;
  560. v = var + bn;
  561. a = &p1->to;
  562. a->sym = v->sym;
  563. a->offset = v->offset;
  564. a->etype = v->etype;
  565. a->type = v->name;
  566. p1->as = AMOVL;
  567. if(v->etype == TCHAR || v->etype == TUCHAR)
  568. p1->as = AMOVB;
  569. if(v->etype == TSHORT || v->etype == TUSHORT)
  570. p1->as = AMOVW;
  571. p1->from.type = rn;
  572. if(!f) {
  573. p1->from = *a;
  574. *a = zprog.from;
  575. a->type = rn;
  576. if(v->etype == TUCHAR)
  577. p1->as = AMOVB;
  578. if(v->etype == TUSHORT)
  579. p1->as = AMOVW;
  580. }
  581. if(debug['R'])
  582. print("%P\t.a%P\n", p, p1);
  583. }
  584. uint32_t
  585. doregbits(int r)
  586. {
  587. uint32_t b;
  588. b = 0;
  589. if(r >= D_INDIR)
  590. r -= D_INDIR;
  591. if(r >= D_AX && r <= D_DI)
  592. b |= RtoB(r);
  593. else
  594. if(r >= D_AL && r <= D_BL)
  595. b |= RtoB(r-D_AL+D_AX);
  596. else
  597. if(r >= D_AH && r <= D_BH)
  598. b |= RtoB(r-D_AH+D_AX);
  599. return b;
  600. }
  601. Bits
  602. mkvar(Reg *r, Adr *a, int isro)
  603. {
  604. Var *v;
  605. int i, t, n, et, z;
  606. int32_t o;
  607. Bits bit;
  608. Sym *s;
  609. /*
  610. * mark registers used
  611. */
  612. t = a->type;
  613. r->regu |= doregbits(t);
  614. r->regu |= doregbits(a->index);
  615. et = a->etype;
  616. switch(t) {
  617. default:
  618. goto none;
  619. case D_INDIR+D_GS:
  620. if(!isro || 1)
  621. goto none;
  622. n = t;
  623. {static Sym er; a->sym = &er;}
  624. a->sym->name = "$extreg";
  625. break;
  626. case D_ADDR:
  627. a->type = a->index;
  628. bit = mkvar(r, a, 0);
  629. for(z=0; z<BITS; z++)
  630. addrs.b[z] |= bit.b[z];
  631. a->type = t;
  632. goto none;
  633. case D_EXTERN:
  634. case D_STATIC:
  635. case D_PARAM:
  636. case D_AUTO:
  637. n = t;
  638. break;
  639. }
  640. s = a->sym;
  641. if(s == S)
  642. goto none;
  643. if(s->name[0] == '.')
  644. goto none;
  645. o = a->offset;
  646. v = var;
  647. for(i=0; i<nvar; i++) {
  648. if(s == v->sym)
  649. if(n == v->name)
  650. if(o == v->offset)
  651. goto out;
  652. v++;
  653. }
  654. if(nvar >= NVAR) {
  655. if(debug['w'] > 1 && s)
  656. warn(Z, "variable not optimized: %s", s->name);
  657. goto none;
  658. }
  659. i = nvar;
  660. nvar++;
  661. v = &var[i];
  662. v->sym = s;
  663. v->offset = o;
  664. v->name = n;
  665. v->etype = et;
  666. if(debug['R'])
  667. print("bit=%2d et=%2d %D\n", i, et, a);
  668. out:
  669. bit = blsh(i);
  670. if(n == D_EXTERN || n == D_STATIC)
  671. for(z=0; z<BITS; z++)
  672. externs.b[z] |= bit.b[z];
  673. if(n == D_PARAM)
  674. for(z=0; z<BITS; z++)
  675. params.b[z] |= bit.b[z];
  676. if(v->etype != et || !typechlpfd[et]) /* funny punning */
  677. for(z=0; z<BITS; z++)
  678. addrs.b[z] |= bit.b[z];
  679. return bit;
  680. none:
  681. return zbits;
  682. }
  683. void
  684. prop(Reg *r, Bits ref, Bits cal)
  685. {
  686. Reg *r1, *r2;
  687. int z;
  688. for(r1 = r; r1 != R; r1 = r1->p1) {
  689. for(z=0; z<BITS; z++) {
  690. ref.b[z] |= r1->refahead.b[z];
  691. if(ref.b[z] != r1->refahead.b[z]) {
  692. r1->refahead.b[z] = ref.b[z];
  693. change++;
  694. }
  695. cal.b[z] |= r1->calahead.b[z];
  696. if(cal.b[z] != r1->calahead.b[z]) {
  697. r1->calahead.b[z] = cal.b[z];
  698. change++;
  699. }
  700. }
  701. switch(r1->prog->as) {
  702. case ACALL:
  703. for(z=0; z<BITS; z++) {
  704. cal.b[z] |= ref.b[z] | externs.b[z];
  705. ref.b[z] = 0;
  706. }
  707. break;
  708. case ATEXT:
  709. for(z=0; z<BITS; z++) {
  710. cal.b[z] = 0;
  711. ref.b[z] = 0;
  712. }
  713. break;
  714. case ARET:
  715. for(z=0; z<BITS; z++) {
  716. cal.b[z] = externs.b[z];
  717. ref.b[z] = 0;
  718. }
  719. }
  720. for(z=0; z<BITS; z++) {
  721. ref.b[z] = (ref.b[z] & ~r1->set.b[z]) |
  722. r1->use1.b[z] | r1->use2.b[z];
  723. cal.b[z] &= ~(r1->set.b[z] | r1->use1.b[z] | r1->use2.b[z]);
  724. r1->refbehind.b[z] = ref.b[z];
  725. r1->calbehind.b[z] = cal.b[z];
  726. }
  727. if(r1->active)
  728. break;
  729. r1->active = 1;
  730. }
  731. for(; r != r1; r = r->p1)
  732. for(r2 = r->p2; r2 != R; r2 = r2->p2link)
  733. prop(r2, r->refbehind, r->calbehind);
  734. }
  735. /*
  736. * find looping structure
  737. *
  738. * 1) find reverse postordering
  739. * 2) find approximate dominators,
  740. * the actual dominators if the flow graph is reducible
  741. * otherwise, dominators plus some other non-dominators.
  742. * See Matthew S. Hecht and Jeffrey D. Ullman,
  743. * "Analysis of a Simple Algorithm for Global Data Flow Problems",
  744. * Conf. Record of ACM Symp. on Principles of Prog. Langs, Boston, Massachusetts,
  745. * Oct. 1-3, 1973, pp. 207-217.
  746. * 3) find all nodes with a predecessor dominated by the current node.
  747. * such a node is a loop head.
  748. * recursively, all preds with a greater rpo number are in the loop
  749. */
  750. int32_t
  751. postorder(Reg *r, Reg **rpo2r, int32_t n)
  752. {
  753. Reg *r1;
  754. r->rpo = 1;
  755. r1 = r->s1;
  756. if(r1 && !r1->rpo)
  757. n = postorder(r1, rpo2r, n);
  758. r1 = r->s2;
  759. if(r1 && !r1->rpo)
  760. n = postorder(r1, rpo2r, n);
  761. rpo2r[n] = r;
  762. n++;
  763. return n;
  764. }
  765. int32_t
  766. rpolca(int32_t *idom, int32_t rpo1, int32_t rpo2)
  767. {
  768. int32_t t;
  769. if(rpo1 == -1)
  770. return rpo2;
  771. while(rpo1 != rpo2){
  772. if(rpo1 > rpo2){
  773. t = rpo2;
  774. rpo2 = rpo1;
  775. rpo1 = t;
  776. }
  777. while(rpo1 < rpo2){
  778. t = idom[rpo2];
  779. if(t >= rpo2)
  780. fatal(Z, "bad idom");
  781. rpo2 = t;
  782. }
  783. }
  784. return rpo1;
  785. }
  786. int
  787. doms(int32_t *idom, int32_t r, int32_t s)
  788. {
  789. while(s > r)
  790. s = idom[s];
  791. return s == r;
  792. }
  793. int
  794. loophead(int32_t *idom, Reg *r)
  795. {
  796. int32_t src;
  797. src = r->rpo;
  798. if(r->p1 != R && doms(idom, src, r->p1->rpo))
  799. return 1;
  800. for(r = r->p2; r != R; r = r->p2link)
  801. if(doms(idom, src, r->rpo))
  802. return 1;
  803. return 0;
  804. }
  805. void
  806. loopmark(Reg **rpo2r, int32_t head, Reg *r)
  807. {
  808. if(r->rpo < head || r->active == head)
  809. return;
  810. r->active = head;
  811. r->loop += LOOP;
  812. if(r->p1 != R)
  813. loopmark(rpo2r, head, r->p1);
  814. for(r = r->p2; r != R; r = r->p2link)
  815. loopmark(rpo2r, head, r);
  816. }
  817. void
  818. loopit(Reg *r, int32_t nr)
  819. {
  820. Reg *r1;
  821. int32_t i, d, me;
  822. if(nr > maxnr) {
  823. rpo2r = alloc(nr * sizeof(Reg*));
  824. idom = alloc(nr * sizeof(int32_t));
  825. maxnr = nr;
  826. }
  827. d = postorder(r, rpo2r, 0);
  828. if(d > nr)
  829. fatal(Z, "too many reg nodes");
  830. nr = d;
  831. for(i = 0; i < nr / 2; i++){
  832. r1 = rpo2r[i];
  833. rpo2r[i] = rpo2r[nr - 1 - i];
  834. rpo2r[nr - 1 - i] = r1;
  835. }
  836. for(i = 0; i < nr; i++)
  837. rpo2r[i]->rpo = i;
  838. idom[0] = 0;
  839. for(i = 0; i < nr; i++){
  840. r1 = rpo2r[i];
  841. me = r1->rpo;
  842. d = -1;
  843. if(r1->p1 != R && r1->p1->rpo < me)
  844. d = r1->p1->rpo;
  845. for(r1 = r1->p2; r1 != nil; r1 = r1->p2link)
  846. if(r1->rpo < me)
  847. d = rpolca(idom, d, r1->rpo);
  848. idom[i] = d;
  849. }
  850. for(i = 0; i < nr; i++){
  851. r1 = rpo2r[i];
  852. r1->loop++;
  853. if(r1->p2 != R && loophead(idom, r1))
  854. loopmark(rpo2r, i, r1);
  855. }
  856. }
  857. void
  858. synch(Reg *r, Bits dif)
  859. {
  860. Reg *r1;
  861. int z;
  862. for(r1 = r; r1 != R; r1 = r1->s1) {
  863. for(z=0; z<BITS; z++) {
  864. dif.b[z] = (dif.b[z] &
  865. ~(~r1->refbehind.b[z] & r1->refahead.b[z])) |
  866. r1->set.b[z] | r1->regdiff.b[z];
  867. if(dif.b[z] != r1->regdiff.b[z]) {
  868. r1->regdiff.b[z] = dif.b[z];
  869. change++;
  870. }
  871. }
  872. if(r1->active)
  873. break;
  874. r1->active = 1;
  875. for(z=0; z<BITS; z++)
  876. dif.b[z] &= ~(~r1->calbehind.b[z] & r1->calahead.b[z]);
  877. if(r1->s2 != R)
  878. synch(r1->s2, dif);
  879. }
  880. }
  881. uint32_t
  882. allreg(uint32_t b, Rgn *r)
  883. {
  884. Var *v;
  885. int i;
  886. v = var + r->varno;
  887. r->regno = 0;
  888. switch(v->etype) {
  889. default:
  890. diag(Z, "unknown etype %d/%d", bitno(b), v->etype);
  891. break;
  892. case TCHAR:
  893. case TUCHAR:
  894. case TSHORT:
  895. case TUSHORT:
  896. case TINT:
  897. case TUINT:
  898. case TLONG:
  899. case TULONG:
  900. case TIND:
  901. case TARRAY:
  902. i = BtoR(~b);
  903. if(i && r->cost > 0) {
  904. r->regno = i;
  905. return RtoB(i);
  906. }
  907. break;
  908. case TDOUBLE:
  909. case TFLOAT:
  910. break;
  911. }
  912. return 0;
  913. }
  914. void
  915. paint1(Reg *r, int bn)
  916. {
  917. Reg *r1;
  918. Prog *p;
  919. int z;
  920. uint32_t bb;
  921. z = bn/32;
  922. bb = 1L<<(bn%32);
  923. if(r->act.b[z] & bb)
  924. return;
  925. for(;;) {
  926. if(!(r->refbehind.b[z] & bb))
  927. break;
  928. r1 = r->p1;
  929. if(r1 == R)
  930. break;
  931. if(!(r1->refahead.b[z] & bb))
  932. break;
  933. if(r1->act.b[z] & bb)
  934. break;
  935. r = r1;
  936. }
  937. if(LOAD(r) & ~(r->set.b[z]&~(r->use1.b[z]|r->use2.b[z])) & bb) {
  938. change -= CLOAD * r->loop;
  939. if(debug['R'] && debug['v'])
  940. print("%ld%P\tld %B $%d\n", r->loop,
  941. r->prog, blsh(bn), change);
  942. }
  943. for(;;) {
  944. r->act.b[z] |= bb;
  945. p = r->prog;
  946. if(r->use1.b[z] & bb) {
  947. change += CREF * r->loop;
  948. if(p->as == AFMOVL || p->as == AFMOVW)
  949. if(BtoR(bb) != D_F0)
  950. change = -CINF;
  951. if(debug['R'] && debug['v'])
  952. print("%ld%P\tu1 %B $%d\n", r->loop,
  953. p, blsh(bn), change);
  954. }
  955. if((r->use2.b[z]|r->set.b[z]) & bb) {
  956. change += CREF * r->loop;
  957. if(p->as == AFMOVL || p->as == AFMOVW)
  958. if(BtoR(bb) != D_F0)
  959. change = -CINF;
  960. if(debug['R'] && debug['v'])
  961. print("%ld%P\tu2 %B $%d\n", r->loop,
  962. p, blsh(bn), change);
  963. }
  964. if(STORE(r) & r->regdiff.b[z] & bb) {
  965. change -= CLOAD * r->loop;
  966. if(p->as == AFMOVL || p->as == AFMOVW)
  967. if(BtoR(bb) != D_F0)
  968. change = -CINF;
  969. if(debug['R'] && debug['v'])
  970. print("%ld%P\tst %B $%d\n", r->loop,
  971. p, blsh(bn), change);
  972. }
  973. if(r->refbehind.b[z] & bb)
  974. for(r1 = r->p2; r1 != R; r1 = r1->p2link)
  975. if(r1->refahead.b[z] & bb)
  976. paint1(r1, bn);
  977. if(!(r->refahead.b[z] & bb))
  978. break;
  979. r1 = r->s2;
  980. if(r1 != R)
  981. if(r1->refbehind.b[z] & bb)
  982. paint1(r1, bn);
  983. r = r->s1;
  984. if(r == R)
  985. break;
  986. if(r->act.b[z] & bb)
  987. break;
  988. if(!(r->refbehind.b[z] & bb))
  989. break;
  990. }
  991. }
  992. uint32_t
  993. regset(Reg *r, uint32_t bb)
  994. {
  995. uint32_t b, set;
  996. Adr v;
  997. int c;
  998. set = 0;
  999. v = zprog.from;
  1000. while(b = bb & ~(bb-1)) {
  1001. v.type = BtoR(b);
  1002. c = copyu(r->prog, &v, A);
  1003. if(c == 3)
  1004. set |= b;
  1005. bb &= ~b;
  1006. }
  1007. return set;
  1008. }
  1009. uint32_t
  1010. reguse(Reg *r, uint32_t bb)
  1011. {
  1012. uint32_t b, set;
  1013. Adr v;
  1014. int c;
  1015. set = 0;
  1016. v = zprog.from;
  1017. while(b = bb & ~(bb-1)) {
  1018. v.type = BtoR(b);
  1019. c = copyu(r->prog, &v, A);
  1020. if(c == 1 || c == 2 || c == 4)
  1021. set |= b;
  1022. bb &= ~b;
  1023. }
  1024. return set;
  1025. }
  1026. uint32_t
  1027. paint2(Reg *r, int bn)
  1028. {
  1029. Reg *r1;
  1030. int z;
  1031. uint32_t bb, vreg, x;
  1032. z = bn/32;
  1033. bb = 1L << (bn%32);
  1034. vreg = regbits;
  1035. if(!(r->act.b[z] & bb))
  1036. return vreg;
  1037. for(;;) {
  1038. if(!(r->refbehind.b[z] & bb))
  1039. break;
  1040. r1 = r->p1;
  1041. if(r1 == R)
  1042. break;
  1043. if(!(r1->refahead.b[z] & bb))
  1044. break;
  1045. if(!(r1->act.b[z] & bb))
  1046. break;
  1047. r = r1;
  1048. }
  1049. for(;;) {
  1050. r->act.b[z] &= ~bb;
  1051. vreg |= r->regu;
  1052. if(r->refbehind.b[z] & bb)
  1053. for(r1 = r->p2; r1 != R; r1 = r1->p2link)
  1054. if(r1->refahead.b[z] & bb)
  1055. vreg |= paint2(r1, bn);
  1056. if(!(r->refahead.b[z] & bb))
  1057. break;
  1058. r1 = r->s2;
  1059. if(r1 != R)
  1060. if(r1->refbehind.b[z] & bb)
  1061. vreg |= paint2(r1, bn);
  1062. r = r->s1;
  1063. if(r == R)
  1064. break;
  1065. if(!(r->act.b[z] & bb))
  1066. break;
  1067. if(!(r->refbehind.b[z] & bb))
  1068. break;
  1069. }
  1070. bb = vreg;
  1071. for(; r; r=r->s1) {
  1072. x = r->regu & ~bb;
  1073. if(x) {
  1074. vreg |= reguse(r, x);
  1075. bb |= regset(r, x);
  1076. }
  1077. }
  1078. return vreg;
  1079. }
  1080. void
  1081. paint3(Reg *r, int bn, int32_t rb, int rn)
  1082. {
  1083. Reg *r1;
  1084. Prog *p;
  1085. int z;
  1086. uint32_t bb;
  1087. z = bn/32;
  1088. bb = 1L << (bn%32);
  1089. if(r->act.b[z] & bb)
  1090. return;
  1091. for(;;) {
  1092. if(!(r->refbehind.b[z] & bb))
  1093. break;
  1094. r1 = r->p1;
  1095. if(r1 == R)
  1096. break;
  1097. if(!(r1->refahead.b[z] & bb))
  1098. break;
  1099. if(r1->act.b[z] & bb)
  1100. break;
  1101. r = r1;
  1102. }
  1103. if(LOAD(r) & ~(r->set.b[z] & ~(r->use1.b[z]|r->use2.b[z])) & bb)
  1104. addmove(r, bn, rn, 0);
  1105. for(;;) {
  1106. r->act.b[z] |= bb;
  1107. p = r->prog;
  1108. if(r->use1.b[z] & bb) {
  1109. if(debug['R'])
  1110. print("%P", p);
  1111. addreg(&p->from, rn);
  1112. if(debug['R'])
  1113. print("\t.c%P\n", p);
  1114. }
  1115. if((r->use2.b[z]|r->set.b[z]) & bb) {
  1116. if(debug['R'])
  1117. print("%P", p);
  1118. addreg(&p->to, rn);
  1119. if(debug['R'])
  1120. print("\t.c%P\n", p);
  1121. }
  1122. if(STORE(r) & r->regdiff.b[z] & bb)
  1123. addmove(r, bn, rn, 1);
  1124. r->regu |= rb;
  1125. if(r->refbehind.b[z] & bb)
  1126. for(r1 = r->p2; r1 != R; r1 = r1->p2link)
  1127. if(r1->refahead.b[z] & bb)
  1128. paint3(r1, bn, rb, rn);
  1129. if(!(r->refahead.b[z] & bb))
  1130. break;
  1131. r1 = r->s2;
  1132. if(r1 != R)
  1133. if(r1->refbehind.b[z] & bb)
  1134. paint3(r1, bn, rb, rn);
  1135. r = r->s1;
  1136. if(r == R)
  1137. break;
  1138. if(r->act.b[z] & bb)
  1139. break;
  1140. if(!(r->refbehind.b[z] & bb))
  1141. break;
  1142. }
  1143. }
  1144. void
  1145. addreg(Adr *a, int rn)
  1146. {
  1147. a->sym = 0;
  1148. a->offset = 0;
  1149. a->type = rn;
  1150. }
  1151. int32_t
  1152. RtoB(int r)
  1153. {
  1154. if(r < D_AX || r > D_DI)
  1155. return 0;
  1156. return 1L << (r-D_AX);
  1157. }
  1158. int
  1159. BtoR(int32_t b)
  1160. {
  1161. b &= 0xffL;
  1162. if(b == 0)
  1163. return 0;
  1164. return bitno(b) + D_AX;
  1165. }