Skip to content

Commit 6fa9358

Browse files
author
Adar Dagan
committed
Expand move trunc through shuffle splat
1 parent 484417a commit 6fa9358

File tree

3 files changed

+13
-7
lines changed

3 files changed

+13
-7
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -708,11 +708,17 @@ static Instruction *shrinkSplatShuffle(TruncInst &Trunc,
708708
auto *Shuf = dyn_cast<ShuffleVectorInst>(Trunc.getOperand(0));
709709
if (Shuf && Shuf->hasOneUse() && match(Shuf->getOperand(1), m_Undef()) &&
710710
all_equal(Shuf->getShuffleMask()) &&
711-
Shuf->getType() == Shuf->getOperand(0)->getType()) {
711+
Shuf->getType()->getScalarType() ==
712+
Shuf->getOperand(0)->getType()->getScalarType()) {
712713
// trunc (shuf X, Undef, SplatMask) --> shuf (trunc X), Poison, SplatMask
713714
// trunc (shuf X, Poison, SplatMask) --> shuf (trunc X), Poison, SplatMask
714-
Value *NarrowOp = Builder.CreateTrunc(Shuf->getOperand(0), Trunc.getType());
715-
return new ShuffleVectorInst(NarrowOp, Shuf->getShuffleMask());
715+
auto *const NewTruncTy = VectorType::get(
716+
Trunc.getType()->getScalarType(),
717+
cast<VectorType>(Shuf->getOperand(0)->getType())->getElementCount());
718+
Value *NarrowOp =
719+
Builder.CreateTrunc(Shuf->getOperand(0), NewTruncTy, Trunc.getName());
720+
return new ShuffleVectorInst(NarrowOp, Shuf->getShuffleMask(),
721+
Shuf->getName());
716722
}
717723

718724
return nullptr;

llvm/test/Transforms/InstCombine/trunc-inseltpoison.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -959,8 +959,8 @@ define <3 x i31> @wide_splat3(<3 x i33> %x) {
959959

960960
define <8 x i8> @wide_lengthening_splat(<4 x i16> %v) {
961961
; CHECK-LABEL: @wide_lengthening_splat(
962-
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i16> [[V:%.*]], <4 x i16> poison, <8 x i32> zeroinitializer
963-
; CHECK-NEXT: [[TR:%.*]] = trunc <8 x i16> [[SHUF]] to <8 x i8>
962+
; CHECK-NEXT: [[TMP1:%.*]] = trunc <4 x i16> [[V:%.*]] to <4 x i8>
963+
; CHECK-NEXT: [[TR:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <8 x i32> zeroinitializer
964964
; CHECK-NEXT: ret <8 x i8> [[TR]]
965965
;
966966
%shuf = shufflevector <4 x i16> %v, <4 x i16> %v, <8 x i32> zeroinitializer

llvm/test/Transforms/InstCombine/trunc.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -960,8 +960,8 @@ define <3 x i31> @wide_splat3(<3 x i33> %x) {
960960

961961
define <8 x i8> @wide_lengthening_splat(<4 x i16> %v) {
962962
; CHECK-LABEL: @wide_lengthening_splat(
963-
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i16> [[V:%.*]], <4 x i16> poison, <8 x i32> zeroinitializer
964-
; CHECK-NEXT: [[TR:%.*]] = trunc <8 x i16> [[SHUF]] to <8 x i8>
963+
; CHECK-NEXT: [[TMP1:%.*]] = trunc <4 x i16> [[V:%.*]] to <4 x i8>
964+
; CHECK-NEXT: [[TR:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <8 x i32> zeroinitializer
965965
; CHECK-NEXT: ret <8 x i8> [[TR]]
966966
;
967967
%shuf = shufflevector <4 x i16> %v, <4 x i16> %v, <8 x i32> zeroinitializer

0 commit comments

Comments
 (0)