r185568 - Add target hook CodeGen queries when generating builtin pow*.

Eli Bendersky eliben at google.com
Wed Jul 3 17:15:45 PDT 2013


On Wed, Jul 3, 2013 at 2:08 PM, Rafael EspĂ­ndola <rafael.espindola at gmail.com
> 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 <eliben at google.com> 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
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130703/cd773d9a/attachment.html>


More information about the cfe-commits mailing list