reg.c 19 KB

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