[llvm] r359191 - [InstCombine][X86] Tweak generic expansion of PACKSS/PACKUS to shuffle then truncate. NFCI.

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 25 06:51:58 PDT 2019


Author: rksimon
Date: Thu Apr 25 06:51:57 2019
New Revision: 359191

URL: http://llvm.org/viewvc/llvm-project?rev=359191&view=rev
Log:
[InstCombine][X86] Tweak generic expansion of PACKSS/PACKUS to shuffle then truncate. NFCI.

This has no effect on constant folding but will be useful when we expand non-saturating PACKSS/PACKUS intrinsics.

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp?rev=359191&r1=359190&r2=359191&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp Thu Apr 25 06:51:57 2019
@@ -593,12 +593,7 @@ static Value *simplifyX86pack(IntrinsicI
   Arg0 = Builder.CreateSelect(Builder.CreateICmpSGT(Arg0, MaxC), MaxC, Arg0);
   Arg1 = Builder.CreateSelect(Builder.CreateICmpSGT(Arg1, MaxC), MaxC, Arg1);
 
-  // Truncate clamped args to dst size.
-  auto *TruncTy = VectorType::get(ResTy->getScalarType(), NumSrcElts);
-  Arg0 = Builder.CreateTrunc(Arg0, TruncTy);
-  Arg1 = Builder.CreateTrunc(Arg1, TruncTy);
-
-  // Shuffle args together at the lane level.
+  // Shuffle clamped args together at the lane level.
   SmallVector<unsigned, 32> PackMask;
   for (unsigned Lane = 0; Lane != NumLanes; ++Lane) {
     for (unsigned Elt = 0; Elt != NumSrcEltsPerLane; ++Elt)
@@ -606,8 +601,10 @@ static Value *simplifyX86pack(IntrinsicI
     for (unsigned Elt = 0; Elt != NumSrcEltsPerLane; ++Elt)
       PackMask.push_back(Elt + (Lane * NumSrcEltsPerLane) + NumSrcElts);
   }
+  auto *Shuffle = Builder.CreateShuffleVector(Arg0, Arg1, PackMask);
 
-  return Builder.CreateShuffleVector(Arg0, Arg1, PackMask);
+  // Truncate to dst size.
+  return Builder.CreateTrunc(Shuffle, ResTy);
 }
 
 // Replace X86-specific intrinsics with generic floor-ceil where applicable.




More information about the llvm-commits mailing list