Fix PR 7087, and probably other things, by extending
authorDale Johannesen <dalej@apple.com>
Fri, 7 May 2010 21:35:53 +0000 (21:35 +0000)
committerDale Johannesen <dalej@apple.com>
Fri, 7 May 2010 21:35:53 +0000 (21:35 +0000)
getConstantFP to accept the two supported long double
target types.  This was not the original intent, but
there are other places that assume this works and it's
easy enough to do.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103299 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/SelectionDAG.h
lib/CodeGen/SelectionDAG/SelectionDAG.cpp
test/CodeGen/X86/2010-05-07-ldconvert.ll [new file with mode: 0644]

index ae15230c96128d3d7ca6eb5a060ee4e1e9b51416..b1af0abbad1d8872e7921c8d2fbe92ee68b7f8de 100644 (file)
@@ -334,6 +334,8 @@ public:
   SDValue getTargetConstant(const ConstantInt &Val, EVT VT) {
     return getConstant(Val, VT, true);
   }
+  // The forms below that take a double should only be used for simple
+  // constants that can be exactly represented in VT.  No checks are made.
   SDValue getConstantFP(double Val, EVT VT, bool isTarget = false);
   SDValue getConstantFP(const APFloat& Val, EVT VT, bool isTarget = false);
   SDValue getConstantFP(const ConstantFP &CF, EVT VT, bool isTarget = false);
index 4854ff25f2dca6f19e79ffd5d5995a54f1ef4e66..e9de6d56f9ac356476bc21907d1634d6c613bf77 100644 (file)
@@ -964,8 +964,18 @@ SDValue SelectionDAG::getConstantFP(double Val, EVT VT, bool isTarget) {
   EVT EltVT = VT.getScalarType();
   if (EltVT==MVT::f32)
     return getConstantFP(APFloat((float)Val), VT, isTarget);
-  else
+  else if (EltVT==MVT::f64)
     return getConstantFP(APFloat(Val), VT, isTarget);
+  else if (EltVT==MVT::f80 || EltVT==MVT::f128) {
+    bool ignored;
+    APFloat apf = APFloat(Val);
+    apf.convert(*EVTToAPFloatSemantics(EltVT), APFloat::rmNearestTiesToEven,
+                &ignored);
+    return getConstantFP(apf, VT, isTarget);
+  } else {
+    assert(0 && "Unsupported type in getConstantFP");
+    return SDValue();
+  }
 }
 
 SDValue SelectionDAG::getGlobalAddress(const GlobalValue *GV,
diff --git a/test/CodeGen/X86/2010-05-07-ldconvert.ll b/test/CodeGen/X86/2010-05-07-ldconvert.ll
new file mode 100644 (file)
index 0000000..0ba6a8f
--- /dev/null
@@ -0,0 +1,27 @@
+; RUN: llc < %s -mtriple=x86_64-apple-darwin11
+; PR 7087 - used to crash
+
+define i32 @main() ssp {
+entry:
+  %retval = alloca i32, align 4                   ; <i32*> [#uses=2]
+  %r = alloca i32, align 4                        ; <i32*> [#uses=2]
+  store i32 0, i32* %retval
+  %tmp = call x86_fp80 @llvm.powi.f80(x86_fp80 0xK3FFF8000000000000000, i32 -64) ; <x86_fp80> [#uses=1]
+  %conv = fptosi x86_fp80 %tmp to i32             ; <i32> [#uses=1]
+  store i32 %conv, i32* %r
+  %tmp1 = load i32* %r                            ; <i32> [#uses=1]
+  %tobool = icmp ne i32 %tmp1, 0                  ; <i1> [#uses=1]
+  br i1 %tobool, label %if.then, label %if.end
+
+if.then:                                          ; preds = %entry
+  call void @_Z1fv()
+  br label %if.end
+
+if.end:                                           ; preds = %if.then, %entry
+  %0 = load i32* %retval                          ; <i32> [#uses=1]
+  ret i32 %0
+}
+
+declare x86_fp80 @llvm.powi.f80(x86_fp80, i32) nounwind readonly
+
+declare void @_Z1fv()