[LLVMdev] Why are imm shifts where imm >= width type eliminated entirely?

David Majnemer david.majnemer at gmail.com
Mon Apr 20 13:11:20 PDT 2015


On Mon, Apr 20, 2015 at 1:00 PM, Ryan Taylor <ryta1203 at gmail.com> wrote:

> For example:
>
> unsigned int x, y;
>
> void foo()
> {
>      y = x >> 129;
> }
>
> Where int is a 16bit type, the .ll is producing only 'ret void' at O3. At
> O0 the .ll looks fine but then llc gets rid of it an simply returns.
>
> I'm just curious what the reasoning is for this? It isn't trying to set y
> to anything at all.
>

The optimization is performed here:
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?revision=233938&view=markup#l1278

What will happen is:
  %shr = lshr i16, %x, 129
  store i16 %shr, i16* @y

will get transformed into:
  store i16 undef, i16* @y

Then we will delete the store of undef using the following:
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp?revision=234601&view=markup#l978


> Thanks.
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150420/0460147b/attachment.html>


More information about the llvm-dev mailing list