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