diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp --- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp +++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp @@ -670,6 +670,12 @@ if (match(U, m_Select(m_Specific(&I), m_Value(), m_Value()))) return false; + Value *ShuffleOp0; + if (match(Ins0, m_Shuffle(m_Value(ShuffleOp0), m_Undef(), m_ZeroMask()))) + Ins0 = ShuffleOp0; + if (match(Ins1, m_Shuffle(m_Value(ShuffleOp0), m_Undef(), m_ZeroMask()))) + Ins1 = ShuffleOp0; + // Match against one or both scalar values being inserted into constant // vectors: // vec_op VecC0, (inselt VecC1, V1, Index) diff --git a/llvm/test/Transforms/VectorCombine/AArch64/insert-shuffle-binop.ll b/llvm/test/Transforms/VectorCombine/AArch64/insert-shuffle-binop.ll --- a/llvm/test/Transforms/VectorCombine/AArch64/insert-shuffle-binop.ll +++ b/llvm/test/Transforms/VectorCombine/AArch64/insert-shuffle-binop.ll @@ -5,10 +5,8 @@ define @fadd_vscale_insertelt_a_shuffle_insert_b(float %0, float %1) { ; CHECK-LABEL: @fadd_vscale_insertelt_a_shuffle_insert_b( -; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement poison, float [[TMP0:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector [[BROADCAST_SPLATINSERT]], poison, zeroinitializer -; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement poison, float [[TMP1:%.*]], i64 0 -; CHECK-NEXT: [[R:%.*]] = fadd fast [[BROADCAST_SPLATINSERT2]], [[BROADCAST_SPLAT]] +; CHECK-NEXT: [[R_SCALAR:%.*]] = fadd fast float [[TMP1:%.*]], [[TMP0:%.*]] +; CHECK-NEXT: [[R:%.*]] = insertelement poison, float [[R_SCALAR]], i64 0 ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector [[R]], poison, zeroinitializer ; CHECK-NEXT: ret [[TMP3]] ; @@ -22,10 +20,8 @@ define <4 x float> @fadd_fixed_insertelt_a_shuffle_insert_b(float %0, float %1) { ; CHECK-LABEL: @fadd_fixed_insertelt_a_shuffle_insert_b( -; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[TMP0:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer -; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement <4 x float> poison, float [[TMP1:%.*]], i64 0 -; CHECK-NEXT: [[R:%.*]] = fadd fast <4 x float> [[BROADCAST_SPLATINSERT2]], [[BROADCAST_SPLAT]] +; CHECK-NEXT: [[R_SCALAR:%.*]] = fadd fast float [[TMP1:%.*]], [[TMP0:%.*]] +; CHECK-NEXT: [[R:%.*]] = insertelement <4 x float> poison, float [[R_SCALAR]], i64 0 ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x float> [[R]], <4 x float> poison, <4 x i32> zeroinitializer ; CHECK-NEXT: ret <4 x float> [[TMP3]] ; @@ -39,10 +35,8 @@ define @fsub_vscale_insertelt_a_shuffle_insert_b(float %0, float %1) { ; CHECK-LABEL: @fsub_vscale_insertelt_a_shuffle_insert_b( -; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement poison, float [[TMP0:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector [[BROADCAST_SPLATINSERT]], poison, zeroinitializer -; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement poison, float [[TMP1:%.*]], i64 0 -; CHECK-NEXT: [[R:%.*]] = fsub fast [[BROADCAST_SPLATINSERT2]], [[BROADCAST_SPLAT]] +; CHECK-NEXT: [[R_SCALAR:%.*]] = fsub fast float [[TMP1:%.*]], [[TMP0:%.*]] +; CHECK-NEXT: [[R:%.*]] = insertelement poison, float [[R_SCALAR]], i64 0 ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector [[R]], poison, zeroinitializer ; CHECK-NEXT: ret [[TMP3]] ; @@ -56,10 +50,8 @@ define <4 x float> @fsub_fixed_insertelt_a_shuffle_insert_b(float %0, float %1) { ; CHECK-LABEL: @fsub_fixed_insertelt_a_shuffle_insert_b( -; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[TMP0:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer -; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement <4 x float> poison, float [[TMP1:%.*]], i64 0 -; CHECK-NEXT: [[R:%.*]] = fsub fast <4 x float> [[BROADCAST_SPLATINSERT2]], [[BROADCAST_SPLAT]] +; CHECK-NEXT: [[R_SCALAR:%.*]] = fsub fast float [[TMP1:%.*]], [[TMP0:%.*]] +; CHECK-NEXT: [[R:%.*]] = insertelement <4 x float> poison, float [[R_SCALAR]], i64 0 ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x float> [[R]], <4 x float> poison, <4 x i32> zeroinitializer ; CHECK-NEXT: ret <4 x float> [[TMP3]] ; @@ -73,10 +65,8 @@ define @fadd_vscale_shuffle_insert_a_insert_b(float %0, float %1) { ; CHECK-LABEL: @fadd_vscale_shuffle_insert_a_insert_b( -; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement poison, float [[TMP0:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector [[BROADCAST_SPLATINSERT]], poison, zeroinitializer -; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement poison, float [[TMP1:%.*]], i64 0 -; CHECK-NEXT: [[R:%.*]] = fadd fast [[BROADCAST_SPLAT]], [[BROADCAST_SPLATINSERT2]] +; CHECK-NEXT: [[R_SCALAR:%.*]] = fadd fast float [[TMP0:%.*]], [[TMP1:%.*]] +; CHECK-NEXT: [[R:%.*]] = insertelement poison, float [[R_SCALAR]], i64 0 ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector [[R]], poison, zeroinitializer ; CHECK-NEXT: ret [[TMP3]] ; @@ -90,10 +80,8 @@ define <4 x float> @fadd_fixed_shuffle_insert_a_insert_b(float %0, float %1) { ; CHECK-LABEL: @fadd_fixed_shuffle_insert_a_insert_b( -; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[TMP0:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer -; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement <4 x float> poison, float [[TMP1:%.*]], i64 0 -; CHECK-NEXT: [[R:%.*]] = fadd fast <4 x float> [[BROADCAST_SPLAT]], [[BROADCAST_SPLATINSERT2]] +; CHECK-NEXT: [[R_SCALAR:%.*]] = fadd fast float [[TMP0:%.*]], [[TMP1:%.*]] +; CHECK-NEXT: [[R:%.*]] = insertelement <4 x float> poison, float [[R_SCALAR]], i64 0 ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x float> [[R]], <4 x float> poison, <4 x i32> zeroinitializer ; CHECK-NEXT: ret <4 x float> [[TMP3]] ; @@ -107,10 +95,8 @@ define @fsub_vscale_shuffle_insert_a_insert_b(float %0, float %1) { ; CHECK-LABEL: @fsub_vscale_shuffle_insert_a_insert_b( -; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement poison, float [[TMP0:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector [[BROADCAST_SPLATINSERT]], poison, zeroinitializer -; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement poison, float [[TMP1:%.*]], i64 0 -; CHECK-NEXT: [[R:%.*]] = fsub fast [[BROADCAST_SPLAT]], [[BROADCAST_SPLATINSERT2]] +; CHECK-NEXT: [[R_SCALAR:%.*]] = fsub fast float [[TMP0:%.*]], [[TMP1:%.*]] +; CHECK-NEXT: [[R:%.*]] = insertelement poison, float [[R_SCALAR]], i64 0 ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector [[R]], poison, zeroinitializer ; CHECK-NEXT: ret [[TMP3]] ; @@ -124,10 +110,8 @@ define <4 x float> @fsub_fixed_shuffle_insert_a_insert_b(float %0, float %1) { ; CHECK-LABEL: @fsub_fixed_shuffle_insert_a_insert_b( -; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[TMP0:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer -; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement <4 x float> poison, float [[TMP1:%.*]], i64 0 -; CHECK-NEXT: [[R:%.*]] = fsub fast <4 x float> [[BROADCAST_SPLAT]], [[BROADCAST_SPLATINSERT2]] +; CHECK-NEXT: [[R_SCALAR:%.*]] = fsub fast float [[TMP0:%.*]], [[TMP1:%.*]] +; CHECK-NEXT: [[R:%.*]] = insertelement <4 x float> poison, float [[R_SCALAR]], i64 0 ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x float> [[R]], <4 x float> poison, <4 x i32> zeroinitializer ; CHECK-NEXT: ret <4 x float> [[TMP3]] ; @@ -141,11 +125,8 @@ define @fadd_vscale_shuffle_insert_a_shuffle_insert_b(float %0, float %1) { ; CHECK-LABEL: @fadd_vscale_shuffle_insert_a_shuffle_insert_b( -; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement poison, float [[TMP0:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector [[BROADCAST_SPLATINSERT]], poison, zeroinitializer -; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement poison, float [[TMP1:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT2:%.*]] = shufflevector [[BROADCAST_SPLATINSERT2]], poison, zeroinitializer -; CHECK-NEXT: [[R:%.*]] = fadd fast [[BROADCAST_SPLAT]], [[BROADCAST_SPLAT2]] +; CHECK-NEXT: [[R_SCALAR:%.*]] = fadd fast float [[TMP0:%.*]], [[TMP1:%.*]] +; CHECK-NEXT: [[R:%.*]] = insertelement poison, float [[R_SCALAR]], i64 0 ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector [[R]], poison, zeroinitializer ; CHECK-NEXT: ret [[TMP3]] ; @@ -160,11 +141,8 @@ define <4 x float> @fadd_fixed_shuffle_insert_a_shuffle_insert_b(float %0, float %1) { ; CHECK-LABEL: @fadd_fixed_shuffle_insert_a_shuffle_insert_b( -; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[TMP0:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer -; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement <4 x float> poison, float [[TMP1:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT2:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT2]], <4 x float> poison, <4 x i32> zeroinitializer -; CHECK-NEXT: [[R:%.*]] = fadd fast <4 x float> [[BROADCAST_SPLAT]], [[BROADCAST_SPLAT2]] +; CHECK-NEXT: [[R_SCALAR:%.*]] = fadd fast float [[TMP0:%.*]], [[TMP1:%.*]] +; CHECK-NEXT: [[R:%.*]] = insertelement <4 x float> poison, float [[R_SCALAR]], i64 0 ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x float> [[R]], <4 x float> poison, <4 x i32> zeroinitializer ; CHECK-NEXT: ret <4 x float> [[TMP3]] ; @@ -179,11 +157,8 @@ define @fsub_vscale_shuffle_insert_a_shuffle_insert_b(float %0, float %1) { ; CHECK-LABEL: @fsub_vscale_shuffle_insert_a_shuffle_insert_b( -; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement poison, float [[TMP0:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector [[BROADCAST_SPLATINSERT]], poison, zeroinitializer -; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement poison, float [[TMP1:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT2:%.*]] = shufflevector [[BROADCAST_SPLATINSERT2]], poison, zeroinitializer -; CHECK-NEXT: [[R:%.*]] = fsub fast [[BROADCAST_SPLAT]], [[BROADCAST_SPLAT2]] +; CHECK-NEXT: [[R_SCALAR:%.*]] = fsub fast float [[TMP0:%.*]], [[TMP1:%.*]] +; CHECK-NEXT: [[R:%.*]] = insertelement poison, float [[R_SCALAR]], i64 0 ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector [[R]], poison, zeroinitializer ; CHECK-NEXT: ret [[TMP3]] ; @@ -198,11 +173,8 @@ define <4 x float> @fsub_fixed_shuffle_insert_a_shuffle_insert_b(float %0, float %1) { ; CHECK-LABEL: @fsub_fixed_shuffle_insert_a_shuffle_insert_b( -; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[TMP0:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer -; CHECK-NEXT: [[BROADCAST_SPLATINSERT2:%.*]] = insertelement <4 x float> poison, float [[TMP1:%.*]], i64 0 -; CHECK-NEXT: [[BROADCAST_SPLAT2:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT2]], <4 x float> poison, <4 x i32> zeroinitializer -; CHECK-NEXT: [[R:%.*]] = fsub fast <4 x float> [[BROADCAST_SPLAT]], [[BROADCAST_SPLAT2]] +; CHECK-NEXT: [[R_SCALAR:%.*]] = fsub fast float [[TMP0:%.*]], [[TMP1:%.*]] +; CHECK-NEXT: [[R:%.*]] = insertelement <4 x float> poison, float [[R_SCALAR]], i64 0 ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x float> [[R]], <4 x float> poison, <4 x i32> zeroinitializer ; CHECK-NEXT: ret <4 x float> [[TMP3]] ;