optim.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803
  1. #include "limbo.h"
  2. #define bzero bbzero /* bsd name space pollution */
  3. /*
  4. (r, s) := f(); => r, s have def on same pc
  5. s = g(); => this def kills previous r def (and s def)
  6. solution: r has def pc, s has def pc+1 and next instruction has pc pc+2
  7. */
  8. #define BLEN (8*sizeof(ulong))
  9. #define BSHIFT 5 /* assumes ulong 4 */
  10. #define BMASK (BLEN-1)
  11. #define SIGN(n) (1<<(n-1))
  12. #define MSK(n) (SIGN(n)|(SIGN(n)-1))
  13. #define MASK(a, b) (MSK((b)-(a)+1)<<(a))
  14. #define isnilsrc(s) ((s)->start.line == 0 && (s)->stop.line == 0 && (s)->start.pos == 0 && (s)->stop.pos == 0)
  15. #define limbovar(d) ((d)->sym->name[0] != '.')
  16. #define structure(t) ((t)->kind == Tadt || (t)->kind == Ttuple)
  17. enum
  18. {
  19. Bclr,
  20. Band,
  21. Bandinv,
  22. Bstore,
  23. Bandrev,
  24. Bnoop,
  25. Bxor,
  26. Bor,
  27. Bnor,
  28. Bequiv,
  29. Binv,
  30. Bimpby,
  31. Brev,
  32. Bimp,
  33. Bnand,
  34. Bset,
  35. };
  36. enum
  37. {
  38. Suse = 1,
  39. Muse = 2,
  40. Duse = 4,
  41. Sdef = 8,
  42. Mdef = 16,
  43. Ddef = 32,
  44. Tuse1 = 64, /* fixed point temporary */
  45. Tuse2 = 128, /* fixed point temporary */
  46. Mduse = 256, /* D used if M nil */
  47. None = 0,
  48. Unop = Suse|Ddef,
  49. Cunop = Muse|Ddef,
  50. Threop = Suse|Muse|Ddef,
  51. Binop = Suse|Muse|Ddef|Mduse,
  52. Mbinop = Suse|Mdef|Duse, /* strange */
  53. Abinop=Suse|Duse|Ddef,
  54. Mabinop = Suse|Muse|Duse|Ddef,
  55. Use1 = Suse,
  56. Use2 = Suse|Duse,
  57. Use3 = Suse|Muse|Duse,
  58. };
  59. enum
  60. {
  61. Sshift = 10,
  62. Mshift = 5,
  63. Dshift = 0,
  64. };
  65. #define S(x) ((x)<<Sshift)
  66. #define M(x) ((x)<<Mshift)
  67. #define D(x) ((x)<<Dshift)
  68. #define SS(x) (((x)>>Sshift)&0x1f)
  69. #define SM(x) (((x)>>Mshift)&0x1f)
  70. #define SD(x) (((x)>>Dshift)&0x1f)
  71. enum
  72. {
  73. I = 0, /* ignore */
  74. B = 1, /* byte */
  75. W = 4, /* int */
  76. P = 4, /* pointer */
  77. A = 4, /* array */
  78. C = 4, /* string */
  79. X = 4, /* fixed */
  80. R = 4, /* float */
  81. L = 8, /* big */
  82. F = 8, /* real */
  83. Sh = 2, /* short */
  84. Pc = 4, /* pc */
  85. Mp = 16, /* memory */
  86. Bop2 = S(B)|D(B),
  87. Bop = S(B)|M(B)|D(B),
  88. Bopb = S(B)|M(B)|D(Pc),
  89. Wop2 = S(W)|D(W),
  90. Wop = S(W)|M(W)|D(W),
  91. Wopb = S(W)|M(W)|D(Pc),
  92. Lop2 = S(L)|D(L),
  93. Lop = S(L)|M(L)|D(L),
  94. Lopb = S(L)|M(L)|D(Pc),
  95. Cop2 = Wop2,
  96. Cop = Wop,
  97. Copb = Wopb,
  98. Fop2 = Lop2,
  99. Fop = Lop,
  100. Fopb = Lopb,
  101. Xop = Wop,
  102. };
  103. typedef struct Array Array;
  104. typedef struct Bits Bits;
  105. typedef struct Blist Blist;
  106. typedef struct Block Block;
  107. typedef struct Idlist Idlist;
  108. typedef struct Optab Optab;
  109. struct Array
  110. {
  111. int n;
  112. int m;
  113. Block **a;
  114. };
  115. struct Bits
  116. {
  117. int n;
  118. ulong *b;
  119. };
  120. struct Blist
  121. {
  122. Block *block;
  123. Blist *next;
  124. };
  125. struct Block
  126. {
  127. int dfn;
  128. int flags;
  129. Inst *first;
  130. Inst *last;
  131. Block *prev;
  132. Block *next;
  133. Blist *pred;
  134. Blist *succ;
  135. Bits kill;
  136. Bits gen;
  137. Bits in;
  138. Bits out;
  139. };
  140. struct Idlist
  141. {
  142. int id;
  143. Idlist *next;
  144. };
  145. struct Optab
  146. {
  147. short flags;
  148. short size;
  149. };
  150. Block zblock;
  151. Decl *regdecls;
  152. Idlist *frelist;
  153. Idlist *deflist;
  154. Idlist *uselist;
  155. static void
  156. addlist(Idlist **hd, int id)
  157. {
  158. Idlist *il;
  159. if(frelist == nil)
  160. il = (Idlist*)malloc(sizeof(Idlist));
  161. else{
  162. il = frelist;
  163. frelist = frelist->next;
  164. }
  165. il->id = id;
  166. il->next = *hd;
  167. *hd = il;
  168. }
  169. static void
  170. freelist(Idlist **hd)
  171. {
  172. Idlist *il;
  173. for(il = *hd; il != nil && il->next != nil; il = il->next)
  174. ;
  175. if(il != nil){
  176. il->next = frelist;
  177. frelist = *hd;
  178. *hd = nil;
  179. }
  180. }
  181. Optab opflags[] = {
  182. /* INOP */ None, 0,
  183. /* IALT */ Unop, S(Mp)|D(W),
  184. /* INBALT */ Unop, S(Mp)|D(W),
  185. /* IGOTO */ Use2, S(W)|D(I),
  186. /* ICALL */ Use2, S(P)|D(Pc),
  187. /* IFRAME */ Unop, S(W)|D(P),
  188. /* ISPAWN */ Use2, S(P)|D(Pc),
  189. /* IRUNT */ None, 0,
  190. /* ILOAD */ Threop, S(C)|M(P)|D(P),
  191. /* IMCALL */ Use3, S(P)|M(W)|D(P),
  192. /* IMSPAWN */ Use3, S(P)|M(W)|D(P),
  193. /* IMFRAME */ Threop, S(P)|M(W)|D(P),
  194. /* IRET */ None, 0,
  195. /* IJMP */ Duse, D(Pc),
  196. /* ICASE */ Use2, S(W)|D(I),
  197. /* IEXIT */ None, 0,
  198. /* INEW */ Unop, S(W)|D(P),
  199. /* INEWA */ Threop, S(W)|M(W)|D(P),
  200. /* INEWCB */ Cunop, M(W)|D(P),
  201. /* INEWCW */ Cunop, M(W)|D(P),
  202. /* INEWCF */ Cunop, M(W)|D(P),
  203. /* INEWCP */ Cunop, M(W)|D(P),
  204. /* INEWCM */ Threop, S(W)|M(W)|D(P),
  205. /* INEWCMP */ Threop, S(W)|M(W)|D(P),
  206. /* ISEND */ Use2, S(Mp)|D(P),
  207. /* IRECV */ Unop, S(P)|D(Mp),
  208. /* ICONSB */ Abinop, S(B)|D(P),
  209. /* ICONSW */ Abinop, S(W)|D(P),
  210. /* ICONSP */ Abinop, S(P)|D(P),
  211. /* ICONSF */ Abinop, S(F)|D(P),
  212. /* ICONSM */ Mabinop, S(Mp)|M(W)|D(P),
  213. /* ICONSMP */ Mabinop, S(Mp)|M(W)|D(P),
  214. /* IHEADB */ Unop, S(P)|D(B),
  215. /* IHEADW */ Unop, S(P)|D(W),
  216. /* IHEADP */ Unop, S(P)|D(P),
  217. /* IHEADF */ Unop, S(P)|D(F),
  218. /* IHEADM */ Threop, S(P)|M(W)|D(Mp),
  219. /* IHEADMP */ Threop, S(P)|M(W)|D(Mp),
  220. /* ITAIL */ Unop, S(P)|D(P),
  221. /* ILEA */ Ddef, S(Mp)|D(P), /* S done specially cos of ALT */
  222. /* IINDX */ Mbinop, S(P)|M(P)|D(W),
  223. /* IMOVP */ Unop, S(P)|D(P),
  224. /* IMOVM */ Threop, S(Mp)|M(W)|D(Mp),
  225. /* IMOVMP */ Threop, S(Mp)|M(W)|D(Mp),
  226. /* IMOVB */ Unop, Bop2,
  227. /* IMOVW */ Unop, Wop2,
  228. /* IMOVF */ Unop, Fop2,
  229. /* ICVTBW */ Unop, S(B)|D(W),
  230. /* ICVTWB */ Unop, S(W)|D(B),
  231. /* ICVTFW */ Unop, S(F)|D(W),
  232. /* ICVTWF */ Unop, S(W)|D(F),
  233. /* ICVTCA */ Unop, S(C)|D(A),
  234. /* ICVTAC */ Unop, S(A)|D(C),
  235. /* ICVTWC */ Unop, S(W)|D(C),
  236. /* ICVTCW */ Unop, S(C)|D(W),
  237. /* ICVTFC */ Unop, S(F)|D(C),
  238. /* ICVTCF */ Unop, S(C)|D(F),
  239. /* IADDB */ Binop, Bop,
  240. /* IADDW */ Binop, Wop,
  241. /* IADDF */ Binop, Fop,
  242. /* ISUBB */ Binop, Bop,
  243. /* ISUBW */ Binop, Wop,
  244. /* ISUBF */ Binop, Fop,
  245. /* IMULB */ Binop, Bop,
  246. /* IMULW */ Binop, Wop,
  247. /* IMULF */ Binop, Fop,
  248. /* IDIVB */ Binop, Bop,
  249. /* IDIVW */ Binop, Wop,
  250. /* IDIVF */ Binop, Fop,
  251. /* IMODW */ Binop, Wop,
  252. /* IMODB */ Binop, Bop,
  253. /* IANDB */ Binop, Bop,
  254. /* IANDW */ Binop, Wop,
  255. /* IORB */ Binop, Bop,
  256. /* IORW */ Binop, Wop,
  257. /* IXORB */ Binop, Bop,
  258. /* IXORW */ Binop, Wop,
  259. /* ISHLB */ Binop, S(W)|M(B)|D(B),
  260. /* ISHLW */ Binop, Wop,
  261. /* ISHRB */ Binop, S(W)|M(B)|D(B),
  262. /* ISHRW */ Binop, Wop,
  263. /* IINSC */ Mabinop, S(W)|M(W)|D(C),
  264. /* IINDC */ Threop, S(C)|M(W)|D(W),
  265. /* IADDC */ Binop, Cop,
  266. /* ILENC */ Unop, S(C)|D(W),
  267. /* ILENA */ Unop, S(A)|D(W),
  268. /* ILENL */ Unop, S(P)|D(W),
  269. /* IBEQB */ Use3, Bopb,
  270. /* IBNEB */ Use3, Bopb,
  271. /* IBLTB */ Use3, Bopb,
  272. /* IBLEB */ Use3, Bopb,
  273. /* IBGTB */ Use3, Bopb,
  274. /* IBGEB */ Use3, Bopb,
  275. /* IBEQW */ Use3, Wopb,
  276. /* IBNEW */ Use3, Wopb,
  277. /* IBLTW */ Use3, Wopb,
  278. /* IBLEW */ Use3, Wopb,
  279. /* IBGTW */ Use3, Wopb,
  280. /* IBGEW */ Use3, Wopb,
  281. /* IBEQF */ Use3, Fopb,
  282. /* IBNEF */ Use3, Fopb,
  283. /* IBLTF */ Use3, Fopb,
  284. /* IBLEF */ Use3, Fopb,
  285. /* IBGTF */ Use3, Fopb,
  286. /* IBGEF */ Use3, Fopb,
  287. /* IBEQC */ Use3, Copb,
  288. /* IBNEC */ Use3, Copb,
  289. /* IBLTC */ Use3, Copb,
  290. /* IBLEC */ Use3, Copb,
  291. /* IBGTC */ Use3, Copb,
  292. /* IBGEC */ Use3, Copb,
  293. /* ISLICEA */ Mabinop, S(W)|M(W)|D(P),
  294. /* ISLICELA */ Use3, S(P)|M(W)|D(P),
  295. /* ISLICEC */ Mabinop, S(W)|M(W)|D(C),
  296. /* IINDW */ Mbinop, S(P)|M(P)|D(W),
  297. /* IINDF */ Mbinop, S(P)|M(P)|D(W),
  298. /* IINDB */ Mbinop, S(P)|M(P)|D(W),
  299. /* INEGF */ Unop, Fop2,
  300. /* IMOVL */ Unop, Lop2,
  301. /* IADDL */ Binop, Lop,
  302. /* ISUBL */ Binop, Lop,
  303. /* IDIVL */ Binop, Lop,
  304. /* IMODL */ Binop, Lop,
  305. /* IMULL */ Binop, Lop,
  306. /* IANDL */ Binop, Lop,
  307. /* IORL */ Binop, Lop,
  308. /* IXORL */ Binop, Lop,
  309. /* ISHLL */ Binop, S(W)|M(L)|D(L),
  310. /* ISHRL */ Binop, S(W)|M(L)|D(L),
  311. /* IBNEL */ Use3, Lopb,
  312. /* IBLTL */ Use3, Lopb,
  313. /* IBLEL */ Use3, Lopb,
  314. /* IBGTL */ Use3, Lopb,
  315. /* IBGEL */ Use3, Lopb,
  316. /* IBEQL */ Use3, Lopb,
  317. /* ICVTLF */ Unop, S(L)|D(F),
  318. /* ICVTFL */ Unop, S(F)|D(L),
  319. /* ICVTLW */ Unop, S(L)|D(W),
  320. /* ICVTWL */ Unop, S(W)|D(L),
  321. /* ICVTLC */ Unop, S(L)|D(C),
  322. /* ICVTCL */ Unop, S(C)|D(L),
  323. /* IHEADL */ Unop, S(P)|D(L),
  324. /* ICONSL */ Abinop, S(L)|D(P),
  325. /* INEWCL */ Cunop, M(W)|D(P),
  326. /* ICASEC */ Use2, S(C)|D(I),
  327. /* IINDL */ Mbinop, S(P)|M(P)|D(W),
  328. /* IMOVPC */ Unop, S(W)|D(P),
  329. /* ITCMP */ Use2, S(P)|D(P),
  330. /* IMNEWZ */ Threop, S(P)|M(W)|D(P),
  331. /* ICVTRF */ Unop, S(R)|D(F),
  332. /* ICVTFR */ Unop, S(F)|D(R),
  333. /* ICVTWS */ Unop, S(W)|D(Sh),
  334. /* ICVTSW */ Unop, S(Sh)|D(W),
  335. /* ILSRW */ Binop, Wop,
  336. /* ILSRL */ Binop, S(W)|M(L)|D(L),
  337. /* IECLR */ None, 0,
  338. /* INEWZ */ Unop, S(W)|D(P),
  339. /* INEWAZ */ Threop, S(W)|M(W)|D(P),
  340. /* IRAISE */ Use1, S(P),
  341. /* ICASEL */ Use2, S(L)|D(I),
  342. /* IMULX */ Binop|Tuse2, Xop,
  343. /* IDIVX */ Binop|Tuse2, Xop,
  344. /* ICVTXX */ Threop, Xop,
  345. /* IMULX0 */ Binop|Tuse1|Tuse2, Xop,
  346. /* IDIVX0 */ Binop|Tuse1|Tuse2, Xop,
  347. /* ICVTXX0 */ Threop|Tuse1, Xop,
  348. /* IMULX1 */ Binop|Tuse1|Tuse2, Xop,
  349. /* IDIVX1 */ Binop|Tuse1|Tuse2, Xop,
  350. /* ICVTXX1 */ Threop|Tuse1, Xop,
  351. /* ICVTFX */ Threop, S(F)|M(F)|D(X),
  352. /* ICVTXF */ Threop, S(X)|M(F)|D(F),
  353. /* IEXPW */ Binop, S(W)|M(W)|D(W),
  354. /* IEXPL */ Binop, S(W)|M(L)|D(L),
  355. /* IEXPF */ Binop, S(W)|M(F)|D(F),
  356. /* ISELF */ Ddef, D(P),
  357. /* IEXC */ None, 0,
  358. /* IEXC0 */ None, 0,
  359. /* INOOP */ None, 0,
  360. };
  361. /*
  362. static int
  363. pop(int i)
  364. {
  365. i = (i & 0x55555555) + ((i>>1) & 0x55555555);
  366. i = (i & 0x33333333) + ((i>>2) & 0x33333333);
  367. i = (i & 0x0F0F0F0F) + ((i>>4) & 0x0F0F0F0F);
  368. i = (i & 0x00FF00FF) + ((i>>8) & 0x00FF00FF);
  369. i = (i & 0x0000FFFF) + ((i>>16) & 0x0000FFFF);
  370. return i;
  371. }
  372. */
  373. static int
  374. bitc(uint x)
  375. {
  376. uint n;
  377. n = (x>>1)&0x77777777;
  378. x -= n;
  379. n = (n>>1)&0x77777777;
  380. x -= n;
  381. n = (n>>1)&0x77777777;
  382. x -= n;
  383. x = (x+(x>>4))&0x0f0f0f0f;
  384. x *= 0x01010101;
  385. return x>>24;
  386. }
  387. /*
  388. static int
  389. top(uint x)
  390. {
  391. int i;
  392. for(i = -1; x; i++)
  393. x >>= 1;
  394. return i;
  395. }
  396. */
  397. static int
  398. topb(uint x)
  399. {
  400. int i;
  401. if(x == 0)
  402. return -1;
  403. i = 0;
  404. if(x&0xffff0000){
  405. i |= 16;
  406. x >>= 16;
  407. }
  408. if(x&0xff00){
  409. i |= 8;
  410. x >>= 8;
  411. }
  412. if(x&0xf0){
  413. i |= 4;
  414. x >>= 4;
  415. }
  416. if(x&0xc){
  417. i |= 2;
  418. x >>= 2;
  419. }
  420. if(x&0x2)
  421. i |= 1;
  422. return i;
  423. }
  424. /*
  425. static int
  426. lowb(uint x)
  427. {
  428. int i;
  429. if(x == 0)
  430. return -1;
  431. for(i = BLEN; x; i--)
  432. x <<= 1;
  433. return i;
  434. }
  435. */
  436. static int
  437. lowb(uint x)
  438. {
  439. int i;
  440. if(x == 0)
  441. return -1;
  442. i = 0;
  443. if((x&0xffff) == 0){
  444. i |= 16;
  445. x >>= 16;
  446. }
  447. if((x&0xff) == 0){
  448. i |= 8;
  449. x >>= 8;
  450. }
  451. if((x&0xf) == 0){
  452. i |= 4;
  453. x >>= 4;
  454. }
  455. if((x&0x3) == 0){
  456. i |= 2;
  457. x >>= 2;
  458. }
  459. return i+1-(x&1);
  460. }
  461. static void
  462. pbit(int x, int n)
  463. {
  464. int i, m;
  465. m = 1;
  466. for(i = 0; i < BLEN; i++){
  467. if(x&m)
  468. print("%d ", i+n);
  469. m <<= 1;
  470. }
  471. }
  472. static ulong
  473. bop(int o, ulong s, ulong d)
  474. {
  475. switch(o){
  476. case Bclr: return 0;
  477. case Band: return s & d;
  478. case Bandinv: return s & ~d;
  479. case Bstore: return s;
  480. case Bandrev: return ~s & d;
  481. case Bnoop: return d;
  482. case Bxor: return s ^ d;
  483. case Bor: return s | d;
  484. case Bnor: return ~(s | d);
  485. case Bequiv: return ~(s ^ d);
  486. case Binv: return ~d;
  487. case Bimpby: return s | ~d;
  488. case Brev: return ~s;
  489. case Bimp: return ~s | d;
  490. case Bnand: return ~(s & d);
  491. case Bset: return 0xffffffff;
  492. }
  493. return 0;
  494. }
  495. static Bits
  496. bnew(int n, int bits)
  497. {
  498. Bits b;
  499. if(bits)
  500. b.n = (n+BLEN-1)>>BSHIFT;
  501. else
  502. b.n = n;
  503. b.b = allocmem(b.n*sizeof(ulong));
  504. memset(b.b, 0, b.n*sizeof(ulong));
  505. return b;
  506. }
  507. static void
  508. bfree(Bits b)
  509. {
  510. free(b.b);
  511. }
  512. static void
  513. bset(Bits b, int n)
  514. {
  515. b.b[n>>BSHIFT] |= 1<<(n&BMASK);
  516. }
  517. static void
  518. bclr(Bits b, int n)
  519. {
  520. b.b[n>>BSHIFT] &= ~(1<<(n&BMASK));
  521. }
  522. static int
  523. bmem(Bits b, int n)
  524. {
  525. return b.b[n>>BSHIFT] & (1<<(n&BMASK));
  526. }
  527. static void
  528. bsets(Bits b, int m, int n)
  529. {
  530. int i, c1, c2;
  531. c1 = m>>BSHIFT;
  532. c2 = n>>BSHIFT;
  533. m &= BMASK;
  534. n &= BMASK;
  535. if(c1 == c2){
  536. b.b[c1] |= MASK(m, n);
  537. return;
  538. }
  539. for(i = c1+1; i < c2; i++)
  540. b.b[i] = 0xffffffff;
  541. b.b[c1] |= MASK(m, BLEN-1);
  542. b.b[c2] |= MASK(0, n);
  543. }
  544. static void
  545. bclrs(Bits b, int m, int n)
  546. {
  547. int i, c1, c2;
  548. if(n < 0)
  549. n = (b.n<<BSHIFT)-1;
  550. c1 = m>>BSHIFT;
  551. c2 = n>>BSHIFT;
  552. m &= BMASK;
  553. n &= BMASK;
  554. if(c1 == c2){
  555. b.b[c1] &= ~MASK(m, n);
  556. return;
  557. }
  558. for(i = c1+1; i < c2; i++)
  559. b.b[i] = 0;
  560. b.b[c1] &= ~MASK(m, BLEN-1);
  561. b.b[c2] &= ~MASK(0, n);
  562. }
  563. /* b = a op b */
  564. static Bits
  565. boper(int o, Bits a, Bits b)
  566. {
  567. int i, n;
  568. n = a.n;
  569. if(b.n != n)
  570. fatal("boper %d %d %d", o, a.n, b.n);
  571. for(i = 0; i < n; i++)
  572. b.b[i] = bop(o, a.b[i], b.b[i]);
  573. return b;
  574. }
  575. static int
  576. beq(Bits a, Bits b)
  577. {
  578. int i, n;
  579. n = a.n;
  580. for(i = 0; i < n; i++)
  581. if(a.b[i] != b.b[i])
  582. return 0;
  583. return 1;
  584. }
  585. static int
  586. bzero(Bits b)
  587. {
  588. int i, n;
  589. n = b.n;
  590. for(i = 0; i < n; i++)
  591. if(b.b[i] != 0)
  592. return 0;
  593. return 1;
  594. }
  595. static int
  596. bitcnt(Bits b)
  597. {
  598. int i, m, n;
  599. m = b.n;
  600. n = 0;
  601. for(i = 0; i < m; i++)
  602. n += bitc(b.b[i]);
  603. return n;
  604. }
  605. static int
  606. topbit(Bits b)
  607. {
  608. int i, n;
  609. n = b.n;
  610. for(i = n-1; i >= 0; i--)
  611. if(b.b[i] != 0)
  612. return (i<<BSHIFT)+topb(b.b[i]);
  613. return -1;
  614. }
  615. static int
  616. lowbit(Bits b)
  617. {
  618. int i, n;
  619. n = b.n;
  620. for(i = 0; i < n; i++)
  621. if(b.b[i] != 0)
  622. return (i<<BSHIFT)+lowb(b.b[i]);
  623. return -1;
  624. }
  625. static void
  626. pbits(Bits b)
  627. {
  628. int i, n;
  629. n = b.n;
  630. for(i = 0; i < n; i++)
  631. pbit(b.b[i], i<<BSHIFT);
  632. }
  633. static char*
  634. decname(Decl *d)
  635. {
  636. if(d->sym == nil)
  637. return "<nil>";
  638. return d->sym->name;
  639. }
  640. static void
  641. warning(Inst *i, char *s, Decl *d, Decl *sd)
  642. {
  643. int n;
  644. char *f;
  645. Decl *ds;
  646. n = 0;
  647. for(ds = sd; ds != nil; ds = ds->next)
  648. if(ds->link == d)
  649. n += strlen(ds->sym->name)+1;
  650. if(n == 0){
  651. warn(i->src.start, "%s: %s", d->sym->name, s);
  652. return;
  653. }
  654. n += strlen(d->sym->name);
  655. f = malloc(n+1);
  656. strcpy(f, d->sym->name);
  657. for(ds = sd; ds != nil; ds = ds->next){
  658. if(ds->link == d){
  659. strcat(f, "/");
  660. strcat(f, ds->sym->name);
  661. }
  662. }
  663. warn(i->src.start, "%s: %s", f, s);
  664. free(f);
  665. }
  666. static int
  667. inspc(Inst *in)
  668. {
  669. int n;
  670. Inst *i;
  671. n = 0;
  672. for(i = in; i != nil; i = i->next)
  673. i->pc = n++;
  674. return n;
  675. }
  676. static Inst*
  677. pc2i(Block *b, int pc)
  678. {
  679. Inst *i;
  680. for( ; b != nil; b = b->next){
  681. if(pc > b->last->pc)
  682. continue;
  683. for(i = b->first; ; i = i->next){
  684. if(i->pc == pc)
  685. return i;
  686. if(i == b->last)
  687. fatal("pc2i a");
  688. }
  689. }
  690. fatal("pc2i b");
  691. return nil;
  692. }
  693. static void
  694. padr(int am, Addr *a, Inst *br)
  695. {
  696. long reg;
  697. if(br != nil){
  698. print("$%ld", br->pc);
  699. return;
  700. }
  701. reg = a->reg;
  702. if(a->decl != nil && am != Adesc)
  703. reg += a->decl->offset;
  704. switch(am){
  705. case Anone:
  706. print("-");
  707. break;
  708. case Aimm:
  709. case Apc:
  710. case Adesc:
  711. print("$%ld", a->offset);
  712. break;
  713. case Aoff:
  714. print("$%ld", a->decl->iface->offset);
  715. break;
  716. case Anoff:
  717. print("-$%ld", a->decl->iface->offset);
  718. break;
  719. case Afp:
  720. print("%ld(fp)", reg);
  721. break;
  722. case Afpind:
  723. print("%ld(%ld(fp))", a->offset, reg);
  724. break;
  725. case Amp:
  726. print("%ld(mp)", reg);
  727. break;
  728. case Ampind:
  729. print("%ld(%ld(mp))", a->offset, reg);
  730. break;
  731. case Aldt:
  732. print("$%ld", reg);
  733. break;
  734. case Aerr:
  735. default:
  736. print("%ld(%ld(?%d?))", a->offset, reg, am);
  737. break;
  738. }
  739. }
  740. static void
  741. pins(Inst *i)
  742. {
  743. /* print("%L %ld ", i->src.start, i->pc); */
  744. print(" %ld ", i->pc);
  745. if(i->op < MAXDIS)
  746. print("%s", instname[i->op]);
  747. else
  748. print("noop");
  749. print(" ");
  750. padr(i->sm, &i->s, nil);
  751. print(", ");
  752. padr(i->mm, &i->m, nil);
  753. print(", ");
  754. padr(i->dm, &i->d, i->branch);
  755. print("\n");
  756. }
  757. static void
  758. blfree(Blist *bl)
  759. {
  760. Blist *nbl;
  761. for( ; bl != nil; bl = nbl){
  762. nbl = bl->next;
  763. free(bl);
  764. }
  765. }
  766. static void
  767. freebits(Bits *bs, int nv)
  768. {
  769. int i;
  770. for(i = 0; i < nv; i++)
  771. bfree(bs[i]);
  772. free(bs);
  773. }
  774. static void
  775. freeblks(Block *b)
  776. {
  777. Block *nb;
  778. for( ; b != nil; b = nb){
  779. blfree(b->pred);
  780. blfree(b->succ);
  781. bfree(b->kill);
  782. bfree(b->gen);
  783. bfree(b->in);
  784. bfree(b->out);
  785. nb = b->next;
  786. free(b);
  787. }
  788. }
  789. static int
  790. len(Decl *d)
  791. {
  792. int n;
  793. n = 0;
  794. for( ; d != nil; d = d->next)
  795. n++;
  796. return n;
  797. }
  798. static Bits*
  799. allocbits(int nv, int npc)
  800. {
  801. int i;
  802. Bits *defs;
  803. defs = (Bits*)allocmem(nv*sizeof(Bits));
  804. for(i = 0; i < nv; i++)
  805. defs[i] = bnew(npc, 1);
  806. return defs;
  807. }
  808. static int
  809. bitcount(Bits *bs, int nv)
  810. {
  811. int i, n;
  812. n = 0;
  813. for(i = 0; i < nv; i++)
  814. n += bitcnt(bs[i]);
  815. return n;
  816. }
  817. static Block*
  818. mkblock(Inst *i)
  819. {
  820. Block *b;
  821. b = allocmem(sizeof(Block));
  822. *b = zblock;
  823. b->first = b->last = i;
  824. return b;
  825. }
  826. static Blist*
  827. mkblist(Block *b, Blist *nbl)
  828. {
  829. Blist *bl;
  830. bl = allocmem(sizeof(Blist));
  831. bl->block = b;
  832. bl->next = nbl;
  833. return bl;
  834. }
  835. static void
  836. leader(Inst *i, Array *ab)
  837. {
  838. int m, n;
  839. Block *b, **a;
  840. if(i != nil && i->pc == 0){
  841. if((n = ab->n) == (m = ab->m)){
  842. a = ab->a;
  843. ab->a = allocmem(2*m*sizeof(Block*));
  844. memcpy(ab->a, a, m*sizeof(Block*));
  845. ab->m = 2*m;
  846. free(a);
  847. }
  848. b = mkblock(i);
  849. b->dfn = n;
  850. ab->a[n] = b;
  851. i->pc = ab->n = n+1;
  852. }
  853. }
  854. static Block*
  855. findb(Inst *i, Array *ab)
  856. {
  857. if(i == nil)
  858. return nil;
  859. if(i->pc <= 0)
  860. fatal("pc <= 0 in findb");
  861. return ab->a[i->pc-1];
  862. }
  863. static int
  864. memb(Block *b, Blist *bl)
  865. {
  866. for( ; bl != nil; bl = bl->next)
  867. if(bl->block == b)
  868. return 1;
  869. return 0;
  870. }
  871. static int
  872. canfallthrough(Inst *i)
  873. {
  874. if(i == nil)
  875. return 0;
  876. switch(i->op){
  877. case IGOTO:
  878. case ICASE:
  879. case ICASEL:
  880. case ICASEC:
  881. case IRET:
  882. case IEXIT:
  883. case IRAISE:
  884. case IJMP:
  885. return 0;
  886. case INOOP:
  887. return i->branch != nil;
  888. }
  889. return 1;
  890. }
  891. static void
  892. predsucc(Block *b1, Block *b2)
  893. {
  894. if(b1 == nil || b2 == nil)
  895. return;
  896. if(!memb(b1, b2->pred))
  897. b2->pred = mkblist(b1, b2->pred);
  898. if(!memb(b2, b1->succ))
  899. b1->succ = mkblist(b2, b1->succ);
  900. }
  901. static Block*
  902. mkblocks(Inst *in, int *nb)
  903. {
  904. Inst *i;
  905. Block *b, *firstb, *lastb;
  906. Label *lab;
  907. Array *ab;
  908. int j, n;
  909. ab = allocmem(sizeof(Array));
  910. ab->n = 0;
  911. ab->m = 16;
  912. ab->a = allocmem(ab->m*sizeof(Block*));
  913. leader(in, ab);
  914. for(i = in; i != nil; i = i->next){
  915. switch(i->op){
  916. case IGOTO:
  917. case ICASE:
  918. case ICASEL:
  919. case ICASEC:
  920. case INOOP:
  921. if(i->op == INOOP && i->branch != nil){
  922. leader(i->branch, ab);
  923. leader(i->next, ab);
  924. break;
  925. }
  926. leader(i->d.decl->ty->cse->iwild, ab);
  927. lab = i->d.decl->ty->cse->labs;
  928. n = i->d.decl->ty->cse->nlab;
  929. for(j = 0; j < n; j++)
  930. leader(lab[j].inst, ab);
  931. leader(i->next, ab);
  932. break;
  933. case IRET:
  934. case IEXIT:
  935. case IRAISE:
  936. leader(i->next, ab);
  937. break;
  938. case IJMP:
  939. leader(i->branch, ab);
  940. leader(i->next, ab);
  941. break;
  942. default:
  943. if(i->branch != nil){
  944. leader(i->branch, ab);
  945. leader(i->next, ab);
  946. }
  947. break;
  948. }
  949. }
  950. firstb = lastb = mkblock(nil);
  951. for(i = in; i != nil; i = i->next){
  952. if(i->pc != 0){
  953. b = findb(i, ab);
  954. b->prev = lastb;
  955. lastb->next = b;
  956. if(canfallthrough(lastb->last))
  957. predsucc(lastb, b);
  958. lastb = b;
  959. }
  960. else
  961. lastb->last = i;
  962. switch(i->op){
  963. case IGOTO:
  964. case ICASE:
  965. case ICASEL:
  966. case ICASEC:
  967. case INOOP:
  968. if(i->op == INOOP && i->branch != nil){
  969. b = findb(i->next, ab);
  970. predsucc(lastb, b);
  971. b = findb(i->branch, ab);
  972. predsucc(lastb, b);
  973. break;
  974. }
  975. b = findb(i->d.decl->ty->cse->iwild, ab);
  976. predsucc(lastb, b);
  977. lab = i->d.decl->ty->cse->labs;
  978. n = i->d.decl->ty->cse->nlab;
  979. for(j = 0; j < n; j++){
  980. b = findb(lab[j].inst, ab);
  981. predsucc(lastb, b);
  982. }
  983. break;
  984. case IRET:
  985. case IEXIT:
  986. case IRAISE:
  987. break;
  988. case IJMP:
  989. b = findb(i->branch, ab);
  990. predsucc(lastb, b);
  991. break;
  992. default:
  993. if(i->branch != nil){
  994. b = findb(i->next, ab);
  995. predsucc(lastb, b);
  996. b = findb(i->branch, ab);
  997. predsucc(lastb, b);
  998. }
  999. break;
  1000. }
  1001. }
  1002. *nb = ab->n;
  1003. free(ab->a);
  1004. free(ab);
  1005. b = firstb->next;
  1006. b->prev = nil;
  1007. return b;
  1008. }
  1009. static int
  1010. back(Block *b1, Block *b2)
  1011. {
  1012. return b1->dfn >= b2->dfn;
  1013. }
  1014. static void
  1015. pblocks(Block *b, int nb)
  1016. {
  1017. Inst *i;
  1018. Blist *bl;
  1019. print("--------------------%d blocks--------------------\n", nb);
  1020. print("------------------------------------------------\n");
  1021. for( ; b != nil; b = b->next){
  1022. print("dfn=%d\n", b->dfn);
  1023. print(" pred ");
  1024. for(bl = b->pred; bl != nil; bl = bl->next)
  1025. print("%d%s ", bl->block->dfn, back(bl->block, b) ? "*" : "");
  1026. print("\n");
  1027. print(" succ ");
  1028. for(bl = b->succ; bl != nil; bl = bl->next)
  1029. print("%d%s ", bl->block->dfn, back(b, bl->block) ? "*" : "");
  1030. print("\n");
  1031. for(i = b->first; i != nil; i = i->next){
  1032. // print(" %I\n", i);
  1033. pins(i);
  1034. if(i == b->last)
  1035. break;
  1036. }
  1037. }
  1038. print("------------------------------------------------\n");
  1039. }
  1040. static void
  1041. ckblocks(Inst *in, Block *b, int nb)
  1042. {
  1043. int n;
  1044. Block *lastb;
  1045. if(b->first != in)
  1046. fatal("A - %d", b->dfn);
  1047. n = 0;
  1048. lastb = nil;
  1049. for( ; b != nil; b = b->next){
  1050. n++;
  1051. if(b->prev != lastb)
  1052. fatal("a - %d\n", b->dfn);
  1053. if(b->prev != nil && b->prev->next != b)
  1054. fatal("b - %d\n", b->dfn);
  1055. if(b->next != nil && b->next->prev != b)
  1056. fatal("c - %d\n", b->dfn);
  1057. if(b->prev != nil && b->prev->last->next != b->first)
  1058. fatal("B - %d\n", b->dfn);
  1059. if(b->next != nil && b->last->next != b->next->first)
  1060. fatal("C - %d\n", b->dfn);
  1061. if(b->next == nil && b->last->next != nil)
  1062. fatal("D - %d\n", b->dfn);
  1063. if(b->last->branch != nil && b->succ->block->first != b->last->branch)
  1064. fatal("0 - %d\n", b->dfn);
  1065. lastb = b;
  1066. }
  1067. if(n != nb)
  1068. fatal("N - %d %d\n", n, nb);
  1069. }
  1070. static void
  1071. dfs0(Block *b, int *n)
  1072. {
  1073. Block *s;
  1074. Blist *bl;
  1075. b->flags = 1;
  1076. for(bl = b->succ; bl != nil; bl = bl->next){
  1077. s = bl->block;
  1078. if(s->flags == 0)
  1079. dfs0(s, n);
  1080. }
  1081. b->dfn = --(*n);
  1082. }
  1083. static int
  1084. dfs(Block *b, int nb)
  1085. {
  1086. int n, u;
  1087. Block *b0;
  1088. b0 = b;
  1089. n = nb;
  1090. dfs0(b0, &n);
  1091. u = 0;
  1092. for(b = b0; b != nil; b = b->next){
  1093. if(b->flags == 0){ /* unreachable: see foldbranch */
  1094. fatal("found unreachable code");
  1095. u++;
  1096. b->prev->next = b->next;
  1097. if(b->next){
  1098. b->next->prev = b->prev;
  1099. b->prev->last->next = b->next->first;
  1100. }
  1101. else
  1102. b->prev->last->next = nil;
  1103. }
  1104. b->flags = 0;
  1105. }
  1106. if(u){
  1107. for(b = b0; b != nil; b = b->next)
  1108. b->dfn -= u;
  1109. }
  1110. return nb-u;
  1111. }
  1112. static void
  1113. loop0(Block *b)
  1114. {
  1115. Block *p;
  1116. Blist *bl;
  1117. b->flags = 1;
  1118. for(bl = b->pred; bl != nil; bl = bl->next){
  1119. p = bl->block;
  1120. if(p->flags == 0)
  1121. loop0(p);
  1122. }
  1123. }
  1124. /* b1->b2 a back edge */
  1125. static void
  1126. loop(Block *b, Block *b1, Block *b2)
  1127. {
  1128. if(0 && debug['o'])
  1129. print("back edge %d->%d\n", b1->dfn, b2->dfn);
  1130. b2->flags = 1;
  1131. if(b1->flags == 0)
  1132. loop0(b1);
  1133. if(0 && debug['o'])
  1134. print(" loop ");
  1135. for( ; b != nil; b = b->next){
  1136. if(b->flags && 0 && debug['o'])
  1137. print("%d ", b->dfn);
  1138. b->flags = 0;
  1139. }
  1140. if(0 && debug['o'])
  1141. print("\n");
  1142. }
  1143. static void
  1144. loops(Block *b)
  1145. {
  1146. Block *b0;
  1147. Blist *bl;
  1148. b0 = b;
  1149. for( ; b != nil; b = b->next){
  1150. for(bl = b->succ; bl != nil; bl = bl->next){
  1151. if(back(b, bl->block))
  1152. loop(b0, b, bl->block);
  1153. }
  1154. }
  1155. }
  1156. static int
  1157. imm(int m, Addr *a)
  1158. {
  1159. if(m == Aimm)
  1160. return a->offset;
  1161. fatal("bad immediate value");
  1162. return -1;
  1163. }
  1164. static int
  1165. desc(int m, Addr *a)
  1166. {
  1167. if(m == Adesc)
  1168. return a->decl->desc->size;
  1169. fatal("bad descriptor value");
  1170. return -1;
  1171. }
  1172. static int
  1173. fpoff(int m, Addr *a)
  1174. {
  1175. int off;
  1176. Decl *d;
  1177. if(m == Afp || m == Afpind){
  1178. off = a->reg;
  1179. if((d = a->decl) != nil)
  1180. off += d->offset;
  1181. return off;
  1182. }
  1183. return -1;
  1184. }
  1185. static int
  1186. size(Inst *i)
  1187. {
  1188. switch(i->op){
  1189. case ISEND:
  1190. case IRECV:
  1191. case IALT:
  1192. case INBALT:
  1193. case ILEA:
  1194. return i->m.offset;
  1195. case IMOVM:
  1196. case IHEADM:
  1197. case ICONSM:
  1198. return imm(i->mm, &i->m);
  1199. case IMOVMP:
  1200. case IHEADMP:
  1201. case ICONSMP:
  1202. return desc(i->mm, &i->m);
  1203. break;
  1204. }
  1205. fatal("bad op in size");
  1206. return -1;
  1207. }
  1208. static Decl*
  1209. mkdec(int o)
  1210. {
  1211. Decl *d;
  1212. d = mkdecl(&nosrc, Dlocal, tint);
  1213. d->offset = o;
  1214. return d;
  1215. }
  1216. static void
  1217. mkdecls(void)
  1218. {
  1219. regdecls = mkdec(REGRET*IBY2WD);
  1220. regdecls->next = mkdec(STemp);
  1221. regdecls->next->next = mkdec(DTemp);
  1222. }
  1223. static Decl*
  1224. sharedecls(Decl *d)
  1225. {
  1226. Decl *ld;
  1227. ld = d;
  1228. for(d = d->next ; d != nil; d = d->next){
  1229. if(d->offset <= ld->offset)
  1230. break;
  1231. ld = d;
  1232. }
  1233. return d;
  1234. }
  1235. static int
  1236. finddec(int o, int s, Decl *vars, int *nv, Inst *i)
  1237. {
  1238. int m, n;
  1239. Decl *d;
  1240. n = 0;
  1241. for(d = vars; d != nil; d = d->next){
  1242. if(o >= d->offset && o < d->offset+d->ty->size){
  1243. m = 1;
  1244. while(o+s > d->offset+d->ty->size){
  1245. m++;
  1246. d = d->next;
  1247. }
  1248. *nv = m;
  1249. return n;
  1250. }
  1251. n++;
  1252. }
  1253. // print("%d %d missing\n", o, s);
  1254. pins(i);
  1255. fatal("missing decl");
  1256. return -1;
  1257. }
  1258. static void
  1259. setud(Bits *b, int id, int n, int pc)
  1260. {
  1261. if(id < 0)
  1262. return;
  1263. while(--n >= 0)
  1264. bset(b[id++], pc);
  1265. }
  1266. static void
  1267. ud(Inst *i, Decl *vars, Bits *uses, Bits *defs)
  1268. {
  1269. ushort f;
  1270. int id, j, nv, pc, sz, s, m, d, ss, sm, sd;
  1271. Optab *t;
  1272. Idlist *l;
  1273. pc = i->pc;
  1274. ss = 0;
  1275. t = &opflags[i->op];
  1276. f = t->flags;
  1277. sz = t->size;
  1278. s = fpoff(i->sm, &i->s);
  1279. m = fpoff(i->mm, &i->m);
  1280. d = fpoff(i->dm, &i->d);
  1281. if(f&Mduse && i->mm == Anone)
  1282. f |= Duse;
  1283. if(s >= 0){
  1284. if(i->sm == Afp){
  1285. ss = SS(sz);
  1286. if(ss == Mp)
  1287. ss = size(i);
  1288. }
  1289. else
  1290. ss = IBY2WD;
  1291. id = finddec(s, ss, vars, &nv, i);
  1292. if(f&Suse)
  1293. setud(uses, id, nv, pc);
  1294. if(f&Sdef){
  1295. if(i->sm == Afp)
  1296. setud(defs, id, nv, pc);
  1297. else
  1298. setud(uses, id, nv, pc);
  1299. }
  1300. }
  1301. if(m >= 0){
  1302. if(i->mm == Afp){
  1303. sm = SM(sz);
  1304. if(sm == Mp)
  1305. sm = size(i);
  1306. }
  1307. else
  1308. sm = IBY2WD;
  1309. id = finddec(m, sm, vars, &nv, i);
  1310. if(f&Muse)
  1311. setud(uses, id, nv, pc);
  1312. if(f&Mdef){
  1313. if(i->mm == Afp)
  1314. setud(defs, id, nv, pc);
  1315. else
  1316. setud(uses, id, nv, pc);
  1317. }
  1318. }
  1319. if(d >= 0){
  1320. if(i->dm == Afp){
  1321. sd = SD(sz);
  1322. if(sd == Mp)
  1323. sd = size(i);
  1324. }
  1325. else
  1326. sd = IBY2WD;
  1327. id = finddec(d, sd, vars, &nv, i);
  1328. if(f&Duse)
  1329. setud(uses, id, nv, pc);
  1330. if(f&Ddef){
  1331. if(i->dm == Afp)
  1332. setud(defs, id, nv, pc);
  1333. else
  1334. setud(uses, id, nv, pc);
  1335. }
  1336. }
  1337. if(f&Tuse1){
  1338. id = finddec(STemp, IBY2WD, vars, &nv, i);
  1339. setud(uses, id, nv, pc);
  1340. }
  1341. if(f&Tuse2){
  1342. id = finddec(DTemp, IBY2WD, vars, &nv, i);
  1343. setud(uses, id, nv, pc);
  1344. }
  1345. if(i->op == ILEA){
  1346. if(s >= 0){
  1347. id = finddec(s, ss, vars, &nv, i);
  1348. if(i->sm == Afp && i->m.reg == 0)
  1349. setud(defs, id, nv, pc);
  1350. else
  1351. setud(uses, id, nv, pc);
  1352. }
  1353. }
  1354. if(0)
  1355. switch(i->op){
  1356. case ILEA:
  1357. if(s >= 0){
  1358. id = finddec(s, ss, vars, &nv, i);
  1359. if(id < 0)
  1360. break;
  1361. for(j = 0; j < nv; j++){
  1362. if(i->sm == Afp && i->m.reg == 0)
  1363. addlist(&deflist, id++);
  1364. else
  1365. addlist(&uselist, id++);
  1366. }
  1367. }
  1368. break;
  1369. case IALT:
  1370. case INBALT:
  1371. case ICALL:
  1372. case IMCALL:
  1373. for(l = deflist; l != nil; l = l->next){
  1374. id = l->id;
  1375. bset(defs[id], pc);
  1376. }
  1377. for(l = uselist; l != nil; l = l->next){
  1378. id = l->id;
  1379. bset(uses[id], pc);
  1380. }
  1381. freelist(&deflist);
  1382. freelist(&uselist);
  1383. break;
  1384. }
  1385. }
  1386. static void
  1387. usedef(Inst *in, Decl *vars, Bits *uses, Bits *defs)
  1388. {
  1389. Inst *i;
  1390. for(i = in; i != nil; i = i->next)
  1391. ud(i, vars, uses, defs);
  1392. }
  1393. static void
  1394. pusedef(Bits *ud, int nv, Decl *d, char *s)
  1395. {
  1396. int i;
  1397. print("%s\n", s);
  1398. for(i = 0; i < nv; i++){
  1399. if(!bzero(ud[i])){
  1400. print("\t%s(%ld): ", decname(d), d->offset);
  1401. pbits(ud[i]);
  1402. print("\n");
  1403. }
  1404. d = d->next;
  1405. }
  1406. }
  1407. static void
  1408. dummydefs(Bits *defs, int nv, int npc)
  1409. {
  1410. int i;
  1411. for(i = 0; i < nv; i++)
  1412. bset(defs[i], npc++);
  1413. }
  1414. static void
  1415. dogenkill(Block *b, Bits *defs, int nv)
  1416. {
  1417. int i, n, t;
  1418. Bits v;
  1419. n = defs[0].n;
  1420. v = bnew(n, 0);
  1421. for( ; b != nil; b = b->next){
  1422. b->gen = bnew(n, 0);
  1423. b->kill = bnew(n, 0);
  1424. b->in = bnew(n, 0);
  1425. b->out = bnew(n, 0);
  1426. for(i = 0; i < nv; i++){
  1427. boper(Bclr, v, v);
  1428. bsets(v, b->first->pc, b->last->pc);
  1429. boper(Band, defs[i], v);
  1430. t = topbit(v);
  1431. if(t >= 0)
  1432. bset(b->gen, t);
  1433. else
  1434. continue;
  1435. boper(Bclr, v, v);
  1436. bsets(v, b->first->pc, b->last->pc);
  1437. boper(Binv, v, v);
  1438. boper(Band, defs[i], v);
  1439. boper(Bor, v, b->kill);
  1440. }
  1441. }
  1442. bfree(v);
  1443. }
  1444. static void
  1445. udflow(Block *b, int nv, int npc)
  1446. {
  1447. int iter;
  1448. Block *b0, *p;
  1449. Blist *bl;
  1450. Bits newin;
  1451. b0 = b;
  1452. for(b = b0; b != nil; b = b->next)
  1453. boper(Bstore, b->gen, b->out);
  1454. newin = bnew(b0->in.n, 0);
  1455. iter = 1;
  1456. while(iter){
  1457. iter = 0;
  1458. for(b = b0; b != nil; b = b->next){
  1459. boper(Bclr, newin, newin);
  1460. for(bl = b->pred; bl != nil; bl = bl->next){
  1461. p = bl->block;
  1462. boper(Bor, p->out, newin);
  1463. }
  1464. if(b == b0)
  1465. bsets(newin, npc, npc+nv-1);
  1466. if(!beq(b->in, newin))
  1467. iter = 1;
  1468. boper(Bstore, newin, b->in);
  1469. boper(Bstore, b->in, b->out);
  1470. boper(Bandrev, b->kill, b->out);
  1471. boper(Bor, b->gen, b->out);
  1472. }
  1473. }
  1474. bfree(newin);
  1475. }
  1476. static void
  1477. pflows(Block *b)
  1478. {
  1479. for( ; b != nil; b = b->next){
  1480. print("block %d\n", b->dfn);
  1481. print(" gen: "); pbits(b->gen); print("\n");
  1482. print(" kill: "); pbits(b->kill); print("\n");
  1483. print(" in: "); pbits(b->in); print("\n");
  1484. print(" out: "); pbits(b->out); print("\n");
  1485. }
  1486. }
  1487. static int
  1488. set(Decl *d)
  1489. {
  1490. if(d->store == Darg)
  1491. return 1;
  1492. if(d->sym == nil) /* || d->sym->name[0] == '.') */
  1493. return 1;
  1494. if(tattr[d->ty->kind].isptr || d->ty->kind == Texception)
  1495. return 1;
  1496. return 0;
  1497. }
  1498. static int
  1499. used(Decl *d)
  1500. {
  1501. if(d->sym == nil ) /* || d->sym->name[0] == '.') */
  1502. return 1;
  1503. return 0;
  1504. }
  1505. static void
  1506. udchain(Block *b, Decl *ds, int nv, int npc, Bits *defs, Bits *uses, Decl *sd)
  1507. {
  1508. int i, n, p, q;
  1509. Bits d, u, dd, ud;
  1510. Block *b0;
  1511. Inst *in;
  1512. b0 = b;
  1513. n = defs[0].n;
  1514. u = bnew(n, 0);
  1515. d = bnew(n, 0);
  1516. dd = bnew(n, 0);
  1517. ud = bnew(n, 0);
  1518. for(i = 0; i < nv; i++){
  1519. boper(Bstore, defs[i], ud);
  1520. bclr(ud, npc+i);
  1521. for(b = b0 ; b != nil; b = b->next){
  1522. boper(Bclr, u, u);
  1523. bsets(u, b->first->pc, b->last->pc);
  1524. boper(Band, uses[i], u);
  1525. boper(Bclr, d, d);
  1526. bsets(d, b->first->pc, b->last->pc);
  1527. boper(Band, defs[i], d);
  1528. for(;;){
  1529. p = topbit(u);
  1530. if(p < 0)
  1531. break;
  1532. bclr(u, p);
  1533. bclrs(d, p, -1);
  1534. q = topbit(d);
  1535. if(q >= 0){
  1536. bclr(ud, q);
  1537. if(debug['o'])
  1538. print("udc b=%d v=%d(%s/%ld) u=%d d=%d\n", b->dfn, i, decname(ds), ds->offset, p, q);
  1539. }
  1540. else{
  1541. boper(Bstore, defs[i], dd);
  1542. boper(Band, b->in, dd);
  1543. boper(Bandrev, dd, ud);
  1544. if(!bzero(dd)){
  1545. if(debug['o']){
  1546. print("udc b=%d v=%d(%s/%ld) u=%d d=", b->dfn, i, decname(ds), ds->offset, p);
  1547. pbits(dd);
  1548. print("\n");
  1549. }
  1550. if(bmem(dd, npc+i) && !set(ds))
  1551. warning(pc2i(b0, p), "used and not set", ds, sd);
  1552. }
  1553. else
  1554. fatal("no defs in udchain");
  1555. }
  1556. }
  1557. }
  1558. for(;;){
  1559. p = topbit(ud);
  1560. if(p < 0)
  1561. break;
  1562. bclr(ud, p);
  1563. if(!used(ds)){
  1564. in = pc2i(b0, p);
  1565. if(isnilsrc(&in->src)) /* nilling code */
  1566. in->op = INOOP; /* elim p from bitmaps ? */
  1567. else if(limbovar(ds) && !structure(ds->ty))
  1568. warning(in, "set and not used", ds, sd);
  1569. }
  1570. }
  1571. ds = ds->next;
  1572. }
  1573. bfree(u);
  1574. bfree(d);
  1575. bfree(dd);
  1576. bfree(ud);
  1577. }
  1578. static void
  1579. ckflags(void)
  1580. {
  1581. int i, j, k, n;
  1582. Optab *o;
  1583. n = nelem(opflags);
  1584. o = opflags;
  1585. for(i = 0; i < n; i++){
  1586. j = (o->flags&(Suse|Sdef)) != 0;
  1587. k = SS(o->size) != 0;
  1588. if(j != k){
  1589. if(!(j == 0 && k == 1 && i == ILEA))
  1590. fatal("S %ld %s\n", o-opflags, instname[i]);
  1591. }
  1592. j = (o->flags&(Muse|Mdef)) != 0;
  1593. k = SM(o->size) != 0;
  1594. if(j != k)
  1595. fatal("M %ld %s\n", o-opflags, instname[i]);
  1596. j = (o->flags&(Duse|Ddef)) != 0;
  1597. k = SD(o->size) != 0;
  1598. if(j != k){
  1599. if(!(j == 1 && k == 0 && (i == IGOTO || i == ICASE || i == ICASEC || i == ICASEL)))
  1600. fatal("D %ld %s\n", o-opflags, instname[i]);
  1601. }
  1602. o++;
  1603. }
  1604. }
  1605. void
  1606. optim(Inst *in, Decl *d)
  1607. {
  1608. int nb, npc, nv, nd, nu;
  1609. Block *b;
  1610. Bits *uses, *defs;
  1611. Decl *sd;
  1612. ckflags();
  1613. if(debug['o'])
  1614. print("************************************************\nfunction %s\n************************************************\n", d->sym->name);
  1615. if(in == nil || errors > 0)
  1616. return;
  1617. d = d->ty->ids;
  1618. if(regdecls == nil)
  1619. mkdecls();
  1620. regdecls->next->next->next = d;
  1621. d = regdecls;
  1622. sd = sharedecls(d);
  1623. if(debug['o'])
  1624. printdecls(d);
  1625. b = mkblocks(in, &nb);
  1626. ckblocks(in, b, nb);
  1627. npc = inspc(in);
  1628. nb = dfs(b, nb);
  1629. if(debug['o'])
  1630. pblocks(b, nb);
  1631. loops(b);
  1632. nv = len(d);
  1633. uses = allocbits(nv, npc+nv);
  1634. defs = allocbits(nv, npc+nv);
  1635. dummydefs(defs, nv, npc);
  1636. usedef(in, d, uses, defs);
  1637. if(debug['o']){
  1638. pusedef(uses, nv, d, "uses");
  1639. pusedef(defs, nv, d, "defs");
  1640. }
  1641. nu = bitcount(uses, nv);
  1642. nd = bitcount(defs, nv);
  1643. dogenkill(b, defs, nv);
  1644. udflow(b, nv, npc);
  1645. if(debug['o'])
  1646. pflows(b);
  1647. udchain(b, d, nv, npc, defs, uses, sd);
  1648. freeblks(b);
  1649. freebits(uses, nv);
  1650. freebits(defs, nv);
  1651. if(debug['o'])
  1652. print("nb=%d npc=%d nv=%d nd=%d nu=%d\n", nb, npc, nv, nd, nu);
  1653. }