diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index 948c884b44dfe7..7d4fcdc456fec4 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -1715,7 +1715,7 @@ Constant *constantFoldVectorReduce(Intrinsic::ID IID, Constant *Op) { return ConstantInt::get(VT->getElementType(), 0); // This is the same as the underlying binops - poison propagates. - if (isa(Op)) + if (isa(Op) || Op->containsPoisonElement()) return PoisonValue::get(VT->getElementType()); // TODO: Handle undef. diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/vecreduce.ll b/llvm/test/Transforms/InstSimplify/ConstProp/vecreduce.ll index 2f0289a9dd2a7c..e27180b1a8909d 100644 --- a/llvm/test/Transforms/InstSimplify/ConstProp/vecreduce.ll +++ b/llvm/test/Transforms/InstSimplify/ConstProp/vecreduce.ll @@ -81,8 +81,7 @@ define i32 @add_poison() { define i32 @add_poison1() { ; CHECK-LABEL: @add_poison1( -; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> ) -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: ret i32 poison ; %x = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> ) ret i32 %x @@ -148,8 +147,7 @@ define i32 @mul_poison() { define i32 @mul_poison1() { ; CHECK-LABEL: @mul_poison1( -; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> ) -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: ret i32 poison ; %x = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> ) ret i32 %x @@ -215,8 +213,7 @@ define i32 @and_poison() { define i32 @and_poison1() { ; CHECK-LABEL: @and_poison1( -; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> ) -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: ret i32 poison ; %x = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> ) ret i32 %x @@ -282,8 +279,7 @@ define i32 @or_poison() { define i32 @or_poison1() { ; CHECK-LABEL: @or_poison1( -; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> ) -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: ret i32 poison ; %x = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> ) ret i32 %x @@ -349,8 +345,7 @@ define i32 @xor_poison() { define i32 @xor_poison1() { ; CHECK-LABEL: @xor_poison1( -; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> ) -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: ret i32 poison ; %x = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> ) ret i32 %x @@ -416,8 +411,7 @@ define i32 @smin_poison() { define i32 @smin_poison1() { ; CHECK-LABEL: @smin_poison1( -; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.vector.reduce.smin.v8i32(<8 x i32> ) -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: ret i32 poison ; %x = call i32 @llvm.vector.reduce.smin.v8i32(<8 x i32> ) ret i32 %x @@ -483,8 +477,7 @@ define i32 @smax_poison() { define i32 @smax_poison1() { ; CHECK-LABEL: @smax_poison1( -; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> ) -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: ret i32 poison ; %x = call i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> ) ret i32 %x @@ -550,8 +543,7 @@ define i32 @umin_poison() { define i32 @umin_poison1() { ; CHECK-LABEL: @umin_poison1( -; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> ) -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: ret i32 poison ; %x = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> ) ret i32 %x @@ -617,8 +609,7 @@ define i32 @umax_poison() { define i32 @umax_poison1() { ; CHECK-LABEL: @umax_poison1( -; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> ) -; CHECK-NEXT: ret i32 [[X]] +; CHECK-NEXT: ret i32 poison ; %x = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> ) ret i32 %x