Hi all,

I met an issue in Ia32WebMaker action recently.

In Ia32WebMaker action, function phase1() first generated array opndxs like 
this:

void WebMaker::phase1()
{
    opndxs.resize(opandcount);
    for (unsigned i = 0; i != opandcount; ++i)
    {
        Opndx* opndxp = 0;
        if (!irManager->getOpnd(i)->hasAssignedPhysicalLocation())
            opndxp = new (mm) Opndx(mm);
        opndxs[i] = opndxp;
    }
......
So all the Opnd in IR are registed in array opndxp

And in function phase3(), there are codes to splitOpnd and replaceOpnd in the 
same inst, like this:
....
                        if (opdefp->globid == -1)
                        {// local operand
                        
                            if (isdef)
                            {
                                ++opndxp->webscount;
                                if (opndxp->webscount > 1)
                                {
                                    opndxp->newopndp = splitOpnd(opndp);
                                    DBGOUT("**new local web found " << *opndp 
<< " -> " << *opndxp->newopndp << endl;)
                                }
                            }
                            if (opndxp->webscount > 1 && 
opdefp->defp->getNode() == nodep)
                            {
                                instp->replaceOpnd(opndp, opndxp->newopndp, 
isdef ? Inst::OpndRole_AllDefs : Inst::OpndRole_AllUses);
                                DBGOUT(" replace B#" << 
instp->getBasicBlock()->getId() << " " << *instp << endl;)
                            }
...

So the question is, if we meet an IR like

I6: CALL t14[t12]:ptr:uintptr (AU:s7:cls:Hello,s7:cls:Hello) [bcmap:unknown] 
(from source code like hello.fun(hello) )

WebMaker decides to replace the s7 with new generated s19 at the second 
Opnd(second iteration of I6) of I6, but the call of instp->replaceOpnd() will 
also change the third Opnd of I6 to s19. In the next iteration(thrid iteration 
of I6) of phase3(), the code

Opndx* opndxp = opndxs.at(opndp->getId()); 

will throw vector _range_out error because array opndxs has not been updated 
with new generated Opnd s19.

So is this really a bug or I misunderstand some parts of the code?

Thanks a lot!

2009-10-15 



johnnylj98 

Reply via email to