📄 ilive.c
字号:
if (!((sp = varsp(var->dc.right->offset)) && var->dc.right->mode == i_immed)
)
{
DIAG("use2 could not locate definition");
return 0;
}
xvar = sp->imvalue;
if (xvar)
return xvar->useindx - 1;
return - 1;
}
//-------------------------------------------------------------------------
static void CalculateUseBasics(void)
{
int i, j, k, left, right, ans;
int ptr, ptr2, gencount, pgen, pagen, def2;
int left1, right1, ans1;
LIST *l1;
for (i = 0; i < blocknum; i++)
{
BLOCK *l = blockarray[i]->block;
QUAD *list = l->head;
memset(temparray3, 0, variable_bytes);
memcpy(temparray4, l->p_pin, sourcebytes *pointer_count);
while (list && list->back != l->tail)
{
ptr = INT_MAX;
gencount = 0;
pgen = - 1;
switch (list->dc.opcode)
{
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:
case i_assn:
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:
case i_parm:
use(list->dc.left, &left, &left1);
use(list->dc.right, &right, &right1);
use(list->ans, &ans, &ans1);
if (left != - 1)
{
if (!isset(temparray3, left))
if (list->dc.left->mode == i_direct || left1 == -
1 || !isset(temparray3, left1))
setbit(l->p_use, left);
if (list->dc.left->mode == i_ind)
{
BYTE *t4;
ptr2 = findPointer(list->dc.left);
if (ptr2 < pointer_count)
{
t4 = temparray4 + ptr2 * sourcebytes;
if (isset(t4, 0))
{
for (j = 0; j < sourcebytes; j++)
{
l->p_use[j] |= ~temparray3[j];
}
}
else
for (j = 1; j < source_count; j++)
{
if (isset(t4, j))
{
left = use2(sourcearray[j], FALSE);
if (left != - 1 && !isset(temparray3,
left))
setbit(l->p_use, left);
}
}
}
}
}
if (right != - 1)
{
if (!isset(temparray3, right))
if (list->dc.right->mode == i_direct || right1 ==
- 1 || !isset(temparray3, right1))
setbit(l->p_use, right);
if (list->dc.right->mode == i_ind)
{
BYTE *t4;
ptr2 = findPointer(list->dc.right);
if (ptr2 < pointer_count)
{
t4 = temparray4 + ptr2 * sourcebytes;
if (isset(t4, 0))
{
for (j = 0; j < sourcebytes; j++)
{
l->p_use[j] |= ~temparray3[j];
}
}
else
for (j = 1; j < source_count; j++)
{
if (isset(t4, j))
{
right = use2(sourcearray[j], FALSE);
if (right != - 1 && !isset(temparray3,
right))
setbit(l->p_use, right);
}
}
}
}
}
if (ans != - 1 && list->ans->mode == i_ind && !isset
(temparray3, ans))
if (ans1 == - 1 || !isset(temparray3, ans1))
setbit(l->p_use, ans);
if (ans != - 1)
setbit(temparray3, ans);
if (list->ans && list->ans->mode == i_ind)
{
if (ptr < pointer_count)
{
BYTE *t4 = temparray4 + ptr * sourcebytes;
if (!isset(t4, 0))
{
gencount = 0;
pgen = - 1;
for (j = 1; j < source_count; j++)
{
if (isset(t4, j))
{
gencount++;
pgen = j;
if (gencount > 1)
break;
}
}
if (gencount == 1)
{
ans = use2(sourcearray[pgen], FALSE);
setbit(temparray3, ans);
}
}
}
}
break;
}
ptrindex(list, l, temparray4);
list = list->fwd;
}
for (j = 0; j < variable_bytes; j += 4)
*(unsigned*)(l->p_def + j) = *(unsigned*)(temparray3 + j) &~*
(unsigned*)(l->p_use + j);
}
}
//-------------------------------------------------------------------------
static void CalculateLive(void)
{
int i, changed, j;
for (i = 0; i < blocknum; i++)
memcpy(blockarray[i]->block->p_live_in, blockarray[i]->block->p_use,
variable_bytes);
do
{
changed = FALSE;
for (i = 0; i < blocknum; i++)
{
BLOCK *t = blockarray[dfst[blocknum - i - 1]]->block;
BLOCKLIST *l = t->flowfwd;
memset(t->p_live_out, 0, variable_bytes);
while (l)
{
for (j = 0; j < variable_bytes; j++)t->p_live_out[j] |= l
->block->p_live_in[j];
l = l->link;
}
for (j = 0; j < variable_bytes; j++)
{
int v = t->p_live_in[j];
t->p_live_in[j] = t->p_use[j] | (t->p_live_out[j] &~t->p_def[j])
;
changed |= (v != t->p_live_in[j]);
}
}
}
while (changed)
;
}
//-------------------------------------------------------------------------
void ScanForDead(void)
{
int i;
for (i = blocknum - 1; i >= 0 ; i--)
{
BLOCK *l = blockarray[dfst[i]]->block;
QUAD *list = l->tail;
memcpy(temparray3, l->p_live_out, variable_bytes);
while (list && list->fwd != l->head)
{
switch (list->dc.opcode)
{
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:
case i_assn:
if (!isset(temparray3, list->ans->useindx) && list->ans
->mode == i_direct)
{
list->back->fwd = list->fwd;
list->fwd->back = list->back;
break;
}
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:
case i_parm:
break ;
}
list = list->back;
}
}
}
//-------------------------------------------------------------------------
void LiveAnalysis(void)
{
CountUses();
CreateUseBitArrays();
CalculateUseBasics();
CalculateLive();
ScanForDead();
#ifdef DUMP_GCSE_INFO
dump_use();
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -