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 llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits