[PATCH] Constant expression evaluation support for __builtin_isinf

Richard Smith richard at metafoo.co.uk
Mon Oct 14 21:49:33 PDT 2013


On Wed, Oct 2, 2013 at 10:42 PM, Karthik Bhat <kv.bhat at samsung.com> wrote:

>   Hi Richard,
>   Added constexpr support for builtin isnan,isfinite and isnormal.
>

Thanks!


>   The test case here is actually to test constexpr support in buitin so i
> think we cannot put it in test/Sema/constant-builtins-2.c as we need
> -std=c++11 flag for constexpr which cannot be enabled in a .c file.
>

You can just follow the existing style of the tests in that file. You don't
need to test constexpr specifically, testing constant evaluation of any
form is fine, but it's better to keep all the related tests for this stuff
in the same place. There's nothing specific to C++11 or constexpr here.


>   Moved the test cases to test/SemaCXX/constant-expression-cxx11.cpp. Is
> that fine?

  Thanks
>   Karthik Bhat
>
> Hi rsmith, eli.friedman,
>
> http://llvm-reviews.chandlerc.com/D1794
>
> CHANGE SINCE LAST DIFF
>   http://llvm-reviews.chandlerc.com/D1794?vs=4572&id=4615#toc
>
> Files:
>   lib/AST/ExprConstant.cpp
>   test/SemaCXX/constant-expression-cxx11.cpp
>
> Index: lib/AST/ExprConstant.cpp
> ===================================================================
> --- lib/AST/ExprConstant.cpp
> +++ lib/AST/ExprConstant.cpp
> @@ -5985,6 +5985,30 @@
>             Success(Val.isInfinity() ? (Val.isNegative() ? -1 : 1) : 0, E);
>    }
>
> +  case Builtin::BI__builtin_isinf: {
> +    APFloat Val(0.0);
> +    return EvaluateFloat(E->getArg(0), Val, Info) &&
> +           Success(Val.isInfinity() ? 1 : 0, E);
> +  }
> +
> +  case Builtin::BI__builtin_isfinite: {
> +    APFloat Val(0.0);
> +    return EvaluateFloat(E->getArg(0), Val, Info) &&
> +           Success(Val.isFinite() ? 1 : 0, E);
> +  }
> +
> +  case Builtin::BI__builtin_isnan: {
> +    APFloat Val(0.0);
> +    return EvaluateFloat(E->getArg(0), Val, Info) &&
> +           Success(Val.isNaN() ? 1 : 0, E);
> +  }
> +
> +  case Builtin::BI__builtin_isnormal: {
> +    APFloat Val(0.0);
> +    return EvaluateFloat(E->getArg(0), Val, Info) &&
> +           Success(Val.isNormal() ? 1 : 0, E);
> +  }
> +
>    case Builtin::BI__builtin_parity:
>    case Builtin::BI__builtin_parityl:
>    case Builtin::BI__builtin_parityll: {
> Index: test/SemaCXX/constant-expression-cxx11.cpp
> ===================================================================
> --- test/SemaCXX/constant-expression-cxx11.cpp
> +++ test/SemaCXX/constant-expression-cxx11.cpp
> @@ -1794,3 +1794,63 @@
>      int k; // expected-note {{not initialized}}
>    };
>  }
> +
> +// Builtin constant expression evaluation-
> +// __builtin_isinf
> +void test_builtin_isinf() {
> +
> +  constexpr long double num1 = __builtin_isinf(1.l);
> +  static_assert(num1 == 0, "");
> +  constexpr double num2 = __builtin_isinf(1.);
> +  static_assert(num2 == 0, "");
> +  constexpr double num3 = __builtin_isinf(1.f);
> +  static_assert(num3 == 0, "");
> +  constexpr float num4 = __builtin_isinf(__builtin_inf());
> +  static_assert(num4 == 1, "");
> +}
> +
> +// __builtin_isfinite
> +void test_builtin_isfinite() {
> +
> +  constexpr long double num1 = __builtin_isfinite(1.l);
> +  static_assert(num1 == 1, "");
> +  constexpr double num2 = __builtin_isfinite(1.);
> +  static_assert(num2 == 1, "");
> +  constexpr double num3 = __builtin_isfinite(1.f);
> +  static_assert(num3 == 1, "");
> +  constexpr float num4 = __builtin_isfinite(__builtin_inf());
> +  static_assert(num4 == 0, "");
> +
> +}
> +
> +// __builtin_isnan
> +void test_builtin_isnan() {
> +
> +  constexpr long double num1 = __builtin_isnan(1.l);
> +  static_assert(num1 == 0, "");
> +  constexpr double num2 = __builtin_isnan(1.);
> +  static_assert(num2 == 0, "");
> +  constexpr double num3 = __builtin_isnan(1.f);
> +  static_assert(num3 == 0, "");
> +  constexpr float num4 = __builtin_isnan(__builtin_inf());
> +  static_assert(num4 == 0, "");
> +  constexpr float num5 = __builtin_isnan(__builtin_nan(""));
> +  static_assert(num5 == 1, "");
> +}
> +
> +// __builtin_isnormal
> +void test_builtin_isnormal() {
> +
> +  constexpr long double num1 = __builtin_isnormal(1.l);
> +  static_assert(num1 == 1, "");
> +  constexpr double num2 = __builtin_isnormal(1.);
> +  static_assert(num2 == 1, "");
> +  constexpr double num3 = __builtin_isnormal(1.f);
> +  static_assert(num3 == 1, "");
> +  constexpr float num4 = __builtin_isnormal(__builtin_inf());
> +  static_assert(num4 == 0, "");
> +  constexpr float num5 = __builtin_isnormal(__builtin_nan(""));
> +  static_assert(num5 == 0, "");
> +  constexpr float num6 = __builtin_isnormal(0.);
> +  static_assert(num6 == 0, "");
> +}
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131014/68373da7/attachment.html>


More information about the cfe-commits mailing list