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

Rafael EspĂ­ndola rafael.espindola at gmail.com
Wed Jul 3 14:08:18 PDT 2013


Out of curiosity, what is the problem with the intrinsic?

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



More information about the cfe-commits mailing list