static int InferOffset(IMODE *im) { QUAD * q = tempInfo[im->offset->v.sp->value.i]->instructionDefines; if (q) { if (q->dc.opcode == i_add) { if ((q->temps & TEMP_LEFT) && q->dc.left->mode == i_direct) { if (q->dc.right->mode == i_immed && isintconst(q->dc.right->offset)) return q->dc.right->offset->v.i; } else if ((q->temps & TEMP_RIGHT) && q->dc.right->mode == i_direct) { if (q->dc.left->mode == i_immed && isintconst(q->dc.left->offset)) return q->dc.left->offset->v.i; } } else if (q->dc.opcode == i_sub) { if ((q->temps & TEMP_LEFT) && q->dc.left->mode == i_direct) { if (q->dc.right->mode == i_immed && isintconst(q->dc.right->offset)) return -q->dc.right->offset->v.i; } } else if (q->dc.opcode == i_lsl) { if (q->dc.right->mode == i_immed && isintconst(q->dc.right->offset)) if (q->temps & TEMP_LEFT) return InferOffset(q->dc.left) << q->dc.right->offset->v.i; } else if (q->dc.opcode == i_mul) { if (q->dc.left->mode == i_immed && isintconst(q->dc.left->offset)) if (q->temps & TEMP_RIGHT) return InferOffset(q->dc.right) * q->dc.left->offset->v.i; if (q->dc.right->mode == i_immed && isintconst(q->dc.right->offset)) if (q->temps & TEMP_LEFT) return InferOffset(q->dc.left) * q->dc.right->offset->v.i; } } return 0; }
static void Infer(IMODE *ans, IMODE *reg, ALIASLIST *pointsto) { if (pointsto) { ALIASLIST *result = NULL; int c = InferOffset(reg); int l = InferStride(reg); BOOL xchanged = changed; while (pointsto) { ALIASADDRESS *addr = LookupAddress(pointsto->address->name, pointsto->address->offset + c); ALIASLIST *al = aAlloc(sizeof(ALIASLIST)); al->address = addr; AliasUnion(&result, al); SetStride(pointsto->address, l); pointsto = pointsto->next; } changed = xchanged; AliasUnion(&tempInfo[ans->offset->v.sp->value.i]->pointsto, result); } }