diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index a21d3cec37e48e..b5169e540df73f 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -2506,6 +2506,11 @@ static Constant *ConstantFoldScalarCall2(StringRef Name, case Intrinsic::smin: case Intrinsic::umax: case Intrinsic::umin: + // This is the same as for binary ops - poison propagates. + // TODO: Poison handling should be consolidated. + if (isa(Operands[0]) || isa(Operands[1])) + return PoisonValue::get(Ty); + if (!C0 && !C1) return UndefValue::get(Ty); if (!C0 || !C1) diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/min-max.ll b/llvm/test/Transforms/InstSimplify/ConstProp/min-max.ll index 6196333844758d..a5f5d4e12ed842 100644 --- a/llvm/test/Transforms/InstSimplify/ConstProp/min-max.ll +++ b/llvm/test/Transforms/InstSimplify/ConstProp/min-max.ll @@ -291,7 +291,7 @@ define i8 @smax() { define <5 x i8> @smax_vec() { ; CHECK-LABEL: @smax_vec( -; CHECK-NEXT: ret <5 x i8> +; CHECK-NEXT: ret <5 x i8> ; %r = call <5 x i8> @llvm.smax.v5i8(<5 x i8> , <5 x i8> ) ret <5 x i8> %r @@ -307,7 +307,7 @@ define i8 @smin() { define <5 x i8> @smin_vec() { ; CHECK-LABEL: @smin_vec( -; CHECK-NEXT: ret <5 x i8> +; CHECK-NEXT: ret <5 x i8> ; %r = call <5 x i8> @llvm.smin.v5i8(<5 x i8> , <5 x i8> ) ret <5 x i8> %r @@ -323,7 +323,7 @@ define i8 @umax() { define <5 x i8> @umax_vec() { ; CHECK-LABEL: @umax_vec( -; CHECK-NEXT: ret <5 x i8> +; CHECK-NEXT: ret <5 x i8> ; %r = call <5 x i8> @llvm.umax.v5i8(<5 x i8> , <5 x i8> ) ret <5 x i8> %r @@ -339,7 +339,7 @@ define i8 @umin() { define <5 x i8> @umin_vec() { ; CHECK-LABEL: @umin_vec( -; CHECK-NEXT: ret <5 x i8> +; CHECK-NEXT: ret <5 x i8> ; %r = call <5 x i8> @llvm.umin.v5i8(<5 x i8> , <5 x i8> ) ret <5 x i8> %r