[PATCH] Optimize redundant insertvalue instructions
Michael Zolotukhin
mzolotukhin at apple.com
Wed May 7 06:26:03 PDT 2014
On May 7, 2014, at 5:03 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> ----- Original Message -----
>> From: "Michael Zolotukhin" <mzolotukhin at apple.com>
>> To: "Hal J. Finkel" <hfinkel at anl.gov>
>> Cc: "LLVM Commits" <llvm-commits at cs.uiuc.edu>
>> Sent: Wednesday, May 7, 2014 7:07:35 AM
>> Subject: Re: [PATCH] Optimize redundant insertvalue instructions
>>
>>
>>
>> Hi Hal,
>>
>> Thank you for the review, I updated the patch accordingly to your
>> remarks.
>>
>> There is a more general alternative to the cut-off: we could move
>> from uses to defs, maintaining a bitvector, that indicates which
>> fields were written. In this case the complexity would be O(N) and
>> we will also catch partially overlapping accesses as well. I did
>> something like this in my ‘sophisticated’ implementation.
>>
>> However, I’d prefer the most simple implementation, so I think that
>> cut-off would be the best option here. I chose limit 10 - I don’t
>> expect long chains of insertvalue instructions anyway, and it is
>> enough for the original test.
>
> Fair enough.
>
>>
>> Here is the new patch:
>>
>>
>
> I don't actually see a call to visitInsertValueInst being inserted by the patch; I suppose you're putting it somewhere appropriate or else the test case would fail, right? Assuming that's the case, LGTM.
>
Thanks.
There is no need to explicitly call visitInsertValueInst. We use InstVisitor interface (there is a call ‘visit’ in InstCombiner::DoOneIteration). The function ‘visit' is a big switch, constructed by macroses from IR/Instruction.def, and once we override visitInsertValueInst, it starts to be called. That’s how I understand this - if I’m mistaken I’d appreciate any corrections here. And yes, the test will fail otherwise.
Michael
> -Hal
>
>>
>>
>>
>> Thanks,
>> Michael
>>
>> On May 7, 2014, at 3:01 PM, Hal Finkel <hfinkel at anl.gov> wrote:
>>
>>> Michael,
>>>
>>> +/// Here the second instruction inserts values at the same
>>> indices, as the
>>>
>>> +/// first one, making it redundant.
>>>
>>> You mean, "making the first one redundant."
>>>
>>> + Value *V = dyn_cast<Value>(&I);
>>>
>>> There should be no cast necessary here (and it certainly shouldn't
>>> be a dyn_cast).
>>>
>>> + V = dyn_cast<Value>(UserInsInst);
>>>
>>> Same here.
>>>
>>> + while (V->hasOneUse()) {
>>>
>>> Should we have a cut-off here? If this function is called on every
>>> InsertValue instruction, then this algorithm will be O(N^2) in the
>>> size of the InsertValue chain.
>>>
>>> -Hal
>>>
>>> ----- Original Message -----
>>>> From: "Michael Zolotukhin" <mzolotukhin at apple.com>
>>>> To: "LLVM Commits" <llvm-commits at cs.uiuc.edu>
>>>> Sent: Tuesday, May 6, 2014 9:42:12 AM
>>>> Subject: [PATCH] Optimize redundant insertvalue instructions
>>>>
>>>>
>>>> Hi,
>>>>
>>>>
>>>> This patch implements a simple optimization of redundant
>>>> insertvalue
>>>> instructions.
>>>>
>>>>
>>>> Here is a small example where it will help:
>>>>
>>>> %0 = insertvalue { i8, i32 } undef, i8 %x, 0
>>>> %1 = insertvalue { i8, i32 } %0, i8 %y, 0
>>>>
>>>>
>>>> In this example, the second instruction inserts values at the same
>>>> indices, as the first one, and consequently, the first instruction
>>>> is redundant.
>>>> This code will be transformed to:
>>>>
>>>> %0 = insertvalue { i8, i32 } undef, i8 %y, 0
>>>>
>>>>
>>>> This optimization catches nothing on specs and test-suite, but the
>>>> example was inspired by a real world application.
>>>>
>>>>
>>>> As an experiment, I tried a more sophisticated implementation,
>>>> which
>>>> was capable of dealing with several users and with partially
>>>> overlapping indices, but that also caught nothing on specs (and
>>>> for
>>>> my application the simple version was enough). If there is an
>>>> interest, I could share a patch with this more complicated
>>>> implementation as well.
>>>>
>>>>
>>>> Is it ok to commit this patch?
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> Thanks,
>>>> Michael
>>>
>>> --
>>> Hal Finkel
>>> Assistant Computational Scientist
>>> Leadership Computing Facility
>>> Argonne National Laboratory
>>
>>
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
More information about the llvm-commits
mailing list