reg.c 22 KB

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