[PATCH] Optimize redundant insertvalue instructions

Michael Zolotukhin mzolotukhin at apple.com
Wed May 7 05:07:35 PDT 2014


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.

Here is the new patch:

-------------- next part --------------
A non-text attachment was scrubbed...
Name: redundant-insertvalue-v2.patch
Type: application/octet-stream
Size: 3222 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140507/81805d54/attachment.obj>
-------------- next part --------------


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



More information about the llvm-commits mailing list