mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Prevent library calls from being folded if -fno-builtin has been specified.
rdar://10500969 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145639 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
85bef06a2e
commit
aebc3aae3f
@ -1180,6 +1180,7 @@ llvm::ConstantFoldCall(Function *F, ArrayRef<Constant *> Operands,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
if (!F->hasName()) return 0;
|
||||
StringRef Name = F->getName();
|
||||
assert (TLI && "Expected TLI!");
|
||||
|
||||
Type *Ty = F->getReturnType();
|
||||
if (Operands.size() == 1) {
|
||||
@ -1210,43 +1211,43 @@ llvm::ConstantFoldCall(Function *F, ArrayRef<Constant *> Operands,
|
||||
Op->getValueAPF().convertToDouble();
|
||||
switch (Name[0]) {
|
||||
case 'a':
|
||||
if (Name == "acos")
|
||||
if (Name == "acos" && TLI->has(LibFunc::acos))
|
||||
return ConstantFoldFP(acos, V, Ty);
|
||||
else if (Name == "asin")
|
||||
else if (Name == "asin" && TLI->has(LibFunc::asin))
|
||||
return ConstantFoldFP(asin, V, Ty);
|
||||
else if (Name == "atan")
|
||||
else if (Name == "atan" && TLI->has(LibFunc::atan))
|
||||
return ConstantFoldFP(atan, V, Ty);
|
||||
break;
|
||||
case 'c':
|
||||
if (Name == "ceil")
|
||||
if (Name == "ceil" && TLI->has(LibFunc::ceil))
|
||||
return ConstantFoldFP(ceil, V, Ty);
|
||||
else if (Name == "cos")
|
||||
else if (Name == "cos" && TLI->has(LibFunc::cos))
|
||||
return ConstantFoldFP(cos, V, Ty);
|
||||
else if (Name == "cosh")
|
||||
else if (Name == "cosh" && TLI->has(LibFunc::cosh))
|
||||
return ConstantFoldFP(cosh, V, Ty);
|
||||
else if (Name == "cosf")
|
||||
else if (Name == "cosf" && TLI->has(LibFunc::cosf))
|
||||
return ConstantFoldFP(cos, V, Ty);
|
||||
break;
|
||||
case 'e':
|
||||
if (Name == "exp")
|
||||
if (Name == "exp" && TLI->has(LibFunc::exp))
|
||||
return ConstantFoldFP(exp, V, Ty);
|
||||
|
||||
if (Name == "exp2") {
|
||||
if (Name == "exp2" && TLI->has(LibFunc::exp2)) {
|
||||
// Constant fold exp2(x) as pow(2,x) in case the host doesn't have a
|
||||
// C99 library.
|
||||
return ConstantFoldBinaryFP(pow, 2.0, V, Ty);
|
||||
}
|
||||
break;
|
||||
case 'f':
|
||||
if (Name == "fabs")
|
||||
if (Name == "fabs" && TLI->has(LibFunc::fabs))
|
||||
return ConstantFoldFP(fabs, V, Ty);
|
||||
else if (Name == "floor")
|
||||
else if (Name == "floor" && TLI->has(LibFunc::floor))
|
||||
return ConstantFoldFP(floor, V, Ty);
|
||||
break;
|
||||
case 'l':
|
||||
if (Name == "log" && V > 0)
|
||||
if (Name == "log" && V > 0 && TLI->has(LibFunc::log))
|
||||
return ConstantFoldFP(log, V, Ty);
|
||||
else if (Name == "log10" && V > 0)
|
||||
else if (Name == "log10" && V > 0 && TLI->has(LibFunc::log10))
|
||||
return ConstantFoldFP(log10, V, Ty);
|
||||
else if (F->getIntrinsicID() == Intrinsic::sqrt &&
|
||||
(Ty->isFloatTy() || Ty->isDoubleTy())) {
|
||||
@ -1257,21 +1258,21 @@ llvm::ConstantFoldCall(Function *F, ArrayRef<Constant *> Operands,
|
||||
}
|
||||
break;
|
||||
case 's':
|
||||
if (Name == "sin")
|
||||
if (Name == "sin" && TLI->has(LibFunc::sin))
|
||||
return ConstantFoldFP(sin, V, Ty);
|
||||
else if (Name == "sinh")
|
||||
else if (Name == "sinh" && TLI->has(LibFunc::sinh))
|
||||
return ConstantFoldFP(sinh, V, Ty);
|
||||
else if (Name == "sqrt" && V >= 0)
|
||||
else if (Name == "sqrt" && V >= 0 && TLI->has(LibFunc::sqrt))
|
||||
return ConstantFoldFP(sqrt, V, Ty);
|
||||
else if (Name == "sqrtf" && V >= 0)
|
||||
else if (Name == "sqrtf" && V >= 0 && TLI->has(LibFunc::sqrtf))
|
||||
return ConstantFoldFP(sqrt, V, Ty);
|
||||
else if (Name == "sinf")
|
||||
else if (Name == "sinf" && TLI->has(LibFunc::sinf))
|
||||
return ConstantFoldFP(sin, V, Ty);
|
||||
break;
|
||||
case 't':
|
||||
if (Name == "tan")
|
||||
if (Name == "tan" && TLI->has(LibFunc::tan))
|
||||
return ConstantFoldFP(tan, V, Ty);
|
||||
else if (Name == "tanh")
|
||||
else if (Name == "tanh" && TLI->has(LibFunc::tanh))
|
||||
return ConstantFoldFP(tanh, V, Ty);
|
||||
break;
|
||||
default:
|
||||
@ -1351,11 +1352,11 @@ llvm::ConstantFoldCall(Function *F, ArrayRef<Constant *> Operands,
|
||||
(double)Op2->getValueAPF().convertToFloat():
|
||||
Op2->getValueAPF().convertToDouble();
|
||||
|
||||
if (Name == "pow")
|
||||
if (Name == "pow" && TLI->has(LibFunc::pow))
|
||||
return ConstantFoldBinaryFP(pow, Op1V, Op2V, Ty);
|
||||
if (Name == "fmod")
|
||||
if (Name == "fmod" && TLI->has(LibFunc::fmod))
|
||||
return ConstantFoldBinaryFP(fmod, Op1V, Op2V, Ty);
|
||||
if (Name == "atan2")
|
||||
if (Name == "atan2" && TLI->has(LibFunc::atan2))
|
||||
return ConstantFoldBinaryFP(atan2, Op1V, Op2V, Ty);
|
||||
} else if (ConstantInt *Op2C = dyn_cast<ConstantInt>(Operands[1])) {
|
||||
if (F->getIntrinsicID() == Intrinsic::powi && Ty->isFloatTy())
|
||||
|
@ -1,4 +1,5 @@
|
||||
; RUN: opt < %s -constprop -S | FileCheck %s
|
||||
; RUN: opt < %s -constprop -disable-simplify-libcalls -S | FileCheck %s --check-prefix=FNOBUILTIN
|
||||
|
||||
declare double @cos(double)
|
||||
|
||||
@ -59,3 +60,81 @@ declare i32 @llvm.x86.sse2.cvtsd2si(<2 x double>) nounwind readnone
|
||||
declare i32 @llvm.x86.sse2.cvttsd2si(<2 x double>) nounwind readnone
|
||||
declare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone
|
||||
declare i64 @llvm.x86.sse2.cvttsd2si64(<2 x double>) nounwind readnone
|
||||
|
||||
; Shouldn't fold because of -fno-builtin
|
||||
define double @sin_() nounwind uwtable ssp {
|
||||
; FNOBUILTIN: @sin_
|
||||
; FNOBUILTIN: %1 = call double @sin(double 3.000000e+00)
|
||||
%1 = call double @sin(double 3.000000e+00)
|
||||
ret double %1
|
||||
}
|
||||
|
||||
; Shouldn't fold because of -fno-builtin
|
||||
define double @sqrt_() nounwind uwtable ssp {
|
||||
; FNOBUILTIN: @sqrt_
|
||||
; FNOBUILTIN: %1 = call double @sqrt(double 3.000000e+00)
|
||||
%1 = call double @sqrt(double 3.000000e+00)
|
||||
ret double %1
|
||||
}
|
||||
|
||||
; Shouldn't fold because of -fno-builtin
|
||||
define float @sqrtf_() nounwind uwtable ssp {
|
||||
; FNOBUILTIN: @sqrtf_
|
||||
; FNOBUILTIN: %1 = call float @sqrtf(float 3.000000e+00)
|
||||
%1 = call float @sqrtf(float 3.000000e+00)
|
||||
ret float %1
|
||||
}
|
||||
declare float @sqrtf(float)
|
||||
|
||||
; Shouldn't fold because of -fno-builtin
|
||||
define float @sinf_() nounwind uwtable ssp {
|
||||
; FNOBUILTIN: @sinf_
|
||||
; FNOBUILTIN: %1 = call float @sinf(float 3.000000e+00)
|
||||
%1 = call float @sinf(float 3.000000e+00)
|
||||
ret float %1
|
||||
}
|
||||
declare float @sinf(float)
|
||||
|
||||
; Shouldn't fold because of -fno-builtin
|
||||
define double @tan_() nounwind uwtable ssp {
|
||||
; FNOBUILTIN: @tan_
|
||||
; FNOBUILTIN: %1 = call double @tan(double 3.000000e+00)
|
||||
%1 = call double @tan(double 3.000000e+00)
|
||||
ret double %1
|
||||
}
|
||||
|
||||
; Shouldn't fold because of -fno-builtin
|
||||
define double @tanh_() nounwind uwtable ssp {
|
||||
; FNOBUILTIN: @tanh_
|
||||
; FNOBUILTIN: %1 = call double @tanh(double 3.000000e+00)
|
||||
%1 = call double @tanh(double 3.000000e+00)
|
||||
ret double %1
|
||||
}
|
||||
declare double @tanh(double)
|
||||
|
||||
; Shouldn't fold because of -fno-builtin
|
||||
define double @pow_() nounwind uwtable ssp {
|
||||
; FNOBUILTIN: @pow_
|
||||
; FNOBUILTIN: %1 = call double @pow(double 3.000000e+00, double 3.000000e+00)
|
||||
%1 = call double @pow(double 3.000000e+00, double 3.000000e+00)
|
||||
ret double %1
|
||||
}
|
||||
declare double @pow(double, double)
|
||||
|
||||
; Shouldn't fold because of -fno-builtin
|
||||
define double @fmod_() nounwind uwtable ssp {
|
||||
; FNOBUILTIN: @fmod_
|
||||
; FNOBUILTIN: %1 = call double @fmod(double 3.000000e+00, double 3.000000e+00)
|
||||
%1 = call double @fmod(double 3.000000e+00, double 3.000000e+00)
|
||||
ret double %1
|
||||
}
|
||||
declare double @fmod(double, double)
|
||||
|
||||
; Shouldn't fold because of -fno-builtin
|
||||
define double @atan2_() nounwind uwtable ssp {
|
||||
; FNOBUILTIN: @atan2_
|
||||
; FNOBUILTIN: %1 = call double @atan2(double 3.000000e+00, double 3.000000e+00)
|
||||
%1 = call double @atan2(double 3.000000e+00, double 3.000000e+00)
|
||||
ret double %1
|
||||
}
|
||||
declare double @atan2(double, double)
|
||||
|
Loading…
Reference in New Issue
Block a user