diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index b1601bfe1b2..ffdbfc45c84 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -4767,9 +4767,10 @@ static Value *simplifyBinaryIntrinsic(Function *F, Value *Op0, Value *Op1, // If the arguments are the same, this is a no-op. if (Op0 == Op1) return Op0; - // If one argument is NaN, return the other argument. - if (match(Op0, m_NaN())) return Op1; - if (match(Op1, m_NaN())) return Op0; + // If one argument is NaN or undef, return the other argument. + if (match(Op0, m_CombineOr(m_NaN(), m_Undef()))) return Op1; + if (match(Op1, m_CombineOr(m_NaN(), m_Undef()))) return Op0; + break; default: break; diff --git a/lib/Transforms/InstCombine/InstCombineCalls.cpp b/lib/Transforms/InstCombine/InstCombineCalls.cpp index 77c5a06ee11..748cb97d9b5 100644 --- a/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -1143,17 +1143,6 @@ static Value *simplifyMinnumMaxnum(const IntrinsicInst &II) { if (C1 && C1->isNaN()) return Arg0; - // This is the value because if undef were NaN, we would return the other - // value and cannot return a NaN unless both operands are. - // - // fmin(undef, x) -> x - if (isa(Arg0)) - return Arg1; - - // fmin(x, undef) -> x - if (isa(Arg1)) - return Arg0; - Value *X = nullptr; Value *Y = nullptr; if (II.getIntrinsicID() == Intrinsic::minnum) { diff --git a/test/Transforms/InstCombine/maxnum.ll b/test/Transforms/InstCombine/maxnum.ll index ff415aa86f6..c929c782542 100644 --- a/test/Transforms/InstCombine/maxnum.ll +++ b/test/Transforms/InstCombine/maxnum.ll @@ -153,22 +153,6 @@ define float @fold_maxnum_f32_undef_undef(float %x) { ret float %val } -define float @fold_maxnum_f32_val_undef(float %x) { -; CHECK-LABEL: @fold_maxnum_f32_val_undef( -; CHECK-NEXT: ret float [[X:%.*]] -; - %val = call float @llvm.maxnum.f32(float %x, float undef) - ret float %val -} - -define float @fold_maxnum_f32_undef_val(float %x) { -; CHECK-LABEL: @fold_maxnum_f32_undef_val( -; CHECK-NEXT: ret float [[X:%.*]] -; - %val = call float @llvm.maxnum.f32(float undef, float %x) - ret float %val -} - define float @maxnum_x_maxnum_x_y(float %x, float %y) { ; CHECK-LABEL: @maxnum_x_maxnum_x_y( ; CHECK-NEXT: [[A:%.*]] = call float @llvm.maxnum.f32(float [[X:%.*]], float [[Y:%.*]]) diff --git a/test/Transforms/InstCombine/minnum.ll b/test/Transforms/InstCombine/minnum.ll index 7cf9d1bc758..7e98eba26c4 100644 --- a/test/Transforms/InstCombine/minnum.ll +++ b/test/Transforms/InstCombine/minnum.ll @@ -155,22 +155,6 @@ define float @fold_minnum_f32_undef_undef(float %x) { ret float %val } -define float @fold_minnum_f32_val_undef(float %x) { -; CHECK-LABEL: @fold_minnum_f32_val_undef( -; CHECK-NEXT: ret float [[X:%.*]] -; - %val = call float @llvm.minnum.f32(float %x, float undef) - ret float %val -} - -define float @fold_minnum_f32_undef_val(float %x) { -; CHECK-LABEL: @fold_minnum_f32_undef_val( -; CHECK-NEXT: ret float [[X:%.*]] -; - %val = call float @llvm.minnum.f32(float undef, float %x) - ret float %val -} - define float @minnum_x_minnum_x_y(float %x, float %y) { ; CHECK-LABEL: @minnum_x_minnum_x_y( ; CHECK-NEXT: [[A:%.*]] = call float @llvm.minnum.f32(float [[X:%.*]], float [[Y:%.*]]) diff --git a/test/Transforms/InstSimplify/floating-point-arithmetic.ll b/test/Transforms/InstSimplify/floating-point-arithmetic.ll index ca9226dd076..1acff6f5f98 100644 --- a/test/Transforms/InstSimplify/floating-point-arithmetic.ll +++ b/test/Transforms/InstSimplify/floating-point-arithmetic.ll @@ -537,6 +537,38 @@ define <2 x double> @minnum_nan_op1_vec(<2 x double> %x) { ret <2 x double> %r } +define float @maxnum_undef_op1(float %x) { +; CHECK-LABEL: @maxnum_undef_op1( +; CHECK-NEXT: ret float [[X:%.*]] +; + %val = call float @llvm.maxnum.f32(float %x, float undef) + ret float %val +} + +define float @maxnum_undef_op0(float %x) { +; CHECK-LABEL: @maxnum_undef_op0( +; CHECK-NEXT: ret float [[X:%.*]] +; + %val = call float @llvm.maxnum.f32(float undef, float %x) + ret float %val +} + +define float @minnum_undef_op1(float %x) { +; CHECK-LABEL: @minnum_undef_op1( +; CHECK-NEXT: ret float [[X:%.*]] +; + %val = call float @llvm.minnum.f32(float %x, float undef) + ret float %val +} + +define float @minnum_undef_op0(float %x) { +; CHECK-LABEL: @minnum_undef_op0( +; CHECK-NEXT: ret float [[X:%.*]] +; + %val = call float @llvm.minnum.f32(float undef, float %x) + ret float %val +} + define float @minnum_same_args(float %x) { ; CHECK-LABEL: @minnum_same_args( ; CHECK-NEXT: ret float [[X:%.*]]