Fix PR 7087, and probably other things, by extending

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.

llvm-svn: 103299
This commit is contained in:
Dale Johannesen 2010-05-07 21:35:53 +00:00
parent 0638b539bb
commit 1ee37ac5d4
3 changed files with 40 additions and 1 deletions

View 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);

View 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,

View File

@ -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()