diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp --- a/llvm/lib/IR/ConstantFold.cpp +++ b/llvm/lib/IR/ConstantFold.cpp @@ -683,6 +683,11 @@ if (isa(Idx)) return PoisonValue::get(Val->getType()); + // Inserting null into all zeros is still all zeros. + // TODO: This is true for undef and poison splats too. + if (isa(Val) && Elt->isNullValue()) + return Val; + ConstantInt *CIdx = dyn_cast(Idx); if (!CIdx) return nullptr; diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/InsertElement.ll b/llvm/test/Transforms/InstSimplify/ConstProp/InsertElement.ll --- a/llvm/test/Transforms/InstSimplify/ConstProp/InsertElement.ll +++ b/llvm/test/Transforms/InstSimplify/ConstProp/InsertElement.ll @@ -50,3 +50,19 @@ %E = extractelement <2 x i64> , i64 undef ret i64 %E } + +define @insertelement_scalable_null() { +; CHECK-LABEL: @insertelement_scalable_null( +; CHECK-NEXT: ret zeroinitializer +; + %vec = insertelement zeroinitializer, i32 0, i32 0 + ret %vec +} + +define @insertelement_scalable_null_fp() { +; CHECK-LABEL: @insertelement_scalable_null_fp( +; CHECK-NEXT: ret zeroinitializer +; + %vec = insertelement zeroinitializer, float 0.0, i32 1 + ret %vec +} diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/sve-widen-phi.ll b/llvm/test/Transforms/LoopVectorize/AArch64/sve-widen-phi.ll --- a/llvm/test/Transforms/LoopVectorize/AArch64/sve-widen-phi.ll +++ b/llvm/test/Transforms/LoopVectorize/AArch64/sve-widen-phi.ll @@ -251,7 +251,7 @@ ; CHECK: vector.body: ; CHECK-NEXT: [[POINTER_PHI:%.*]] = phi i32* [ [[A]], [[VECTOR_PH]] ], [ [[PTR_IND:%.*]], [[VECTOR_BODY]] ] ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] -; CHECK-NEXT: [[VEC_PHI:%.*]] = phi [ insertelement ( zeroinitializer, i32 0, i32 0), [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ] +; CHECK-NEXT: [[VEC_PHI:%.*]] = phi [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ] ; CHECK-NEXT: [[TMP4:%.*]] = call i64 @llvm.vscale.i64() ; CHECK-NEXT: [[TMP5:%.*]] = shl nuw nsw i64 [[TMP4]], 1 ; CHECK-NEXT: [[TMP6:%.*]] = call @llvm.experimental.stepvector.nxv2i64()