Revert "[InstCombine] canonicalize trunc + insert as bitcast + shuffle, part 2"
authorSanjay Patel <spatel@rotateright.com>
Thu, 8 Dec 2022 14:58:17 +0000 (09:58 -0500)
committerSanjay Patel <spatel@rotateright.com>
Thu, 8 Dec 2022 14:58:17 +0000 (09:58 -0500)
This reverts commit dd8d0d21ce6d0665ef5d426372096aaed85b479a.
As discussed in the planned follow-on to this patch (D138874),
this and the previous patch in this set can cause trouble for
the backend, and there's probably no quick fix. We may even
want to canonicalize in the opposite direction (towards insertelt).

llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
llvm/test/Transforms/InstCombine/insert-trunc.ll

index 17a10d2..ab5c8d4 100644 (file)
@@ -1545,17 +1545,8 @@ static Instruction *foldTruncInsElt(InsertElementInst &InsElt, bool IsBigEndian,
     // The insert is to the LSB end of the vector (depends on endian).
     // That's all we need.
   } else {
-    // If not, we must match a right-shift to translate the insert index.
-    uint64_t ShiftC;
-    if (!match(T, m_OneUse(m_LShr(m_Value(X), m_ConstantInt(ShiftC)))))
-      return nullptr;
-
-    // Check the shift amount to see if this can be folded to an identity
-    // shuffle (assuming we are shuffling with an undef base vector).
-    // Big endian has MSB at vector index 0, so the insert index is flipped.
-    if (ShiftC != (IsBigEndian ? (NumEltsInScalar - 1 - IndexC) * VecEltWidth
-                               : IndexC * VecEltWidth))
-      return nullptr;
+    // TODO: Look through a shift-right and translate the insert index.
+    return nullptr;
   }
 
   // Bitcast the scalar to a vector type with the destination element type.
index 07b8100..20922f9 100644 (file)
@@ -143,16 +143,11 @@ define <4 x i8> @low_index_shorter_length_poison_basevec_extra_use(i64 %x) {
 }
 
 define <4 x i16> @lshr_same_length_poison_basevec_le(i64 %x) {
-; BE-LABEL: @lshr_same_length_poison_basevec_le(
-; BE-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 32
-; BE-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
-; BE-NEXT:    [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 2
-; BE-NEXT:    ret <4 x i16> [[R]]
-;
-; LE-LABEL: @lshr_same_length_poison_basevec_le(
-; LE-NEXT:    [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
-; LE-NEXT:    [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <4 x i32> <i32 undef, i32 undef, i32 2, i32 undef>
-; LE-NEXT:    ret <4 x i16> [[R]]
+; ALL-LABEL: @lshr_same_length_poison_basevec_le(
+; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 32
+; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
+; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 2
+; ALL-NEXT:    ret <4 x i16> [[R]]
 ;
   %s = lshr i64 %x, 32
   %t = trunc i64 %s to i16
@@ -161,16 +156,11 @@ define <4 x i16> @lshr_same_length_poison_basevec_le(i64 %x) {
 }
 
 define <4 x i16> @lshr_same_length_poison_basevec_be(i64 %x) {
-; BE-LABEL: @lshr_same_length_poison_basevec_be(
-; BE-NEXT:    [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
-; BE-NEXT:    [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <4 x i32> <i32 undef, i32 1, i32 undef, i32 undef>
-; BE-NEXT:    ret <4 x i16> [[R]]
-;
-; LE-LABEL: @lshr_same_length_poison_basevec_be(
-; LE-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 32
-; LE-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
-; LE-NEXT:    [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 1
-; LE-NEXT:    ret <4 x i16> [[R]]
+; ALL-LABEL: @lshr_same_length_poison_basevec_be(
+; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 32
+; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
+; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 1
+; ALL-NEXT:    ret <4 x i16> [[R]]
 ;
   %s = lshr i64 %x, 32
   %t = trunc i64 %s to i16
@@ -180,8 +170,9 @@ define <4 x i16> @lshr_same_length_poison_basevec_be(i64 %x) {
 
 define <4 x i16> @lshr_same_length_poison_basevec_both_endian(i64 %x) {
 ; BE-LABEL: @lshr_same_length_poison_basevec_both_endian(
-; BE-NEXT:    [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
-; BE-NEXT:    [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>
+; BE-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 48
+; BE-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
+; BE-NEXT:    [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 0
 ; BE-NEXT:    ret <4 x i16> [[R]]
 ;
 ; LE-LABEL: @lshr_same_length_poison_basevec_both_endian(
@@ -217,8 +208,9 @@ define <8 x i16> @lshr_longer_length_poison_basevec_le(i64 %x) {
 ; BE-NEXT:    ret <8 x i16> [[R]]
 ;
 ; LE-LABEL: @lshr_longer_length_poison_basevec_le(
-; LE-NEXT:    [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
-; LE-NEXT:    [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
+; LE-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 48
+; LE-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
+; LE-NEXT:    [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 3
 ; LE-NEXT:    ret <8 x i16> [[R]]
 ;
   %s = lshr i64 %x, 48
@@ -228,16 +220,11 @@ define <8 x i16> @lshr_longer_length_poison_basevec_le(i64 %x) {
 }
 
 define <8 x i16> @lshr_longer_length_poison_basevec_be(i64 %x) {
-; BE-LABEL: @lshr_longer_length_poison_basevec_be(
-; BE-NEXT:    [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
-; BE-NEXT:    [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <8 x i32> <i32 undef, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
-; BE-NEXT:    ret <8 x i16> [[R]]
-;
-; LE-LABEL: @lshr_longer_length_poison_basevec_be(
-; LE-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 32
-; LE-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
-; LE-NEXT:    [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 1
-; LE-NEXT:    ret <8 x i16> [[R]]
+; ALL-LABEL: @lshr_longer_length_poison_basevec_be(
+; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 32
+; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
+; ALL-NEXT:    [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 1
+; ALL-NEXT:    ret <8 x i16> [[R]]
 ;
   %s = lshr i64 %x, 32
   %t = trunc i64 %s to i16
@@ -259,16 +246,11 @@ define <8 x i16> @lshr_wrong_index_longer_length_poison_basevec(i64 %x) {
 }
 
 define <2 x i16> @lshr_shorter_length_poison_basevec_le(i64 %x) {
-; BE-LABEL: @lshr_shorter_length_poison_basevec_le(
-; BE-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 16
-; BE-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
-; BE-NEXT:    [[R:%.*]] = insertelement <2 x i16> poison, i16 [[T]], i64 1
-; BE-NEXT:    ret <2 x i16> [[R]]
-;
-; LE-LABEL: @lshr_shorter_length_poison_basevec_le(
-; LE-NEXT:    [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
-; LE-NEXT:    [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <2 x i32> <i32 undef, i32 1>
-; LE-NEXT:    ret <2 x i16> [[R]]
+; ALL-LABEL: @lshr_shorter_length_poison_basevec_le(
+; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 16
+; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i16
+; ALL-NEXT:    [[R:%.*]] = insertelement <2 x i16> poison, i16 [[T]], i64 1
+; ALL-NEXT:    ret <2 x i16> [[R]]
 ;
   %s = lshr i64 %x, 16
   %t = trunc i64 %s to i16
@@ -277,16 +259,11 @@ define <2 x i16> @lshr_shorter_length_poison_basevec_le(i64 %x) {
 }
 
 define <4 x i8> @lshr_shorter_length_poison_basevec_be(i64 %x) {
-; BE-LABEL: @lshr_shorter_length_poison_basevec_be(
-; BE-NEXT:    [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <8 x i8>
-; BE-NEXT:    [[R:%.*]] = shufflevector <8 x i8> [[VEC_X]], <8 x i8> poison, <4 x i32> <i32 undef, i32 undef, i32 2, i32 undef>
-; BE-NEXT:    ret <4 x i8> [[R]]
-;
-; LE-LABEL: @lshr_shorter_length_poison_basevec_be(
-; LE-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 40
-; LE-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i8
-; LE-NEXT:    [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 2
-; LE-NEXT:    ret <4 x i8> [[R]]
+; ALL-LABEL: @lshr_shorter_length_poison_basevec_be(
+; ALL-NEXT:    [[S:%.*]] = lshr i64 [[X:%.*]], 40
+; ALL-NEXT:    [[T:%.*]] = trunc i64 [[S]] to i8
+; ALL-NEXT:    [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 2
+; ALL-NEXT:    ret <4 x i8> [[R]]
 ;
   %s = lshr i64 %x, 40
   %t = trunc i64 %s to i8