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

Reply via email to