diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -2298,8 +2298,11 @@ llvm_unreachable("unexpected intrinsic ID"); } Instruction *NewCall = Builder.CreateBinaryIntrinsic( - IID, X, ConstantFP::get(Arg0->getType(), Res)); - NewCall->copyIRFlags(II); + IID, X, ConstantFP::get(Arg0->getType(), Res), II); + // TODO: Conservatively intersecting FMF. If Res == C2, the transform + // was a simplification (so Arg0 and its original flags could + // propagate?) + NewCall->andIRFlags(M); return replaceInstUsesWith(*II, NewCall); } } diff --git a/llvm/test/Transforms/InstCombine/maximum.ll b/llvm/test/Transforms/InstCombine/maximum.ll --- a/llvm/test/Transforms/InstCombine/maximum.ll +++ b/llvm/test/Transforms/InstCombine/maximum.ll @@ -157,7 +157,7 @@ define float @maximum_f32_1_maximum_p0_val_fast(float %x) { ; CHECK-LABEL: @maximum_f32_1_maximum_p0_val_fast( -; CHECK-NEXT: [[TMP1:%.*]] = call fast float @llvm.maximum.f32(float [[X:%.*]], float 1.000000e+00) +; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.maximum.f32(float [[X:%.*]], float 1.000000e+00) ; CHECK-NEXT: ret float [[TMP1]] ; %y = call float @llvm.maximum.f32(float 0.0, float %x) @@ -167,7 +167,7 @@ define float @maximum_f32_1_maximum_p0_val_fmf1(float %x) { ; CHECK-LABEL: @maximum_f32_1_maximum_p0_val_fmf1( -; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf arcp float @llvm.maximum.f32(float [[X:%.*]], float 1.000000e+00) +; CHECK-NEXT: [[TMP1:%.*]] = call nnan arcp float @llvm.maximum.f32(float [[X:%.*]], float 1.000000e+00) ; CHECK-NEXT: ret float [[TMP1]] ; %y = call arcp nnan float @llvm.maximum.f32(float 0.0, float %x) @@ -187,7 +187,7 @@ define float @maximum_f32_1_maximum_p0_val_fmf3(float %x) { ; CHECK-LABEL: @maximum_f32_1_maximum_p0_val_fmf3( -; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf arcp float @llvm.maximum.f32(float [[X:%.*]], float 1.000000e+00) +; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf float @llvm.maximum.f32(float [[X:%.*]], float 1.000000e+00) ; CHECK-NEXT: ret float [[TMP1]] ; %y = call nnan ninf float @llvm.maximum.f32(float 0.0, float %x) diff --git a/llvm/test/Transforms/InstCombine/maxnum.ll b/llvm/test/Transforms/InstCombine/maxnum.ll --- a/llvm/test/Transforms/InstCombine/maxnum.ll +++ b/llvm/test/Transforms/InstCombine/maxnum.ll @@ -157,7 +157,7 @@ define float @maxnum_f32_1_maxnum_p0_val_fast(float %x) { ; CHECK-LABEL: @maxnum_f32_1_maxnum_p0_val_fast( -; CHECK-NEXT: [[TMP1:%.*]] = call fast float @llvm.maxnum.f32(float [[X:%.*]], float 1.000000e+00) +; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.maxnum.f32(float [[X:%.*]], float 1.000000e+00) ; CHECK-NEXT: ret float [[TMP1]] ; %y = call float @llvm.maxnum.f32(float 0.0, float %x) @@ -167,7 +167,7 @@ define float @minnum_f32_1_maxnum_p0_val_fmf1(float %x) { ; CHECK-LABEL: @minnum_f32_1_maxnum_p0_val_fmf1( -; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf float @llvm.maxnum.f32(float [[X:%.*]], float 1.000000e+00) +; CHECK-NEXT: [[TMP1:%.*]] = call nnan float @llvm.maxnum.f32(float [[X:%.*]], float 1.000000e+00) ; CHECK-NEXT: ret float [[TMP1]] ; %y = call nnan float @llvm.maxnum.f32(float 0.0, float %x) diff --git a/llvm/test/Transforms/InstCombine/minimum.ll b/llvm/test/Transforms/InstCombine/minimum.ll --- a/llvm/test/Transforms/InstCombine/minimum.ll +++ b/llvm/test/Transforms/InstCombine/minimum.ll @@ -159,7 +159,7 @@ define float @minimum_f32_1_minimum_p0_val_fast(float %x) { ; CHECK-LABEL: @minimum_f32_1_minimum_p0_val_fast( -; CHECK-NEXT: [[TMP1:%.*]] = call fast float @llvm.minimum.f32(float [[X:%.*]], float 0.000000e+00) +; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.minimum.f32(float [[X:%.*]], float 0.000000e+00) ; CHECK-NEXT: ret float [[TMP1]] ; %y = call float @llvm.minimum.f32(float 0.0, float %x) @@ -169,7 +169,7 @@ define float @minimum_f32_1_minimum_p0_val_fmf1(float %x) { ; CHECK-LABEL: @minimum_f32_1_minimum_p0_val_fmf1( -; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf float @llvm.minimum.f32(float [[X:%.*]], float 0.000000e+00) +; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.minimum.f32(float [[X:%.*]], float 0.000000e+00) ; CHECK-NEXT: ret float [[TMP1]] ; %y = call float @llvm.minimum.f32(float 0.0, float %x) diff --git a/llvm/test/Transforms/InstCombine/minnum.ll b/llvm/test/Transforms/InstCombine/minnum.ll --- a/llvm/test/Transforms/InstCombine/minnum.ll +++ b/llvm/test/Transforms/InstCombine/minnum.ll @@ -159,7 +159,7 @@ define float @minnum_f32_1_minnum_p0_val_fast(float %x) { ; CHECK-LABEL: @minnum_f32_1_minnum_p0_val_fast( -; CHECK-NEXT: [[TMP1:%.*]] = call fast float @llvm.minnum.f32(float [[X:%.*]], float 0.000000e+00) +; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.minnum.f32(float [[X:%.*]], float 0.000000e+00) ; CHECK-NEXT: ret float [[TMP1]] ; %y = call float @llvm.minnum.f32(float 0.0, float %x) @@ -169,7 +169,7 @@ define float @minnum_f32_1_minnum_p0_val_fmf1(float %x) { ; CHECK-LABEL: @minnum_f32_1_minnum_p0_val_fmf1( -; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf float @llvm.minnum.f32(float [[X:%.*]], float 0.000000e+00) +; CHECK-NEXT: [[TMP1:%.*]] = call nnan float @llvm.minnum.f32(float [[X:%.*]], float 0.000000e+00) ; CHECK-NEXT: ret float [[TMP1]] ; %y = call nsz nnan float @llvm.minnum.f32(float 0.0, float %x) @@ -179,7 +179,7 @@ define float @minnum_f32_1_minnum_p0_val_fmf2(float %x) { ; CHECK-LABEL: @minnum_f32_1_minnum_p0_val_fmf2( -; CHECK-NEXT: [[TMP1:%.*]] = call ninf nsz float @llvm.minnum.f32(float [[X:%.*]], float 0.000000e+00) +; CHECK-NEXT: [[TMP1:%.*]] = call ninf float @llvm.minnum.f32(float [[X:%.*]], float 0.000000e+00) ; CHECK-NEXT: ret float [[TMP1]] ; %y = call nnan ninf float @llvm.minnum.f32(float 0.0, float %x)