Out of curiosity, what is the problem with the intrinsic?
On 3 July 2013 15:19, Eli Bendersky <[email protected]> wrote: > Author: eliben > Date: Wed Jul 3 14:19:12 2013 > New Revision: 185568 > > URL: http://llvm.org/viewvc/llvm-project?rev=185568&view=rev > Log: > Add target hook CodeGen queries when generating builtin pow*. > > Without fmath-errno, Clang currently generates calls to @llvm.pow.* intrinsics > when it sees pow*(). This may not be suitable for all targets (for > example le32/PNaCl), so the attached patch adds a target hook that CodeGen > queries. The target can state its preference for having or not having the > intrinsic generated. Non-PNaCl behavior remains unchanged; > PNaCl-specific test added. > > > > Added: > cfe/trunk/test/CodeGen/le32-libcall-pow.c > Modified: > cfe/trunk/lib/CodeGen/CGBuiltin.cpp > cfe/trunk/lib/CodeGen/TargetInfo.cpp > cfe/trunk/lib/CodeGen/TargetInfo.h > > Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=185568&r1=185567&r2=185568&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Wed Jul 3 14:19:12 2013 > @@ -1293,13 +1293,18 @@ RValue CodeGenFunction::EmitBuiltinExpr( > case Builtin::BIpow: > case Builtin::BIpowf: > case Builtin::BIpowl: { > - if (!FD->hasAttr<ConstAttr>()) > - break; > - Value *Base = EmitScalarExpr(E->getArg(0)); > - Value *Exponent = EmitScalarExpr(E->getArg(1)); > - llvm::Type *ArgType = Base->getType(); > - Value *F = CGM.getIntrinsic(Intrinsic::pow, ArgType); > - return RValue::get(Builder.CreateCall2(F, Base, Exponent)); > + // Transform a call to pow* into a @llvm.pow.* intrinsic call, but only > + // if the target agrees. > + if (getTargetHooks().emitIntrinsicForPow()) { > + if (!FD->hasAttr<ConstAttr>()) > + break; > + Value *Base = EmitScalarExpr(E->getArg(0)); > + Value *Exponent = EmitScalarExpr(E->getArg(1)); > + llvm::Type *ArgType = Base->getType(); > + Value *F = CGM.getIntrinsic(Intrinsic::pow, ArgType); > + return RValue::get(Builder.CreateCall2(F, Base, Exponent)); > + } > + break; > } > > case Builtin::BIfma: > > Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=185568&r1=185567&r2=185568&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original) > +++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Wed Jul 3 14:19:12 2013 > @@ -443,6 +443,10 @@ class PNaClTargetCodeGenInfo : public Ta > public: > PNaClTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT) > : TargetCodeGenInfo(new PNaClABIInfo(CGT)) {} > + > + /// For PNaCl we don't want llvm.pow.* intrinsics to be emitted instead > + /// of library function calls. > + bool emitIntrinsicForPow() const { return false; } > }; > > void PNaClABIInfo::computeInfo(CGFunctionInfo &FI) const { > > Modified: cfe/trunk/lib/CodeGen/TargetInfo.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.h?rev=185568&r1=185567&r2=185568&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/TargetInfo.h (original) > +++ cfe/trunk/lib/CodeGen/TargetInfo.h Wed Jul 3 14:19:12 2013 > @@ -74,6 +74,10 @@ namespace clang { > /// through such registers. > virtual bool extendPointerWithSExt() const { return false; } > > + /// Controls whether BIpow* emit an intrinsic call instead of a library > + /// function call. > + virtual bool emitIntrinsicForPow() const { return true; } > + > /// Determines the DWARF register number for the stack pointer, for > /// exception-handling purposes. Implements __builtin_dwarf_sp_column. > /// > > Added: cfe/trunk/test/CodeGen/le32-libcall-pow.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/le32-libcall-pow.c?rev=185568&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGen/le32-libcall-pow.c (added) > +++ cfe/trunk/test/CodeGen/le32-libcall-pow.c Wed Jul 3 14:19:12 2013 > @@ -0,0 +1,21 @@ > +// RUN: %clang_cc1 -fmath-errno -emit-llvm -o - %s -triple le32-unknown-nacl > | FileCheck %s > +// RUN: %clang_cc1 -emit-llvm -o - %s -triple le32-unknown-nacl | FileCheck > %s > + > +// le32 (PNaCl) never generates intrinsics for pow calls, with or without > errno > + > +// CHECK: define void @test_pow > +void test_pow(float a0, double a1, long double a2) { > + // CHECK: call float @powf > + float l0 = powf(a0, a0); > + > + // CHECK: call double @pow > + double l1 = pow(a1, a1); > + > + // CHECK: call double @powl > + long double l2 = powl(a2, a2); > +} > + > +// CHECK: declare float @powf(float, float) > +// CHECK: declare double @pow(double, double) > +// CHECK: declare double @powl(double, double) > + > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
