Ejemplo n.º 1
0
void IGraph::Fill()
{
	int n, n1, rg1, rg2;
	BasicBlock *b;
	int v, v1;
	OCODE *ip;
	bool eol;
	bool isFP;

	// For each block 
	for (b = currentFn->RootBlock; b; b = b->next) {
		b->BuildLivesetFromLiveout();
		eol = false;
		for (ip = b->lcode; ip && !eol; ip = ip->back) {
			if (ip->opcode != op_label) {
				// examine instruction ip and update graph and live
				if (ip->opcode == op_mov) {
					v = FindTreeno(ip->oper1->preg, ip->bb->num);
					if (v >= 0 && frst->trees[v]->color == K) {
						b->live->remove(v);
					}
				}
				else if (ip->opcode == op_fmov) {
					v = FindTreeno(ip->oper1->preg+0x10000, ip->bb->num);
					if (v >= 0 && frst->trees[v]->color == K) {
						b->live->remove(v);
					}
				}
				// For now we assume only one target register.
				// pop has two targets.
				if (ip->insn->HasTarget()) {
					isFP = ip->GetTargetReg(&rg1, &rg2);
					v = FindTreeno(isFP ? rg1 + 0x10000 : rg1, ip->bb->num);
					if (v >= 0 && frst->trees[v]->color==K) {
						b->live->resetPtr();
						for (n = b->live->nextMember(); n >= 0; n = b->live->nextMember()) {
							//n1 = min(n, v); ??? Not sure what I was thinking here
							//v1 = max(n, v);
							n1 = n;
							v1 = ip->bb->num;
							// If n1 >= v1 it's from a loop
							if (n1 <= v1)
								iGraph.Add(n1, v1);
						}
						b->live->remove(v);
					}
					//if (rg2 != 0) {
					//	v = FindTreeno(rg2, ip->bb->num);
					//	if (v >= 0 && frst->trees[v]->color == K) {
					//		b->live->resetPtr();
					//		for (n = b->live->nextMember(); n >= 0; n = b->live->nextMember()) {
					//			n1 = min(n, v);
					//			v1 = max(n, v);
					//			iGraph.Add(n1, v1);
					//		}
					//		b->live->remove(v);
					//	}
					//}
				}
				// Unrolled loop
				// while (p < ik->uses)
				if (!ip->insn->HasTarget() && ip->oper1)
					AddToLive(b, ip->oper1, ip);
				if (ip->oper2)
					AddToLive(b, ip->oper2, ip);
				if (ip->oper3)
					AddToLive(b, ip->oper3, ip);
				if (ip->oper4)
					AddToLive(b, ip->oper4, ip);
			}
			eol = ip == b->code;
		}
	}
}