On Wed, Jul 3, 2013 at 2:08 PM, Rafael EspĂndola <[email protected] > wrote:
> Out of curiosity, what is the problem with the intrinsic? > > Hi Rafael, The way LLVM currently works, except for some very special cases this intrinsic gets lowered to a library call anyway. Since in PNaCl we ship the portable parts of the C library as bitcode embedded in the .pexe, we prefer the libcall to be resolved earlier without generating intrinsics that the code generator has to handle. This helps us decrease the surface of the stable ABI PNaCl has to support. See this thread for more details - http://lists.cs.uiuc.edu/pipermail/llvmdev/2013-June/063010.html Eli > 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
