diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp index 6c917e4eef655..5ddab73474ba2 100644 --- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp +++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp @@ -951,6 +951,11 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) { if (match(&R, m_c_Mul(m_VPValue(A), m_SpecificInt(1)))) return R.getVPSingleValue()->replaceAllUsesWith(A); + if (match(&R, m_c_Mul(m_VPValue(A), m_SpecificInt(0)))) { + unsigned ZeroIdx = R.getOperand(0) == A ? 1 : 0; + return R.getVPSingleValue()->replaceAllUsesWith(R.getOperand(ZeroIdx)); + } + if (match(&R, m_Not(m_Not(m_VPValue(A))))) return R.getVPSingleValue()->replaceAllUsesWith(A); diff --git a/llvm/test/Transforms/LoopVectorize/RISCV/type-info-cache-evl-crash.ll b/llvm/test/Transforms/LoopVectorize/RISCV/type-info-cache-evl-crash.ll index 7de51bc3a8a68..3368d7c44fd5e 100644 --- a/llvm/test/Transforms/LoopVectorize/RISCV/type-info-cache-evl-crash.ll +++ b/llvm/test/Transforms/LoopVectorize/RISCV/type-info-cache-evl-crash.ll @@ -45,15 +45,13 @@ define void @type_info_cache_clobber(ptr %dstv, ptr %src, i64 %wide.trip.count) ; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP13]], i32 0 ; CHECK-NEXT: [[VP_OP_LOAD:%.*]] = call @llvm.vp.load.nxv8i8.p0(ptr align 1 [[TMP14]], splat (i1 true), i32 [[TMP11]]), !alias.scope [[META0:![0-9]+]] ; CHECK-NEXT: [[TMP15:%.*]] = call @llvm.vp.zext.nxv8i32.nxv8i8( [[VP_OP_LOAD]], splat (i1 true), i32 [[TMP11]]) -; CHECK-NEXT: [[VP_OP:%.*]] = call @llvm.vp.mul.nxv8i32( [[TMP15]], zeroinitializer, splat (i1 true), i32 [[TMP11]]) ; CHECK-NEXT: [[VP_OP2:%.*]] = call @llvm.vp.ashr.nxv8i32( [[TMP15]], zeroinitializer, splat (i1 true), i32 [[TMP11]]) ; CHECK-NEXT: [[VP_OP3:%.*]] = call @llvm.vp.or.nxv8i32( [[VP_OP2]], zeroinitializer, splat (i1 true), i32 [[TMP11]]) ; CHECK-NEXT: [[TMP16:%.*]] = icmp ult [[TMP15]], zeroinitializer ; CHECK-NEXT: [[TMP17:%.*]] = call @llvm.vp.select.nxv8i32( [[TMP16]], [[VP_OP3]], zeroinitializer, i32 [[TMP11]]) ; CHECK-NEXT: [[TMP18:%.*]] = call @llvm.vp.trunc.nxv8i8.nxv8i32( [[TMP17]], splat (i1 true), i32 [[TMP11]]) ; CHECK-NEXT: call void @llvm.vp.scatter.nxv8i8.nxv8p0( [[TMP18]], align 1 [[BROADCAST_SPLAT]], splat (i1 true), i32 [[TMP11]]), !alias.scope [[META3:![0-9]+]], !noalias [[META0]] -; CHECK-NEXT: [[TMP19:%.*]] = call @llvm.vp.trunc.nxv8i16.nxv8i32( [[VP_OP]], splat (i1 true), i32 [[TMP11]]) -; CHECK-NEXT: call void @llvm.vp.scatter.nxv8i16.nxv8p0( [[TMP19]], align 2 zeroinitializer, splat (i1 true), i32 [[TMP11]]) +; CHECK-NEXT: call void @llvm.vp.scatter.nxv8i16.nxv8p0( zeroinitializer, align 2 zeroinitializer, splat (i1 true), i32 [[TMP11]]) ; CHECK-NEXT: [[TMP20:%.*]] = zext i32 [[TMP11]] to i64 ; CHECK-NEXT: [[INDEX_EVL_NEXT]] = add i64 [[TMP20]], [[EVL_BASED_IV]] ; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], [[TMP10]]