[llvm] r255124 - [InstCombine] fold bitcasts around an extractelement

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 9 08:42:52 PST 2015


Thanks, Mehdi.
Taking a look now.

On Wed, Dec 9, 2015 at 9:35 AM, Mehdi Amini <mehdi.amini at apple.com> wrote:

> Hi Sanjay,
>
> I reverted in r255126, this broke a clang test:
> http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/builds/4193/steps/test/logs/stdio
>
> Best,
>
>> Mehdi
>
>
> > On Dec 9, 2015, at 8:17 AM, Sanjay Patel via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
> >
> > Author: spatel
> > Date: Wed Dec  9 10:17:20 2015
> > New Revision: 255124
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=255124&view=rev
> > Log:
> > [InstCombine] fold bitcasts around an extractelement
> >
> > Example:
> >  bitcast (extractelement (bitcast <2 x float> %X to <2 x i32>), 1) to
> float
> >    --->
> >  extractelement <2 x float> %X, i32 1
> >
> > This is part of fixing PR25543:
> > https://llvm.org/bugs/show_bug.cgi?id=25543
> >
> > The next step will be to generalize this fold:
> > trunc ( lshr ( bitcast X) ) -> extractelement (X)
> >
> > Ie, I'm hoping to replace the existing transform of:
> > bitcast ( trunc ( lshr ( bitcast X)))
> > added by:
> > http://reviews.llvm.org/rL112232
> >
> > with 2 less specific transforms to catch the case in the bug report.
> >
> > Differential Revision: http://reviews.llvm.org/D14879
> >
> >
> > Modified:
> >    llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
> >    llvm/trunk/test/Transforms/InstCombine/bitcast.ll
> >
> > Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=255124&r1=255123&r2=255124&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original)
> > +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Wed Dec
> 9 10:17:20 2015
> > @@ -1715,6 +1715,40 @@ static Value *optimizeIntegerToVectorIns
> >   return Result;
> > }
> >
> > +/// Given a bitcasted vector fed into an extract element instruction
> and then
> > +/// bitcasted again, eliminate at least one bitcast by changing the
> vector type
> > +/// of the extractelement instruction.
> > +/// Example:
> > +///   bitcast (extractelement (bitcast <2 x float> %X to <2 x i32>), 1)
> to float
> > +///    --->
> > +///   extractelement <2 x float> %X, i32 1
> > +static Instruction *foldBitCastExtElt(BitCastInst &BitCast,
> InstCombiner &IC,
> > +                                      const DataLayout &DL) {
> > +  // TODO: Create and use a pattern matcher for ExtractElementInst.
> > +  auto *ExtElt = dyn_cast<ExtractElementInst>(BitCast.getOperand(0));
> > +  if (!ExtElt || !ExtElt->hasOneUse())
> > +    return nullptr;
> > +
> > +  Value *InnerBitCast = nullptr;
> > +  if (!match(ExtElt->getOperand(0), m_BitCast(m_Value(InnerBitCast))))
> > +    return nullptr;
> > +
> > +  VectorType *VecType = cast<VectorType>(InnerBitCast->getType());
> > +  Type *DestType = BitCast.getType();
> > +
> > +  // If the element type of the vector doesn't match the result type,
> > +  // bitcast it to a vector type that we can extract from.
> > +  if (VecType->getElementType() != DestType) {
> > +    unsigned VecWidth = VecType->getPrimitiveSizeInBits();
> > +    unsigned DestWidth = DestType->getPrimitiveSizeInBits();
> > +    unsigned NumElts = VecWidth / DestWidth;
> > +    VecType = VectorType::get(DestType, NumElts);
> > +    InnerBitCast = IC.Builder->CreateBitCast(InnerBitCast, VecType,
> "bc");
> > +  }
> > +
> > +  return ExtractElementInst::Create(InnerBitCast,
> ExtElt->getOperand(1));
> > +}
> > +
> > static Instruction *foldVecTruncToExtElt(Value *VecInput, Type *DestTy,
> >                                          unsigned ShiftAmt, InstCombiner
> &IC,
> >                                          const DataLayout &DL) {
> > @@ -1886,6 +1920,9 @@ Instruction *InstCombiner::visitBitCast(
> >     }
> >   }
> >
> > +  if (Instruction *I = foldBitCastExtElt(CI, *this, DL))
> > +    return I;
> > +
> >   if (SrcTy->isPointerTy())
> >     return commonPointerCastTransforms(CI);
> >   return commonCastTransforms(CI);
> >
> > Modified: llvm/trunk/test/Transforms/InstCombine/bitcast.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/bitcast.ll?rev=255124&r1=255123&r2=255124&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/Transforms/InstCombine/bitcast.ll (original)
> > +++ llvm/trunk/test/Transforms/InstCombine/bitcast.ll Wed Dec  9
> 10:17:20 2015
> > @@ -64,7 +64,7 @@ define float @test3(<2 x float> %A, <2 x
> > ; CHECK-NEXT:  ret float %add
> > }
> >
> > -; TODO: Both bitcasts are unnecessary; change the extractelement.
> > +; Both bitcasts are unnecessary; change the extractelement.
> >
> > define float @bitcast_extelt1(<2 x float> %A) {
> >   %bc1 = bitcast <2 x float> %A to <2 x i32>
> > @@ -73,13 +73,11 @@ define float @bitcast_extelt1(<2 x float
> >   ret float %bc2
> >
> > ; CHECK-LABEL: @bitcast_extelt1(
> > -; CHECK-NEXT:  %bc1 = bitcast <2 x float> %A to <2 x i32>
> > -; CHECK-NEXT:  %ext = extractelement <2 x i32> %bc1, i32 0
> > -; CHECK-NEXT:  %bc2 = bitcast i32 %ext to float
> > +; CHECK-NEXT:  %bc2 = extractelement <2 x float> %A, i32 0
> > ; CHECK-NEXT:  ret float %bc2
> > }
> >
> > -; TODO: Second bitcast can be folded into the first.
> > +; Second bitcast can be folded into the first.
> >
> > define i64 @bitcast_extelt2(<4 x float> %A) {
> >   %bc1 = bitcast <4 x float> %A to <2 x double>
> > @@ -88,9 +86,8 @@ define i64 @bitcast_extelt2(<4 x float>
> >   ret i64 %bc2
> >
> > ; CHECK-LABEL: @bitcast_extelt2(
> > -; CHECK-NEXT:  %bc1 = bitcast <4 x float> %A to <2 x double>
> > -; CHECK-NEXT:  %ext = extractelement <2 x double> %bc1, i32 1
> > -; CHECK-NEXT:  %bc2 = bitcast double %ext to i64
> > +; CHECK-NEXT:  %bc = bitcast <4 x float> %A to <2 x i64>
> > +; CHECK-NEXT:  %bc2 = extractelement <2 x i64> %bc, i32 1
> > ; CHECK-NEXT:  ret i64 %bc2
> > }
> >
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151209/7ce20d58/attachment.html>


More information about the llvm-commits mailing list