QBE 源代码阅读 3: fillpreds, filluse

fillpreds

pass fillpreds 是一个 psuedo pass,其职责是完善 CFG 数据结构,填充好 Blk::preds 字段。

TODO QBE 的源代码中, fillpreds 函数逻辑上是有内存泄漏的。

brk1->pred == brk2 ==> brk2.s1 == brk1 || brk2.s2 == brk1

void
fillpreds(Fn *f)
{
	Blk *b;

	for (b=f->start; b; b=b->link) {    // reset predecessors, it is already setted in ???
		b->npred = 0;
		b->pred = 0;                // 这里会有内存泄漏
	}
	for (b=f->start; b; b=b->link) {
		if (b->s1)
			b->s1->npred++;
		if (b->s2 && b->s2 != b->s1)
			b->s2->npred++;
	}
	for (b=f->start; b; b=b->link) {
		if (b->s1)
			addpred(b, b->s1);
		if (b->s2 && b->s2 != b->s1)
			addpred(b, b->s2);
	}
}

filluse

重点维护字段:

  • Tmp::def

  • Tmp::bid

  • Tmp::ndef

  • Tmp::nuse

  • Tmp::cls

  • Tmp::phi

  • Tmp::width

  • 对主要结构添加 to_str 方法,方便进行调试。包括: Tmp, Ins, Phi, Blk, Fn etc.