reg.c 18 KB

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