[llvm-commits] [llvm-gcc-4.2] r53229 - in /llvm-gcc-4.2/trunk/gcc: llvm-convert.cpp llvm-internal.h

Duncan Sands baldrick at free.fr
Tue Jul 8 03:04:29 PDT 2008


Author: baldrick
Date: Tue Jul  8 05:04:26 2008
New Revision: 53229

URL: http://llvm.org/viewvc/llvm-project?rev=53229&view=rev
Log:
Fix PR2520: fabs should be marked readnone and
nounwind.  The problem here is that the call was
not being generated from the gcc fabs builtin
(in which case it would have automagically had
the right attributes), but from an ABS_EXPR.

Modified:
    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
    llvm-gcc-4.2/trunk/gcc/llvm-internal.h

Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=53229&r1=53228&r2=53229&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Tue Jul  8 05:04:26 2008
@@ -3148,10 +3148,30 @@
       ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
     Value *Cmp = Builder.CreateICmp(pred, Op, OpN->getOperand(0), "abscond");
     return Builder.CreateSelect(Cmp, Op, OpN, "abs");
-  } else {
-    // Turn FP abs into fabs/fabsf.
-    return EmitBuiltinUnaryFPOp(Op, "fabsf", "fabs", "fabsl");
   }
+
+  // Turn FP abs into fabs/fabsf.
+  const char *Name = 0;
+
+  switch (Op->getType()->getTypeID()) {
+  default: assert(0 && "Unknown FP type!");
+  case Type::FloatTyID:  Name = "fabsf"; break;
+  case Type::DoubleTyID: Name = "fabs"; break;
+  case Type::X86_FP80TyID:
+  case Type::PPC_FP128TyID:
+  case Type::FP128TyID: Name = "fabsl"; break;
+  }
+
+  Function *F = cast<Function>(TheModule->getOrInsertFunction(Name,
+                                                              Op->getType(),
+                                                              Op->getType(),
+                                                              NULL));
+  CallInst *Call = Builder.CreateCall(F, Op);
+  F->setDoesNotThrow();
+  Call->setDoesNotThrow();
+  F->setDoesNotAccessMemory();
+  Call->setDoesNotAccessMemory();
+  return Call;
 }
 
 Value *TreeToLLVM::EmitBIT_NOT_EXPR(tree exp) {
@@ -4870,25 +4890,6 @@
   return true;
 }
 
-Value *TreeToLLVM::EmitBuiltinUnaryFPOp(Value *Amt, const char *F32Name,
-                                        const char *F64Name, 
-                                        const char *LongDoubleName) {
-  const char *Name = 0;
-  
-  switch (Amt->getType()->getTypeID()) {
-  default: assert(0 && "Unknown FP type!");
-  case Type::FloatTyID:  Name = F32Name; break;
-  case Type::DoubleTyID: Name = F64Name; break;
-  case Type::X86_FP80TyID:
-  case Type::PPC_FP128TyID:
-  case Type::FP128TyID: Name = LongDoubleName; break;
-  }
-  
-  return Builder.CreateCall(cast<Function>(
-    TheModule->getOrInsertFunction(Name, Amt->getType(), Amt->getType(), NULL)),
-                            Amt);
-}
-
 Value *TreeToLLVM::EmitBuiltinSQRT(tree exp) {
   Value *Amt = Emit(TREE_VALUE(TREE_OPERAND(exp, 1)), 0);
   Intrinsic::ID Id = Intrinsic::not_intrinsic;

Modified: llvm-gcc-4.2/trunk/gcc/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-internal.h?rev=53229&r1=53228&r2=53229&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-internal.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-internal.h Tue Jul  8 05:04:26 2008
@@ -525,8 +525,6 @@
   bool EmitFrontendExpandedBuiltinCall(tree_node *exp, tree_node *fndecl,
                                        const MemRef *DestLoc, Value *&Result);
   bool EmitBuiltinUnaryIntOp(Value *InVal, Value *&Result, Intrinsic::ID Id);
-  Value *EmitBuiltinUnaryFPOp(Value *InVal, const char *F32Name,
-                              const char *F64Name, const char *LongDoubleName);
   Value *EmitBuiltinSQRT(tree_node *exp);
   Value *EmitBuiltinPOWI(tree_node *exp);
 





More information about the llvm-commits mailing list