reg.c 19 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120
  1. #include "gc.h"
  2. Reg*
  3. rega(void)
  4. {
  5. Reg *r;
  6. r = freer;
  7. if(r == R) {
  8. r = alloc(sizeof(*r));
  9. } else
  10. freer = r->link;
  11. *r = zreg;
  12. return r;
  13. }
  14. int
  15. rcmp(void *a1, void *a2)
  16. {
  17. Rgn *p1, *p2;
  18. int c1, c2;
  19. p1 = a1;
  20. p2 = a2;
  21. c1 = p2->cost;
  22. c2 = p1->cost;
  23. if(c1 -= c2)
  24. return c1;
  25. return p2->varno - p1->varno;
  26. }
  27. void
  28. regopt(Prog *p)
  29. {
  30. Reg *r, *r1, *r2;
  31. Prog *p1;
  32. int i, z;
  33. long initpc, val, npc;
  34. ulong vreg;
  35. Bits bit;
  36. struct
  37. {
  38. long m;
  39. long c;
  40. Reg* p;
  41. } log5[6], *lp;
  42. firstr = R;
  43. lastr = R;
  44. nvar = 0;
  45. regbits = 0;
  46. for(z=0; z<BITS; z++) {
  47. externs.b[z] = 0;
  48. params.b[z] = 0;
  49. consts.b[z] = 0;
  50. addrs.b[z] = 0;
  51. }
  52. /*
  53. * pass 1
  54. * build aux data structure
  55. * allocate pcs
  56. * find use and set of variables
  57. */
  58. val = 5L * 5L * 5L * 5L * 5L;
  59. lp = log5;
  60. for(i=0; i<5; i++) {
  61. lp->m = val;
  62. lp->c = 0;
  63. lp->p = R;
  64. val /= 5L;
  65. lp++;
  66. }
  67. val = 0;
  68. for(; p != P; p = p->link) {
  69. switch(p->as) {
  70. case ADATA:
  71. case AGLOBL:
  72. case ANAME:
  73. continue;
  74. }
  75. r = rega();
  76. if(firstr == R) {
  77. firstr = r;
  78. lastr = r;
  79. } else {
  80. lastr->link = r;
  81. r->p1 = lastr;
  82. lastr->s1 = r;
  83. lastr = r;
  84. }
  85. r->prog = p;
  86. r->pc = val;
  87. val++;
  88. lp = log5;
  89. for(i=0; i<5; i++) {
  90. lp->c--;
  91. if(lp->c <= 0) {
  92. lp->c = lp->m;
  93. if(lp->p != R)
  94. lp->p->log5 = r;
  95. lp->p = r;
  96. (lp+1)->c = 0;
  97. break;
  98. }
  99. lp++;
  100. }
  101. r1 = r->p1;
  102. if(r1 != R)
  103. switch(r1->prog->as) {
  104. case ARETURN:
  105. case ABR:
  106. case ARFI:
  107. r->p1 = R;
  108. r1->s1 = R;
  109. }
  110. /*
  111. * left side always read
  112. */
  113. bit = mkvar(&p->from, p->as==AMOVW);
  114. for(z=0; z<BITS; z++)
  115. r->use1.b[z] |= bit.b[z];
  116. /*
  117. * right side depends on opcode
  118. */
  119. bit = mkvar(&p->to, 0);
  120. if(bany(&bit))
  121. switch(p->as) {
  122. default:
  123. diag(Z, "reg: unknown asop: %A", p->as);
  124. break;
  125. /*
  126. * right side write
  127. */
  128. case ANOP:
  129. case AMOVB:
  130. case AMOVBU:
  131. case AMOVBZ:
  132. case AMOVBZU:
  133. case AMOVH:
  134. case AMOVHBR:
  135. case AMOVHU:
  136. case AMOVHZ:
  137. case AMOVHZU:
  138. case AMOVW:
  139. case AMOVWU:
  140. case AFMOVD:
  141. case AFMOVDCC:
  142. case AFMOVDU:
  143. case AFMOVS:
  144. case AFMOVSU:
  145. case AFRSP:
  146. for(z=0; z<BITS; z++)
  147. r->set.b[z] |= bit.b[z];
  148. break;
  149. /*
  150. * funny
  151. */
  152. case ABL:
  153. for(z=0; z<BITS; z++)
  154. addrs.b[z] |= bit.b[z];
  155. break;
  156. }
  157. }
  158. if(firstr == R)
  159. return;
  160. initpc = pc - val;
  161. npc = val;
  162. /*
  163. * pass 2
  164. * turn branch references to pointers
  165. * build back pointers
  166. */
  167. for(r = firstr; r != R; r = r->link) {
  168. p = r->prog;
  169. if(p->to.type == D_BRANCH) {
  170. val = p->to.offset - initpc;
  171. r1 = firstr;
  172. while(r1 != R) {
  173. r2 = r1->log5;
  174. if(r2 != R && val >= r2->pc) {
  175. r1 = r2;
  176. continue;
  177. }
  178. if(r1->pc == val)
  179. break;
  180. r1 = r1->link;
  181. }
  182. if(r1 == R) {
  183. nearln = p->lineno;
  184. diag(Z, "ref not found\n%P", p);
  185. continue;
  186. }
  187. if(r1 == r) {
  188. nearln = p->lineno;
  189. diag(Z, "ref to self\n%P", p);
  190. continue;
  191. }
  192. r->s2 = r1;
  193. r->p2link = r1->p2;
  194. r1->p2 = r;
  195. }
  196. }
  197. if(debug['R']) {
  198. p = firstr->prog;
  199. print("\n%L %D\n", p->lineno, &p->from);
  200. }
  201. /*
  202. * pass 2.5
  203. * find looping structure
  204. */
  205. for(r = firstr; r != R; r = r->link)
  206. r->active = 0;
  207. change = 0;
  208. loopit(firstr, npc);
  209. if(debug['R'] && debug['v']) {
  210. print("\nlooping structure:\n");
  211. for(r = firstr; r != R; r = r->link) {
  212. print("%ld:%P", r->loop, r->prog);
  213. for(z=0; z<BITS; z++)
  214. bit.b[z] = r->use1.b[z] |
  215. r->use2.b[z] | r->set.b[z];
  216. if(bany(&bit)) {
  217. print("\t");
  218. if(bany(&r->use1))
  219. print(" u1=%B", r->use1);
  220. if(bany(&r->use2))
  221. print(" u2=%B", r->use2);
  222. if(bany(&r->set))
  223. print(" st=%B", r->set);
  224. }
  225. print("\n");
  226. }
  227. }
  228. /*
  229. * pass 3
  230. * iterate propagating usage
  231. * back until flow graph is complete
  232. */
  233. loop1:
  234. change = 0;
  235. for(r = firstr; r != R; r = r->link)
  236. r->active = 0;
  237. for(r = firstr; r != R; r = r->link)
  238. if(r->prog->as == ARETURN)
  239. prop(r, zbits, zbits);
  240. loop11:
  241. /* pick up unreachable code */
  242. i = 0;
  243. for(r = firstr; r != R; r = r1) {
  244. r1 = r->link;
  245. if(r1 && r1->active && !r->active) {
  246. prop(r, zbits, zbits);
  247. i = 1;
  248. }
  249. }
  250. if(i)
  251. goto loop11;
  252. if(change)
  253. goto loop1;
  254. /*
  255. * pass 4
  256. * iterate propagating register/variable synchrony
  257. * forward until graph is complete
  258. */
  259. loop2:
  260. change = 0;
  261. for(r = firstr; r != R; r = r->link)
  262. r->active = 0;
  263. synch(firstr, zbits);
  264. if(change)
  265. goto loop2;
  266. /*
  267. * pass 5
  268. * isolate regions
  269. * calculate costs (paint1)
  270. */
  271. r = firstr;
  272. if(r) {
  273. for(z=0; z<BITS; z++)
  274. bit.b[z] = (r->refahead.b[z] | r->calahead.b[z]) &
  275. ~(externs.b[z] | params.b[z] | addrs.b[z] | consts.b[z]);
  276. if(bany(&bit)) {
  277. nearln = r->prog->lineno;
  278. warn(Z, "used and not set: %B", bit);
  279. if(debug['R'] && !debug['w'])
  280. print("used and not set: %B\n", bit);
  281. }
  282. }
  283. if(debug['R'] && debug['v'])
  284. print("\nprop structure:\n");
  285. for(r = firstr; r != R; r = r->link)
  286. r->act = zbits;
  287. rgp = region;
  288. nregion = 0;
  289. for(r = firstr; r != R; r = r->link) {
  290. if(debug['R'] && debug['v'])
  291. print("%P\n set = %B; rah = %B; cal = %B\n",
  292. r->prog, r->set, r->refahead, r->calahead);
  293. for(z=0; z<BITS; z++)
  294. bit.b[z] = r->set.b[z] &
  295. ~(r->refahead.b[z] | r->calahead.b[z] | addrs.b[z]);
  296. if(bany(&bit)) {
  297. nearln = r->prog->lineno;
  298. warn(Z, "set and not used: %B", bit);
  299. if(debug['R'])
  300. print("set an not used: %B\n", bit);
  301. excise(r);
  302. }
  303. for(z=0; z<BITS; z++)
  304. bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
  305. while(bany(&bit)) {
  306. i = bnum(bit);
  307. rgp->enter = r;
  308. rgp->varno = i;
  309. change = 0;
  310. if(debug['R'] && debug['v'])
  311. print("\n");
  312. paint1(r, i);
  313. bit.b[i/32] &= ~(1L<<(i%32));
  314. if(change <= 0) {
  315. if(debug['R'])
  316. print("%L$%d: %B\n",
  317. r->prog->lineno, change, blsh(i));
  318. continue;
  319. }
  320. rgp->cost = change;
  321. nregion++;
  322. if(nregion >= NRGN) {
  323. warn(Z, "too many regions");
  324. goto brk;
  325. }
  326. rgp++;
  327. }
  328. }
  329. brk:
  330. qsort(region, nregion, sizeof(region[0]), rcmp);
  331. /*
  332. * pass 6
  333. * determine used registers (paint2)
  334. * replace code (paint3)
  335. */
  336. rgp = region;
  337. for(i=0; i<nregion; i++) {
  338. bit = blsh(rgp->varno);
  339. vreg = paint2(rgp->enter, rgp->varno);
  340. vreg = allreg(vreg, rgp);
  341. if(debug['R']) {
  342. if(rgp->regno >= NREG)
  343. print("%L$%d F%d: %B\n",
  344. rgp->enter->prog->lineno,
  345. rgp->cost,
  346. rgp->regno-NREG,
  347. bit);
  348. else
  349. print("%L$%d R%d: %B\n",
  350. rgp->enter->prog->lineno,
  351. rgp->cost,
  352. rgp->regno,
  353. bit);
  354. }
  355. if(rgp->regno != 0)
  356. paint3(rgp->enter, rgp->varno, vreg, rgp->regno);
  357. rgp++;
  358. }
  359. /*
  360. * pass 7
  361. * peep-hole on basic block
  362. */
  363. if(!debug['R'] || debug['P'])
  364. peep();
  365. /*
  366. * pass 8
  367. * recalculate pc
  368. */
  369. val = initpc;
  370. for(r = firstr; r != R; r = r1) {
  371. r->pc = val;
  372. p = r->prog;
  373. p1 = P;
  374. r1 = r->link;
  375. if(r1 != R)
  376. p1 = r1->prog;
  377. for(; p != p1; p = p->link) {
  378. switch(p->as) {
  379. default:
  380. val++;
  381. break;
  382. case ANOP:
  383. case ADATA:
  384. case AGLOBL:
  385. case ANAME:
  386. break;
  387. }
  388. }
  389. }
  390. pc = val;
  391. /*
  392. * fix up branches
  393. */
  394. if(debug['R'])
  395. if(bany(&addrs))
  396. print("addrs: %B\n", addrs);
  397. r1 = 0; /* set */
  398. for(r = firstr; r != R; r = r->link) {
  399. p = r->prog;
  400. if(p->to.type == D_BRANCH)
  401. p->to.offset = r->s2->pc;
  402. r1 = r;
  403. }
  404. /*
  405. * last pass
  406. * eliminate nops
  407. * free aux structures
  408. */
  409. for(p = firstr->prog; p != P; p = p->link){
  410. while(p->link && p->link->as == ANOP)
  411. p->link = p->link->link;
  412. }
  413. if(r1 != R) {
  414. r1->link = freer;
  415. freer = firstr;
  416. }
  417. }
  418. /*
  419. * add mov b,rn
  420. * just after r
  421. */
  422. void
  423. addmove(Reg *r, int bn, int rn, int f)
  424. {
  425. Prog *p, *p1;
  426. Adr *a;
  427. Var *v;
  428. p1 = alloc(sizeof(*p1));
  429. *p1 = zprog;
  430. p = r->prog;
  431. p1->link = p->link;
  432. p->link = p1;
  433. p1->lineno = p->lineno;
  434. v = var + bn;
  435. a = &p1->to;
  436. a->sym = v->sym;
  437. a->name = v->name;
  438. a->offset = v->offset;
  439. a->etype = v->etype;
  440. a->type = D_OREG;
  441. if(a->etype == TARRAY || a->sym == S)
  442. a->type = D_CONST;
  443. p1->as = AMOVW;
  444. if(v->etype == TCHAR || v->etype == TUCHAR)
  445. p1->as = AMOVB;
  446. if(v->etype == TSHORT || v->etype == TUSHORT)
  447. p1->as = AMOVH;
  448. if(v->etype == TFLOAT)
  449. p1->as = AFMOVS;
  450. if(v->etype == TDOUBLE)
  451. p1->as = AFMOVD;
  452. p1->from.type = D_REG;
  453. p1->from.reg = rn;
  454. if(rn >= NREG) {
  455. p1->from.type = D_FREG;
  456. p1->from.reg = rn-NREG;
  457. }
  458. if(!f) {
  459. p1->from = *a;
  460. *a = zprog.from;
  461. a->type = D_REG;
  462. a->reg = rn;
  463. if(rn >= NREG) {
  464. a->type = D_FREG;
  465. a->reg = rn-NREG;
  466. }
  467. if(v->etype == TUCHAR)
  468. p1->as = AMOVBZ;
  469. if(v->etype == TUSHORT)
  470. p1->as = AMOVHZ;
  471. }
  472. if(debug['R'])
  473. print("%P\t.a%P\n", p, p1);
  474. }
  475. Bits
  476. mkvar(Adr *a, int docon)
  477. {
  478. Var *v;
  479. int i, t, n, et, z;
  480. long o;
  481. Bits bit;
  482. Sym *s;
  483. t = a->type;
  484. if(t == D_REG && a->reg != NREG)
  485. regbits |= RtoB(a->reg);
  486. if(t == D_FREG && a->reg != NREG)
  487. regbits |= FtoB(a->reg);
  488. s = a->sym;
  489. o = a->offset;
  490. et = a->etype;
  491. if(s == S) {
  492. if(t != D_CONST || !docon || a->reg != NREG)
  493. goto none;
  494. et = TLONG;
  495. }
  496. if(t == D_CONST) {
  497. if(s == S && sval(o))
  498. goto none;
  499. }
  500. n = a->name;
  501. v = var;
  502. for(i=0; i<nvar; i++) {
  503. if(s == v->sym)
  504. if(n == v->name)
  505. if(o == v->offset)
  506. goto out;
  507. v++;
  508. }
  509. if(s)
  510. if(s->name[0] == '.')
  511. goto none;
  512. if(nvar >= NVAR) {
  513. if(debug['w'] > 1 && s)
  514. warn(Z, "variable not optimized: %s", s->name);
  515. goto none;
  516. }
  517. i = nvar;
  518. nvar++;
  519. v = &var[i];
  520. v->sym = s;
  521. v->offset = o;
  522. v->etype = et;
  523. v->name = n;
  524. if(debug['R'])
  525. print("bit=%2d et=%2d %D\n", i, et, a);
  526. out:
  527. bit = blsh(i);
  528. if(n == D_EXTERN || n == D_STATIC)
  529. for(z=0; z<BITS; z++)
  530. externs.b[z] |= bit.b[z];
  531. if(n == D_PARAM)
  532. for(z=0; z<BITS; z++)
  533. params.b[z] |= bit.b[z];
  534. if(v->etype != et || !typechlpfd[et]) /* funny punning */
  535. for(z=0; z<BITS; z++)
  536. addrs.b[z] |= bit.b[z];
  537. if(t == D_CONST) {
  538. if(s == S) {
  539. for(z=0; z<BITS; z++)
  540. consts.b[z] |= bit.b[z];
  541. return bit;
  542. }
  543. if(et != TARRAY)
  544. for(z=0; z<BITS; z++)
  545. addrs.b[z] |= bit.b[z];
  546. for(z=0; z<BITS; z++)
  547. params.b[z] |= bit.b[z];
  548. return bit;
  549. }
  550. if(t == D_OREG)
  551. return bit;
  552. none:
  553. return zbits;
  554. }
  555. void
  556. prop(Reg *r, Bits ref, Bits cal)
  557. {
  558. Reg *r1, *r2;
  559. int z;
  560. for(r1 = r; r1 != R; r1 = r1->p1) {
  561. for(z=0; z<BITS; z++) {
  562. ref.b[z] |= r1->refahead.b[z];
  563. if(ref.b[z] != r1->refahead.b[z]) {
  564. r1->refahead.b[z] = ref.b[z];
  565. change++;
  566. }
  567. cal.b[z] |= r1->calahead.b[z];
  568. if(cal.b[z] != r1->calahead.b[z]) {
  569. r1->calahead.b[z] = cal.b[z];
  570. change++;
  571. }
  572. }
  573. switch(r1->prog->as) {
  574. case ABL:
  575. for(z=0; z<BITS; z++) {
  576. cal.b[z] |= ref.b[z] | externs.b[z];
  577. ref.b[z] = 0;
  578. }
  579. break;
  580. case ATEXT:
  581. for(z=0; z<BITS; z++) {
  582. cal.b[z] = 0;
  583. ref.b[z] = 0;
  584. }
  585. break;
  586. case ARETURN:
  587. for(z=0; z<BITS; z++) {
  588. cal.b[z] = externs.b[z];
  589. ref.b[z] = 0;
  590. }
  591. }
  592. for(z=0; z<BITS; z++) {
  593. ref.b[z] = (ref.b[z] & ~r1->set.b[z]) |
  594. r1->use1.b[z] | r1->use2.b[z];
  595. cal.b[z] &= ~(r1->set.b[z] | r1->use1.b[z] | r1->use2.b[z]);
  596. r1->refbehind.b[z] = ref.b[z];
  597. r1->calbehind.b[z] = cal.b[z];
  598. }
  599. if(r1->active)
  600. break;
  601. r1->active = 1;
  602. }
  603. for(; r != r1; r = r->p1)
  604. for(r2 = r->p2; r2 != R; r2 = r2->p2link)
  605. prop(r2, r->refbehind, r->calbehind);
  606. }
  607. /*
  608. * find looping structure
  609. *
  610. * 1) find reverse postordering
  611. * 2) find approximate dominators,
  612. * the actual dominators if the flow graph is reducible
  613. * otherwise, dominators plus some other non-dominators.
  614. * See Matthew S. Hecht and Jeffrey D. Ullman,
  615. * "Analysis of a Simple Algorithm for Global Data Flow Problems",
  616. * Conf. Record of ACM Symp. on Principles of Prog. Langs, Boston, Massachusetts,
  617. * Oct. 1-3, 1973, pp. 207-217.
  618. * 3) find all nodes with a predecessor dominated by the current node.
  619. * such a node is a loop head.
  620. * recursively, all preds with a greater rpo number are in the loop
  621. */
  622. long
  623. postorder(Reg *r, Reg **rpo2r, long n)
  624. {
  625. Reg *r1;
  626. r->rpo = 1;
  627. r1 = r->s1;
  628. if(r1 && !r1->rpo)
  629. n = postorder(r1, rpo2r, n);
  630. r1 = r->s2;
  631. if(r1 && !r1->rpo)
  632. n = postorder(r1, rpo2r, n);
  633. rpo2r[n] = r;
  634. n++;
  635. return n;
  636. }
  637. long
  638. rpolca(long *idom, long rpo1, long rpo2)
  639. {
  640. long t;
  641. if(rpo1 == -1)
  642. return rpo2;
  643. while(rpo1 != rpo2){
  644. if(rpo1 > rpo2){
  645. t = rpo2;
  646. rpo2 = rpo1;
  647. rpo1 = t;
  648. }
  649. while(rpo1 < rpo2){
  650. t = idom[rpo2];
  651. if(t >= rpo2)
  652. sysfatal("bad idom");
  653. rpo2 = t;
  654. }
  655. }
  656. return rpo1;
  657. }
  658. int
  659. doms(long *idom, long r, long s)
  660. {
  661. while(s > r)
  662. s = idom[s];
  663. return s == r;
  664. }
  665. int
  666. loophead(long *idom, Reg *r)
  667. {
  668. long src;
  669. src = r->rpo;
  670. if(r->p1 != R && doms(idom, src, r->p1->rpo))
  671. return 1;
  672. for(r = r->p2; r != R; r = r->p2link)
  673. if(doms(idom, src, r->rpo))
  674. return 1;
  675. return 0;
  676. }
  677. void
  678. loopmark(Reg **rpo2r, long head, Reg *r)
  679. {
  680. if(r->rpo < head || r->active == head)
  681. return;
  682. r->active = head;
  683. r->loop += LOOP;
  684. if(r->p1 != R)
  685. loopmark(rpo2r, head, r->p1);
  686. for(r = r->p2; r != R; r = r->p2link)
  687. loopmark(rpo2r, head, r);
  688. }
  689. void
  690. loopit(Reg *r, long nr)
  691. {
  692. Reg *r1;
  693. long i, d, me;
  694. if(nr > maxnr) {
  695. rpo2r = alloc(nr * sizeof(Reg*));
  696. idom = alloc(nr * sizeof(long));
  697. maxnr = nr;
  698. }
  699. d = postorder(r, rpo2r, 0);
  700. if(d > nr)
  701. sysfatal("too many reg nodes");
  702. nr = d;
  703. for(i = 0; i < nr / 2; i++){
  704. r1 = rpo2r[i];
  705. rpo2r[i] = rpo2r[nr - 1 - i];
  706. rpo2r[nr - 1 - i] = r1;
  707. }
  708. for(i = 0; i < nr; i++)
  709. rpo2r[i]->rpo = i;
  710. idom[0] = 0;
  711. for(i = 0; i < nr; i++){
  712. r1 = rpo2r[i];
  713. me = r1->rpo;
  714. d = -1;
  715. if(r1->p1 != R && r1->p1->rpo < me)
  716. d = r1->p1->rpo;
  717. for(r1 = r1->p2; r1 != nil; r1 = r1->p2link)
  718. if(r1->rpo < me)
  719. d = rpolca(idom, d, r1->rpo);
  720. idom[i] = d;
  721. }
  722. for(i = 0; i < nr; i++){
  723. r1 = rpo2r[i];
  724. r1->loop++;
  725. if(r1->p2 != R && loophead(idom, r1))
  726. loopmark(rpo2r, i, r1);
  727. }
  728. }
  729. void
  730. synch(Reg *r, Bits dif)
  731. {
  732. Reg *r1;
  733. int z;
  734. for(r1 = r; r1 != R; r1 = r1->s1) {
  735. for(z=0; z<BITS; z++) {
  736. dif.b[z] = (dif.b[z] &
  737. ~(~r1->refbehind.b[z] & r1->refahead.b[z])) |
  738. r1->set.b[z] | r1->regdiff.b[z];
  739. if(dif.b[z] != r1->regdiff.b[z]) {
  740. r1->regdiff.b[z] = dif.b[z];
  741. change++;
  742. }
  743. }
  744. if(r1->active)
  745. break;
  746. r1->active = 1;
  747. for(z=0; z<BITS; z++)
  748. dif.b[z] &= ~(~r1->calbehind.b[z] & r1->calahead.b[z]);
  749. if(r1->s2 != R)
  750. synch(r1->s2, dif);
  751. }
  752. }
  753. ulong
  754. allreg(ulong b, Rgn *r)
  755. {
  756. Var *v;
  757. int i;
  758. v = var + r->varno;
  759. r->regno = 0;
  760. switch(v->etype) {
  761. default:
  762. diag(Z, "unknown etype %d/%d", bitno(b), v->etype);
  763. break;
  764. case TCHAR:
  765. case TUCHAR:
  766. case TSHORT:
  767. case TUSHORT:
  768. case TINT:
  769. case TUINT:
  770. case TLONG:
  771. case TULONG:
  772. case TIND:
  773. case TARRAY:
  774. i = BtoR(~b);
  775. if(i && r->cost > 0) {
  776. r->regno = i;
  777. return RtoB(i);
  778. }
  779. break;
  780. case TVLONG:
  781. case TDOUBLE:
  782. case TFLOAT:
  783. i = BtoF(~b);
  784. if(i && r->cost > 0) {
  785. r->regno = i+NREG;
  786. return FtoB(i);
  787. }
  788. break;
  789. }
  790. return 0;
  791. }
  792. void
  793. paint1(Reg *r, int bn)
  794. {
  795. Reg *r1;
  796. Prog *p;
  797. int z;
  798. ulong bb;
  799. z = bn/32;
  800. bb = 1L<<(bn%32);
  801. if(r->act.b[z] & bb)
  802. return;
  803. for(;;) {
  804. if(!(r->refbehind.b[z] & bb))
  805. break;
  806. r1 = r->p1;
  807. if(r1 == R)
  808. break;
  809. if(!(r1->refahead.b[z] & bb))
  810. break;
  811. if(r1->act.b[z] & bb)
  812. break;
  813. r = r1;
  814. }
  815. if(LOAD(r) & ~(r->set.b[z]&~(r->use1.b[z]|r->use2.b[z])) & bb) {
  816. change -= CLOAD * r->loop;
  817. if(debug['R'] && debug['v'])
  818. print("%ld%P\tld %B $%d\n", r->loop,
  819. r->prog, blsh(bn), change);
  820. }
  821. for(;;) {
  822. r->act.b[z] |= bb;
  823. p = r->prog;
  824. if(r->use1.b[z] & bb) {
  825. change += CREF * r->loop;
  826. if(p->to.type == D_FREG && p->as == AMOVW)
  827. change = -CINF; /* cant go Rreg to Freg */
  828. if(debug['R'] && debug['v'])
  829. print("%ld%P\tu1 %B $%d\n", r->loop,
  830. p, blsh(bn), change);
  831. }
  832. if((r->use2.b[z]|r->set.b[z]) & bb) {
  833. change += CREF * r->loop;
  834. if(p->from.type == D_FREG && p->as == AMOVW)
  835. change = -CINF; /* cant go Rreg to Freg */
  836. if(debug['R'] && debug['v'])
  837. print("%ld%P\tu2 %B $%d\n", r->loop,
  838. p, blsh(bn), change);
  839. }
  840. if(STORE(r) & r->regdiff.b[z] & bb) {
  841. change -= CLOAD * r->loop;
  842. if(debug['R'] && debug['v'])
  843. print("%ld%P\tst %B $%d\n", r->loop,
  844. p, blsh(bn), change);
  845. }
  846. if(r->refbehind.b[z] & bb)
  847. for(r1 = r->p2; r1 != R; r1 = r1->p2link)
  848. if(r1->refahead.b[z] & bb)
  849. paint1(r1, bn);
  850. if(!(r->refahead.b[z] & bb))
  851. break;
  852. r1 = r->s2;
  853. if(r1 != R)
  854. if(r1->refbehind.b[z] & bb)
  855. paint1(r1, bn);
  856. r = r->s1;
  857. if(r == R)
  858. break;
  859. if(r->act.b[z] & bb)
  860. break;
  861. if(!(r->refbehind.b[z] & bb))
  862. break;
  863. }
  864. }
  865. ulong
  866. paint2(Reg *r, int bn)
  867. {
  868. Reg *r1;
  869. int z;
  870. ulong bb, vreg;
  871. z = bn/32;
  872. bb = 1L << (bn%32);
  873. vreg = regbits;
  874. if(!(r->act.b[z] & bb))
  875. return vreg;
  876. for(;;) {
  877. if(!(r->refbehind.b[z] & bb))
  878. break;
  879. r1 = r->p1;
  880. if(r1 == R)
  881. break;
  882. if(!(r1->refahead.b[z] & bb))
  883. break;
  884. if(!(r1->act.b[z] & bb))
  885. break;
  886. r = r1;
  887. }
  888. for(;;) {
  889. r->act.b[z] &= ~bb;
  890. vreg |= r->regu;
  891. if(r->refbehind.b[z] & bb)
  892. for(r1 = r->p2; r1 != R; r1 = r1->p2link)
  893. if(r1->refahead.b[z] & bb)
  894. vreg |= paint2(r1, bn);
  895. if(!(r->refahead.b[z] & bb))
  896. break;
  897. r1 = r->s2;
  898. if(r1 != R)
  899. if(r1->refbehind.b[z] & bb)
  900. vreg |= paint2(r1, bn);
  901. r = r->s1;
  902. if(r == R)
  903. break;
  904. if(!(r->act.b[z] & bb))
  905. break;
  906. if(!(r->refbehind.b[z] & bb))
  907. break;
  908. }
  909. return vreg;
  910. }
  911. void
  912. paint3(Reg *r, int bn, long rb, int rn)
  913. {
  914. Reg *r1;
  915. Prog *p;
  916. int z;
  917. ulong bb;
  918. z = bn/32;
  919. bb = 1L << (bn%32);
  920. if(r->act.b[z] & bb)
  921. return;
  922. for(;;) {
  923. if(!(r->refbehind.b[z] & bb))
  924. break;
  925. r1 = r->p1;
  926. if(r1 == R)
  927. break;
  928. if(!(r1->refahead.b[z] & bb))
  929. break;
  930. if(r1->act.b[z] & bb)
  931. break;
  932. r = r1;
  933. }
  934. if(LOAD(r) & ~(r->set.b[z] & ~(r->use1.b[z]|r->use2.b[z])) & bb)
  935. addmove(r, bn, rn, 0);
  936. for(;;) {
  937. r->act.b[z] |= bb;
  938. p = r->prog;
  939. if(r->use1.b[z] & bb) {
  940. if(debug['R'])
  941. print("%P", p);
  942. addreg(&p->from, rn);
  943. if(debug['R'])
  944. print("\t.c%P\n", p);
  945. }
  946. if((r->use2.b[z]|r->set.b[z]) & bb) {
  947. if(debug['R'])
  948. print("%P", p);
  949. addreg(&p->to, rn);
  950. if(debug['R'])
  951. print("\t.c%P\n", p);
  952. }
  953. if(STORE(r) & r->regdiff.b[z] & bb)
  954. addmove(r, bn, rn, 1);
  955. r->regu |= rb;
  956. if(r->refbehind.b[z] & bb)
  957. for(r1 = r->p2; r1 != R; r1 = r1->p2link)
  958. if(r1->refahead.b[z] & bb)
  959. paint3(r1, bn, rb, rn);
  960. if(!(r->refahead.b[z] & bb))
  961. break;
  962. r1 = r->s2;
  963. if(r1 != R)
  964. if(r1->refbehind.b[z] & bb)
  965. paint3(r1, bn, rb, rn);
  966. r = r->s1;
  967. if(r == R)
  968. break;
  969. if(r->act.b[z] & bb)
  970. break;
  971. if(!(r->refbehind.b[z] & bb))
  972. break;
  973. }
  974. }
  975. void
  976. addreg(Adr *a, int rn)
  977. {
  978. a->sym = 0;
  979. a->name = D_NONE;
  980. a->type = D_REG;
  981. a->reg = rn;
  982. if(rn >= NREG) {
  983. a->type = D_FREG;
  984. a->reg = rn-NREG;
  985. }
  986. }
  987. /*
  988. * track register variables including external registers:
  989. * bit reg
  990. * 0 R7
  991. * 1 R8
  992. * ... ...
  993. * 21 R28
  994. */
  995. long
  996. RtoB(int r)
  997. {
  998. if(r >= REGMIN && r <= REGMAX)
  999. return 1L << (r-REGMIN);
  1000. return 0;
  1001. }
  1002. int
  1003. BtoR(long b)
  1004. {
  1005. b &= 0x001fffffL;
  1006. if(b == 0)
  1007. return 0;
  1008. return bitno(b) + REGMIN;
  1009. }
  1010. /*
  1011. * bit reg
  1012. * 22 F17
  1013. * 23 F18
  1014. * ... ...
  1015. * 31 F26
  1016. */
  1017. long
  1018. FtoB(int f)
  1019. {
  1020. if(f < FREGMIN || f > FREGEXT)
  1021. return 0;
  1022. return 1L << (f - FREGMIN + 22);
  1023. }
  1024. int
  1025. BtoF(long b)
  1026. {
  1027. b &= 0xffc00000L;
  1028. if(b == 0)
  1029. return 0;
  1030. return bitno(b) - 22 + FREGMIN;
  1031. }