[llvm-commits] [llvm] r42537 - in /llvm/trunk: include/llvm/Intrinsics.td lib/Analysis/ConstantFolding.cpp lib/CodeGen/IntrinsicLowering.cpp lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/Target/CBackend/CBackend.cpp

Dale Johannesen dalej at apple.com
Tue Oct 2 10:44:00 PDT 2007


Author: johannes
Date: Tue Oct  2 12:43:59 2007
New Revision: 42537

URL: http://llvm.org/viewvc/llvm-project?rev=42537&view=rev
Log:
Rewrite sqrt and powi to use anyfloat.  By popular demand.

Modified:
    llvm/trunk/include/llvm/Intrinsics.td
    llvm/trunk/lib/Analysis/ConstantFolding.cpp
    llvm/trunk/lib/CodeGen/IntrinsicLowering.cpp
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
    llvm/trunk/lib/Target/CBackend/CBackend.cpp

Modified: llvm/trunk/include/llvm/Intrinsics.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Intrinsics.td?rev=42537&r1=42536&r2=42537&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Intrinsics.td (original)
+++ llvm/trunk/include/llvm/Intrinsics.td Tue Oct  2 12:43:59 2007
@@ -178,18 +178,8 @@
 }
 
 let Properties = [IntrNoMem] in {
-  def int_sqrt_f32 : Intrinsic<[llvm_float_ty, llvm_float_ty]>;
-  def int_sqrt_f64 : Intrinsic<[llvm_double_ty, llvm_double_ty]>;
-  def int_sqrt_f80 : Intrinsic<[llvm_f80_ty, llvm_f80_ty]>;
-  def int_sqrt_f128 : Intrinsic<[llvm_f128_ty, llvm_f128_ty]>;
-  def int_sqrt_ppcf128 : Intrinsic<[llvm_ppcf128_ty, llvm_ppcf128_ty]>;
-
-  def int_powi_f32 : Intrinsic<[llvm_float_ty, llvm_float_ty, llvm_i32_ty]>;
-  def int_powi_f64 : Intrinsic<[llvm_double_ty, llvm_double_ty, llvm_i32_ty]>;
-  def int_powi_f80 : Intrinsic<[llvm_f80_ty, llvm_f80_ty, llvm_i32_ty]>;
-  def int_powi_f128 : Intrinsic<[llvm_f128_ty, llvm_f128_ty, llvm_i32_ty]>;
-  def int_powi_ppcf128 : Intrinsic<[llvm_ppcf128_ty, llvm_ppcf128_ty, 
-                                    llvm_i32_ty]>;
+  def int_sqrt : Intrinsic<[llvm_anyfloat_ty, LLVMMatchType<0>]>;
+  def int_powi : Intrinsic<[llvm_anyfloat_ty, LLVMMatchType<0>, llvm_i32_ty]>;
 }
 
 // NOTE: these are internal interfaces.

Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ConstantFolding.cpp?rev=42537&r1=42536&r2=42537&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original)
+++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Tue Oct  2 12:43:59 2007
@@ -329,16 +329,8 @@
 bool
 llvm::canConstantFoldCallTo(Function *F) {
   switch (F->getIntrinsicID()) {
-  case Intrinsic::sqrt_f32:
-  case Intrinsic::sqrt_f64:
-  case Intrinsic::sqrt_f80:
-  case Intrinsic::sqrt_f128:
-  case Intrinsic::sqrt_ppcf128:
-  case Intrinsic::powi_f32:
-  case Intrinsic::powi_f64:
-  case Intrinsic::powi_f80:
-  case Intrinsic::powi_f128:
-  case Intrinsic::powi_ppcf128:
+  case Intrinsic::sqrt:
+  case Intrinsic::powi:
   case Intrinsic::bswap:
   case Intrinsic::ctpop:
   case Intrinsic::ctlz:
@@ -539,12 +531,12 @@
     }
   } else if (NumOperands == 2) {
     if (ConstantFP *Op1 = dyn_cast<ConstantFP>(Operands[0])) {
+      if (Ty!=Type::FloatTy && Ty!=Type::DoubleTy)
+        return 0;
       double Op1V = Ty==Type::FloatTy ? 
                       (double)Op1->getValueAPF().convertToFloat():
                       Op1->getValueAPF().convertToDouble();
       if (ConstantFP *Op2 = dyn_cast<ConstantFP>(Operands[1])) {
-        if (Ty!=Type::FloatTy && Ty!=Type::DoubleTy)
-          return 0;
         double Op2V = Ty==Type::FloatTy ? 
                       (double)Op2->getValueAPF().convertToFloat():
                       Op2->getValueAPF().convertToDouble();

Modified: llvm/trunk/lib/CodeGen/IntrinsicLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/IntrinsicLowering.cpp?rev=42537&r1=42536&r2=42537&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/IntrinsicLowering.cpp (original)
+++ llvm/trunk/lib/CodeGen/IntrinsicLowering.cpp Tue Oct  2 12:43:59 2007
@@ -99,14 +99,20 @@
                               PointerType::get(Type::Int8Ty), Type::Int32Ty, 
                               TD.getIntPtrType(), (Type *)0);
         break;
-      case Intrinsic::sqrt_f32:
-      case Intrinsic::sqrt_f64:
-        if(I->arg_begin()->getType() == Type::FloatTy)
+      case Intrinsic::sqrt:
+        switch((int)I->arg_begin()->getType()->getTypeID()) {
+        case Type::FloatTyID:
           EnsureFunctionExists(M, "sqrtf", I->arg_begin(), I->arg_end(),
                                Type::FloatTy);
-        else
+        case Type::DoubleTyID:
           EnsureFunctionExists(M, "sqrt", I->arg_begin(), I->arg_end(),
                                Type::DoubleTy);
+        case Type::X86_FP80TyID:
+        case Type::FP128TyID:
+        case Type::PPC_FP128TyID:
+          EnsureFunctionExists(M, "sqrtl", I->arg_begin(), I->arg_end(),
+                               I->arg_begin()->getType());
+        }
         break;
       }
 }
@@ -782,34 +788,27 @@
                     MemsetFCache);
     break;
   }
-  case Intrinsic::sqrt_f32: {
+  case Intrinsic::sqrt: {
     static Constant *sqrtfFCache = 0;
-    ReplaceCallWith("sqrtf", CI, CI->op_begin()+1, CI->op_end(),
-                    Type::FloatTy, sqrtfFCache);
-    break;
-  }
-  case Intrinsic::sqrt_f64: {
     static Constant *sqrtFCache = 0;
-    ReplaceCallWith("sqrt", CI, CI->op_begin()+1, CI->op_end(),
+    static Constant *sqrtLDCache = 0;
+    switch (CI->getOperand(1)->getType()->getTypeID()) {
+    default: assert(0 && "Invalid type in sqrt"); abort();
+    case Type::FloatTyID:
+      ReplaceCallWith("sqrtf", CI, CI->op_begin()+1, CI->op_end(),
+                    Type::FloatTy, sqrtfFCache);
+      break;
+    case Type::DoubleTyID:
+      ReplaceCallWith("sqrt", CI, CI->op_begin()+1, CI->op_end(),
                     Type::DoubleTy, sqrtFCache);
-    break;
-  }
-  case Intrinsic::sqrt_f80: {
-    static Constant *sqrtF80Cache = 0;
-    ReplaceCallWith("sqrtl", CI, CI->op_begin()+1, CI->op_end(),
-                    Type::X86_FP80Ty, sqrtF80Cache);
-    break;
-  }
-  case Intrinsic::sqrt_f128: {
-    static Constant *sqrtF128Cache = 0;
-    ReplaceCallWith("sqrtl", CI, CI->op_begin()+1, CI->op_end(),
-                    Type::FP128Ty, sqrtF128Cache);
-    break;
-  }
-  case Intrinsic::sqrt_ppcf128: {
-    static Constant *sqrtppcF128Cache = 0;
-    ReplaceCallWith("sqrtl", CI, CI->op_begin()+1, CI->op_end(),
-                    Type::PPC_FP128Ty, sqrtppcF128Cache);
+      break;
+    case Type::X86_FP80TyID:
+    case Type::FP128TyID:
+    case Type::PPC_FP128TyID:
+      ReplaceCallWith("sqrtl", CI, CI->op_begin()+1, CI->op_end(),
+                    CI->getOperand(1)->getType(), sqrtLDCache);
+      break;
+    }
     break;
   }
   }

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=42537&r1=42536&r2=42537&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Oct  2 12:43:59 2007
@@ -2796,20 +2796,12 @@
      return 0;
   }
 
-  case Intrinsic::sqrt_f32:
-  case Intrinsic::sqrt_f64:
-  case Intrinsic::sqrt_f80:
-  case Intrinsic::sqrt_f128:
-  case Intrinsic::sqrt_ppcf128:
+  case Intrinsic::sqrt:
     setValue(&I, DAG.getNode(ISD::FSQRT,
                              getValue(I.getOperand(1)).getValueType(),
                              getValue(I.getOperand(1))));
     return 0;
-  case Intrinsic::powi_f32:
-  case Intrinsic::powi_f64:
-  case Intrinsic::powi_f80:
-  case Intrinsic::powi_f128:
-  case Intrinsic::powi_ppcf128:
+  case Intrinsic::powi:
     setValue(&I, DAG.getNode(ISD::FPOWI,
                              getValue(I.getOperand(1)).getValueType(),
                              getValue(I.getOperand(1)),

Modified: llvm/trunk/lib/Target/CBackend/CBackend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CBackend/CBackend.cpp?rev=42537&r1=42536&r2=42537&view=diff

==============================================================================
--- llvm/trunk/lib/Target/CBackend/CBackend.cpp (original)
+++ llvm/trunk/lib/Target/CBackend/CBackend.cpp Tue Oct  2 12:43:59 2007
@@ -2417,8 +2417,7 @@
           case Intrinsic::longjmp:
           case Intrinsic::prefetch:
           case Intrinsic::dbg_stoppoint:
-          case Intrinsic::powi_f32:
-          case Intrinsic::powi_f64:
+          case Intrinsic::powi:
             // We directly implement these intrinsics
             break;
           default:
@@ -2537,8 +2536,7 @@
         writeOperand(I.getOperand(1));
         Out << ')';
         return;
-      case Intrinsic::powi_f32:
-      case Intrinsic::powi_f64:
+      case Intrinsic::powi:
         Out << "__builtin_powi(";
         writeOperand(I.getOperand(1));
         Out << ", ";





More information about the llvm-commits mailing list