From 6bf30ab347bc00a8dc7115244298d78f7721ea34 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 1 May 2008 07:26:11 +0000 Subject: [PATCH] don't randomly miscompile seto/setuo just because we are in ffastmath mode. This fixes rdar://5902801, a miscompilation of gcc.dg/builtins-8.c. Bill, please pull this into Tak. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50523 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 8 ++++---- test/CodeGen/X86/2008-05-01-InvalidOrdCompare.ll | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 test/CodeGen/X86/2008-05-01-InvalidOrdCompare.ll diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index c5911e5d660..00390768c2e 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -1272,8 +1272,8 @@ void SelectionDAGLowering::FindMergedConditions(Value *Cond, case FCmpInst::FCMP_OLT: FOC = ISD::SETLT; FPC = ISD::SETOLT; break; case FCmpInst::FCMP_OLE: FOC = ISD::SETLE; FPC = ISD::SETOLE; break; case FCmpInst::FCMP_ONE: FOC = ISD::SETNE; FPC = ISD::SETONE; break; - case FCmpInst::FCMP_ORD: FOC = ISD::SETEQ; FPC = ISD::SETO; break; - case FCmpInst::FCMP_UNO: FOC = ISD::SETNE; FPC = ISD::SETUO; break; + case FCmpInst::FCMP_ORD: FOC = FPC = ISD::SETO; break; + case FCmpInst::FCMP_UNO: FOC = FPC = ISD::SETUO; break; case FCmpInst::FCMP_UEQ: FOC = ISD::SETEQ; FPC = ISD::SETUEQ; break; case FCmpInst::FCMP_UGT: FOC = ISD::SETGT; FPC = ISD::SETUGT; break; case FCmpInst::FCMP_UGE: FOC = ISD::SETGE; FPC = ISD::SETUGE; break; @@ -2317,8 +2317,8 @@ void SelectionDAGLowering::visitFCmp(User &I) { case FCmpInst::FCMP_OLT: FOC = ISD::SETLT; FPC = ISD::SETOLT; break; case FCmpInst::FCMP_OLE: FOC = ISD::SETLE; FPC = ISD::SETOLE; break; case FCmpInst::FCMP_ONE: FOC = ISD::SETNE; FPC = ISD::SETONE; break; - case FCmpInst::FCMP_ORD: FOC = ISD::SETEQ; FPC = ISD::SETO; break; - case FCmpInst::FCMP_UNO: FOC = ISD::SETNE; FPC = ISD::SETUO; break; + case FCmpInst::FCMP_ORD: FOC = ISD::SETO; break; + case FCmpInst::FCMP_UNO: FOC = ISD::SETUO; break; case FCmpInst::FCMP_UEQ: FOC = ISD::SETEQ; FPC = ISD::SETUEQ; break; case FCmpInst::FCMP_UGT: FOC = ISD::SETGT; FPC = ISD::SETUGT; break; case FCmpInst::FCMP_UGE: FOC = ISD::SETGE; FPC = ISD::SETUGE; break; diff --git a/test/CodeGen/X86/2008-05-01-InvalidOrdCompare.ll b/test/CodeGen/X86/2008-05-01-InvalidOrdCompare.ll new file mode 100644 index 00000000000..dae3b83b1af --- /dev/null +++ b/test/CodeGen/X86/2008-05-01-InvalidOrdCompare.ll @@ -0,0 +1,15 @@ +; RUN: llvm-as < %s | llc -enable-unsafe-fp-math | grep jnp +; rdar://5902801 + +declare void @test2() + +define i32 @test(double %p) nounwind { + %tmp5 = fcmp uno double %p, 0.000000e+00 + br i1 %tmp5, label %bb, label %UnifiedReturnBlock +bb: + call void @test2() + ret i32 17 +UnifiedReturnBlock: + ret i32 42 +} +