[LLVMdev] matching function call arguments

Hari Pyla harip at vt.edu
Mon Mar 7 15:10:39 PST 2011


Hi,
  I downloaded the latest llvm (dev version) and I tried -earlycse with 
opt before my pass. However, it still does not solve my problem. I will 
try to explore the recursive function option and I will certainly send 
you the code once I implement it.

Thanks,
--Hari


On 03/07/2011 03:02 PM, Frits van Bommel wrote:
> On Mon, Mar 7, 2011 at 8:03 PM, Hari Pyla<harip at vt.edu>  wrote:
>>   Thank you for your response. In my analysis, I will always have
>> entry(2) and exit(2). I will not run into cases involving entry (1+1) or
>> entry (fn return values). I am having trouble trying to compare the
>> arguments of entry and exit in the following scenario.
>>
>> #include<stdio.h>
>> #include<stdlib.h>
>> #include<pthread.h>
>>
>> struct sa
>> {
>>    int a;
>>    pthread_mutex_t *mutex1;
>> };
>> struct sa *s;
>>
>> pthread_mutex_t mutex1;
>> int main()
>> {
>>    s = (struct sa *)malloc(sizeof(struct sa));
>>    s->mutex1 = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t));
>>
>>   entry(s->mutex1);
>>
>>    s->a++;
>>
>>    exit(s->mutex1);
>>
>>    return 0;
>> }
> Have you tried just running something like -earlycse before your pass?
> It might be overkill, but it'd probably get the job done.
>
> If you want a "lazy" check (as in, just for the values you want to
> compare) though, AFAIK there's no public interface for that kind of
> functionality. A pass like -earlycse or -mergefunc might have
> something you can factor out though.
>
> Other than that, you can probably hack up something with a recursive
> function using Instruction::isSameOperationAs(), which checks
> everything except operand values (so you'd need to check equivalence
> of operands recursively if you want to go more than one instruction
> deep).
> You'll probably want to keep a mapping of already-checked equivalences
> (for performance), and you should definitely be careful not to go into
> infinite recursion in the face of PHI nodes.
> Also, be careful of side effects, both in the instructions you're
> comparing and in anything in between; for example you don't want two
> loads to be considered equal if there's a store to that memory in
> between them. Instruction::mayHaveSideEffects() and
> Instruction::mayReadFromMemory() are probably useful here.
>
> If you go with either of the last two options and create a function to
> figure out whether two values are equivalent, it might be interesting
> if you submitted a patch for your changes so others can use them too.
> Also, you'd likely get some feedback on whether you've made any
> mistakes :).




More information about the llvm-dev mailing list