📄 icopy.c
字号:
clearbit(l->p_cgen,
(int)l1->data);
setbit(l->p_ckill,
(int)l1->data);
l1 = l1->link;
}
}
}
}
}
}
}
}
}
}
break;
case i_gosub:
for (i = 0; i < copy_count; i++)
{
IMODE *s = copyarray[i]->ans;
switch (s->offset->nodetype)
{
case en_nacon:
case en_napccon:
case en_nalabcon:
case en_labcon:
case en_absacon:
if (s->mode == i_direct)
{
clearbit(l->p_cgen, i);
setbit(l->p_ckill, i);
}
else if (s->mode == i_ind){}
break;
}
s = copyarray[i]->dc.left;
switch (s->offset->nodetype)
{
case en_nacon:
case en_napccon:
case en_nalabcon:
case en_labcon:
case en_absacon:
if (s->mode == i_direct)
{
clearbit(l->p_cgen, i);
setbit(l->p_ckill, i);
}
else if (s->mode == i_ind){}
break;
}
}
break;
}
ptrindex(list, l, temparray4);
list = list->fwd;
}
}
}
//-------------------------------------------------------------------------
static void CalculateCopyEqns(void)
{
int i, changed, j;
for (i = 0; i < blocknum; i++)
memcpy(blockarray[i]->block->p_cout, blockarray[i]->block->p_cgen,
copybytes);
do
{
changed = FALSE;
for (i = 0; i < blocknum; i++)
{
BLOCK *t = blockarray[dfst[i]]->block;
BLOCKLIST *l = t->flowback;
if (l)
memset(t->p_cin, 0xff, copybytes);
while (l)
{
for (j = 0; j < copybytes; j++)t->p_cin[j] &= l->block
->p_cout[j];
l = l->link;
}
for (j = 0; j < copybytes; j++)
{
int v = t->p_cout[j];
t->p_cout[j] = t->p_cgen[j] | (t->p_cin[j] &~t->p_ckill[j]);
changed |= (v != t->p_cout[j]);
}
}
}
while (changed)
;
}
//-------------------------------------------------------------------------
static int ScanForCopy(BLOCK *l, int index)
{
QUAD *list = l->head;
QUAD *match = copyarray[index];
BLOCKLIST *s;
IMODE *im, *ima;
QUAD *t;
LIST *l1;
int i, ptr, j;
int stopped = FALSE;
memcpy(temparray4, l->p_cin, sourcebytes *pointer_count);
while (list && list->back != l->tail)
{
switch (list->dc.opcode)
{
case i_assn:
case i_add:
case i_sub:
case i_udiv:
case i_umod:
case i_sdiv:
case i_smod:
case i_umul:
case i_smul:
case i_lsl:
case i_lsr:
case i_asl:
case i_asr:
case i_neg:
case i_not:
case i_and:
case i_or:
case i_eor:
case i_setne:
case i_sete:
case i_setc:
case i_seta:
case i_setnc:
case i_setbe:
case i_setl:
case i_setg:
case i_setle:
case i_setge:
if (list->ans == match->dc.left || list->ans == match->ans)
{
stopped = TRUE;
break;
}
if (list->ans->mode == i_ind)
{
int ptr = findPointer(list->ans);
if (ptr < pointer_count)
{
if (isset(temparray4 + ptr * sourcebytes, 0))
{
stopped = TRUE;
break;
}
else
for (i = 1; i < source_count; i++)
{
if (isset(temparray4 + ptr * sourcebytes, i))
{
SYM *sp = varsp(sourcearray[i]->ans->offset);
if (sp->imvalue == match->dc.left || sp
->imvalue == match->dc.right)
{
stopped = TRUE;
break;
}
}
}
}
}
else if (list->ans->mode == i_direct)
{
ptr = findPointer(list->ans);
if (ptr < pointer_count)
{
SYM *sp = varsp(list->ans->offset);
if (sp)
{
l1 = findans(copyhash, sp->imind);
if (l1)
{
stopped = TRUE;
break;
}
}
}
}
// fall through
case i_coswitch:
case i_jc:
case i_ja:
case i_je:
case i_jnc:
case i_jbe:
case i_jne:
case i_jl:
case i_jg:
case i_jle:
case i_jge:
if (stopped && used(match, list))
return FALSE;
break;
case i_parm:
if (list->dc.left->mode == i_immed)
{
SYM *sp = varsp(list->dc.left->offset);
if (sp)
{
if (sp->imvalue == match->dc.left || sp->imvalue ==
match->ans)
{
stopped = TRUE;
break;
}
}
}
else if (list->dc.left->mode == i_direct)
{
SYM *sp = varsp(list->dc.left->offset);
if (sp)
{
int ptr = findPointer(list->dc.left);
if (ptr < pointer_count)
{
if (isset(temparray4, 0))
{
stopped = TRUE;
break;
}
else
{
for (i = 1; i < source_count; i++)
{
if (isset(temparray4 + ptr * sourcebytes, i)
)
{
SYM *sp = varsp(sourcearray[i]->ans
->offset);
if (sp->imvalue == match->dc.left || sp
->imvalue == match->dc.right)
{
stopped = TRUE;
break;
}
}
}
}
}
}
}
if (stopped && used(match, list))
return FALSE;
break;
case i_gosub:
for (i = 0; i < copy_count; i++)
{
if (copyarray[i] != list)
{
IMODE *s = copyarray[i]->ans;
switch (s->offset->nodetype)
{
case en_nacon:
case en_napccon:
case en_nalabcon:
case en_labcon:
case en_absacon:
if (s == match->dc.left || s == match->ans)
{
stopped = TRUE;
break;
}
break;
}
}
}
break;
}
ptrindex(list, l, temparray4);
list = list->fwd;
}
return TRUE;
}
//-------------------------------------------------------------------------
IMODE *replace(IMODE *im, QUAD *match)
{
SYM *sp;
if (!im)
return im;
if (im->mode != i_ind && im->mode != i_direct)
return im;
sp = varsp(im->offset);
if (!sp)
return im;
if (sp->imvalue == match->ans)
{
if (sp->imvalue == im)
return match->dc.left;
else
{
sp = varsp(match->dc.left->offset);
return sp->imind;
}
}
return im;
}
//-------------------------------------------------------------------------
static void ReplaceCopies(void)
{
int i, j;
for (i = blocknum - 1; i >= 0; i--)
{
BLOCK *l = blockarray[dfst[i]]->block;
for (j = 0; j < copy_count; j++)
if (isset(l->p_cin, j))
if (!ScanForCopy(l, j))
setbit(temparray5, j);
}
for (i = 0; i < blocknum; i++)
{
BLOCK *l = blockarray[i]->block;
for (j = 0; j < copy_count; j++)
{
if (!isset(temparray5, j) && isset(l->p_cin, j))
{
QUAD *list = l->head;
QUAD *match = copyarray[j];
while (list && list->back != l->tail)
{
if (list->ans && list->ans->mode == i_ind)
list->ans = replace(list->ans, match);
list->dc.right = replace(list->dc.right, match);
list->dc.left = replace(list->dc.left, match);
list = list->fwd;
}
}
}
}
for (j = 0; j < copy_count; j++)
if (!isset(temparray5, j))
{
QUAD *match = copyarray[j];
SYM *sp = varsp(match->ans->offset);
if (!prm_debug || sp && sp->storage_class == sc_temp)
{
// match->fwd->back = match->back ;
// match->back->fwd = match->fwd ;
}
}
}
//-------------------------------------------------------------------------
void CopyPropagation(void)
{
return ;
copyhash = oalloc(sizeof(LIST3*) * CHASH);
CountCopies();
CreateBitmaps();
CalculateCopyBasics();
CalculateCopyEqns();
ReplaceCopies();
#ifdef DUMP_GCSE_INFO
dump_copies();
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -