Hi,
Here is the patch to make llvm-gcc/llvm-g++ emit llvm.pow.* when errno
disabled.
Thanks for revewing.
Sheng.
Index: gcc/llvm-convert.cpp
===================================================================
--- gcc/llvm-convert.cpp (revision 44263)
+++ gcc/llvm-convert.cpp (working copy)
@@ -4453,6 +4453,25 @@
return true;
}
break;
+ case BUILT_IN_SIN:
+ case BUILT_IN_SINF:
+ case BUILT_IN_SINL:
+ Result = EmitBuiltinSIN(exp);
+ return true;
+ case BUILT_IN_COS:
+ case BUILT_IN_COSF:
+ case BUILT_IN_COSL:
+ Result = EmitBuiltinCOS(exp);
+ return true;
+ case BUILT_IN_POW:
+ case BUILT_IN_POWF:
+ case BUILT_IN_POWL:
+ // If errno math has been disabled, expand these to llvm.pow calls.
+ if (!flag_errno_math) {
+ Result = EmitBuiltinPOW(exp);
+ Result = CastToFPType(Result, ConvertType(TREE_TYPE(exp)));
+ return true;
+ }
case BUILT_IN_POWI:
case BUILT_IN_POWIF:
case BUILT_IN_POWIL:
@@ -4565,7 +4584,6 @@
Value *TreeToLLVM::EmitBuiltinSQRT(tree exp) {
Value *Amt = Emit(TREE_VALUE(TREE_OPERAND(exp, 1)), 0);
- Intrinsic::ID Id = Intrinsic::not_intrinsic;
const Type* Ty = Amt->getType();
return Builder.CreateCall(Intrinsic::getDeclaration(TheModule,
@@ -4573,6 +4591,41 @@
Amt, "tmp");
}
+Value *TreeToLLVM::EmitBuiltinSIN(tree exp) {
+ Value *Amt = Emit(TREE_VALUE(TREE_OPERAND(exp, 1)), 0);
+ const Type* Ty = Amt->getType();
+
+ return Builder.CreateCall(Intrinsic::getDeclaration(TheModule,
+ Intrinsic::sin, &Ty, 1),
+ Amt, "tmp");
+}
+
+Value *TreeToLLVM::EmitBuiltinCOS(tree exp) {
+ Value *Amt = Emit(TREE_VALUE(TREE_OPERAND(exp, 1)), 0);
+ const Type* Ty = Amt->getType();
+
+ return Builder.CreateCall(Intrinsic::getDeclaration(TheModule,
+ Intrinsic::cos, &Ty, 1),
+ Amt, "tmp");
+}
+
+Value *TreeToLLVM::EmitBuiltinPOW(tree exp) {
+ tree ArgList = TREE_OPERAND (exp, 1);
+ if (!validate_arglist(ArgList, REAL_TYPE, REAL_TYPE, VOID_TYPE))
+ return 0;
+
+ Value *Val = Emit(TREE_VALUE(ArgList), 0);
+ Value *Pow = Emit(TREE_VALUE(TREE_CHAIN(ArgList)), 0);
+ const Type *Ty = Val->getType();
+
+ SmallVector<Value *,2> Args;
+ Args.push_back(Val);
+ Args.push_back(Pow);
+ return Builder.CreateCall(Intrinsic::getDeclaration(TheModule,
+ Intrinsic::pow, &Ty, 1),
+ Args.begin(), Args.end(), "tmp");
+}
+
Value *TreeToLLVM::EmitBuiltinPOWI(tree exp) {
tree ArgList = TREE_OPERAND (exp, 1);
if (!validate_arglist(ArgList, REAL_TYPE, INTEGER_TYPE, VOID_TYPE))
Index: gcc/llvm-internal.h
===================================================================
--- gcc/llvm-internal.h (revision 44263)
+++ gcc/llvm-internal.h (working copy)
@@ -577,7 +577,10 @@
Value *EmitBuiltinUnaryFPOp(Value *InVal, const char *F32Name,
const char *F64Name, const char *LongDoubleName);
Value *EmitBuiltinSQRT(tree_node *exp);
+ Value *EmitBuiltinSIN(tree_node *exp);
+ Value *EmitBuiltinCOS(tree_node *exp);
Value *EmitBuiltinPOWI(tree_node *exp);
+ Value *EmitBuiltinPOW(tree_node *exp);
bool EmitBuiltinConstantP(tree_node *exp, Value *&Result);
bool EmitBuiltinAlloca(tree_node *exp, Value *&Result);
_______________________________________________
llvm-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits