[LLVMdev] [HEADSUP] Another attempt at CallInst operand rotation

John Criswell criswell at uiuc.edu
Thu Jul 1 08:28:11 PDT 2010


Gabor Greif wrote:
> Am 30.06.2010 um 23:31 schrieb John Criswell:
>
>   
>> Stupid question: is making the getOperand() method of CallInst  
>> going to work?  For example, if I have the following code:
>>
>> void
>> method (Instruction * I) {
>>    I->getOperand(2);
>>    ...
>> }
>>
>> void method2 (CallInst * CI) {
>>    method (CI);
>>    ...
>> }
>>
>> Will method() still work when you make CallInst::getOperand() private?
>>     
>
> This is the case where I cannot help you (access via baseclass pointer).
>   



> For all these cases (there were a few in the llvm codebase too) I got
>   - either assertion failures in the test suite
>   - or obvious crashes
>   - or miscompilations.
>
> To catch all of these I could publish a patch (but not check it in)
> that asserts that User::getOperand is not called on a CallInst.
> But I can tell you that this will probably give you many false  
> positives.
>
> Btw. "method" above is of very little practical value, because
> without knowing what type of instruction you have it makes
> no sense to get its third operand. You will normally have a
> dyn_cast<CallInst>(I) somewhere in "method".
>   

It's example code to illustrate my concern.  It doesn't exist anywhere.  
Perhaps a more realistic example would be:

void
method (Instruction * I) {
    for (unsigned index = 0; index < I->getNumOperands(); ++index) {
       do_something_with (I->getOperand(index));
    }
}

For example, code that computes a static backwards slice might do 
something like the above.  It doesn't care about operand order or what 
type of instruction it is dealing with; it just wants to get the 
incoming operands and do something with them.

This seems like a reasonable thing to do.  Will code like this work if 
you make CallInst::getOperand() private?  If not, does your patch remove 
code like the above from the LLVM source tree, and with what code do you 
replace it?

-- John T.

> Cheers,
>
> 	Gabor
>
>
>   
>> -- John T.
>>
>>     
>>> At this point we will have caught 99% of all low-level clients  
>>> out  there.
>>>
>>> What uncertainties will remain? I can think of two of them:
>>>
>>>    o getOperandNo()
>>>    o access via baseclass pointer
>>>
>>> The former is a method on Value::use_iterator and I cannot see a  
>>> way to
>>> intercept it at compile-time.
>>> The latter is always possible and does circumvent the above measures,
>>> there is no remedy against it.
>>>
>>> I plan to fire each of these two rounds with one week delay and  
>>> monitor
>>> the LLVM mailing lists while they are soaking.
>>>
>>> After that I'll commit the actual operand rotation.
>>>
>>> Last but not least, there will be some cleanup commits:
>>>
>>>   - removing CallInst::ArgOffset,
>>>   - fixing the 80-column violations I have introduced,
>>>   - doxygenizing the new interfaces,
>>>   - re-enabling the low-level interface again (possibly
>>>     after 2.8 has brached?).
>>>
>>> Well, that's it. I hope that this order of commits will keep
>>> the pain at a bearable level for everyone.
>>>
>>> I would be thankful for any comments/suggestions
>>> regarding this plan.
>>>
>>> Cheers,
>>>
>>> 	Gabor
>>>
>>>
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>
>>>       
>
>   




More information about the llvm-dev mailing list