Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -9022,7 +9022,8 @@ return DAG.getNode(ISD::FABS, SDLoc(N), VT, N0); // copysign(x, copysign(y,z)) -> copysign(x, z) - if (N1.getOpcode() == ISD::FCOPYSIGN) + if (DAG.getTarget().Options.UnsafeFPMath && + N1.getOpcode() == ISD::FCOPYSIGN) return DAG.getNode(ISD::FCOPYSIGN, SDLoc(N), VT, N0, N1.getOperand(1)); Index: test/CodeGen/X86/sse-fcopysign.ll =================================================================== --- test/CodeGen/X86/sse-fcopysign.ll +++ test/CodeGen/X86/sse-fcopysign.ll @@ -152,3 +152,19 @@ declare float @llvm.copysign.f32(float %Mag, float %Sgn) declare double @llvm.copysign.f64(double %Mag, double %Sgn) + +; +; Unsafe transformations +; + +define double @safe(float %a, double %b) "unsafe-fp-math"="false" { +; CHECK-LABEL: safe: +; CHECK: andps +; CHECK-NEXT: orps +; CHECK: cvtss2sd + + %r1 = call float @llvm.copysign.f32(float 1.000000e+00, float %a) + %r2 = fpext float %r1 to double + %r3 = call double @llvm.copysign.f64(double %b, double %r2) + ret double %r3 +}