reg.c 19 KB

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