[PATCH] D51372: FENV_ACCESS support for libm-style constrained intrinsics
kpn abandoned this revision. kpn added a comment. I believe Serge Pavlov has demonstrated a better way to do this. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D51372/new/ https://reviews.llvm.org/D51372 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D51372: FENV_ACCESS support for libm-style constrained intrinsics
kpn updated this revision to Diff 168814. kpn added a comment. Update based on feedback to https://reviews.llvm.org/D52839: add missing AST (de)serialization support. Ping. https://reviews.llvm.org/D51372 Files: include/clang/AST/Expr.h include/clang/AST/ExprCXX.h lib/AST/ASTImporter.cpp lib/AST/Expr.cpp lib/Analysis/BodyFarm.cpp lib/CodeGen/CGBuiltin.cpp lib/Frontend/Rewrite/RewriteModernObjC.cpp lib/Frontend/Rewrite/RewriteObjC.cpp lib/Sema/SemaExpr.cpp lib/Sema/SemaOpenMP.cpp lib/Sema/SemaOverload.cpp lib/Sema/TreeTransform.h lib/Serialization/ASTReaderStmt.cpp lib/Serialization/ASTWriterStmt.cpp test/CodeGen/fenv-access-pragma.c test/CodeGen/fenv-access-pragma.cpp test/CodeGen/fenv-math-builtins.c Index: test/CodeGen/fenv-math-builtins.c === --- test/CodeGen/fenv-math-builtins.c +++ test/CodeGen/fenv-math-builtins.c @@ -0,0 +1,84 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -w -S -o - -emit-llvm %s | FileCheck %s + +// Test codegen of math builtins when using FENV_ACCESS ON. +// Derived from math-builtins.c and keeps calls in the same order. +#pragma STDC FENV_ACCESS ON + +void foo(double *d, float f, float *fp, long double *l, int *i, const char *c) { + __builtin_pow(f,f);__builtin_powf(f,f); __builtin_powl(f,f); + +// CHECK: declare double @llvm.experimental.constrained.pow.f64(double, double, metadata, metadata) [[MATH_INTRINSIC:#[0-9]+]] +// CHECK: declare float @llvm.experimental.constrained.pow.f32(float, float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.pow.f80(x86_fp80, x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_powi(f,f);__builtin_powif(f,f); __builtin_powil(f,f); + +// CHECK: declare double @llvm.experimental.constrained.powi.f64(double, i32, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.powi.f32(float, i32, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.powi.f80(x86_fp80, i32, metadata, metadata) [[MATH_INTRINSIC]] + + /* math */ + __builtin_cos(f);__builtin_cosf(f); __builtin_cosl(f); +// CHECK: declare double @llvm.experimental.constrained.cos.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.cos.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.cos.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_exp(f);__builtin_expf(f); __builtin_expl(f); +// CHECK: declare double @llvm.experimental.constrained.exp.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.exp.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.exp.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_exp2(f); __builtin_exp2f(f); __builtin_exp2l(f); + +// CHECK: declare double @llvm.experimental.constrained.exp2.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.exp2.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.exp2.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_fma(f,f,f);__builtin_fmaf(f,f,f); __builtin_fmal(f,f,f); + +// CHECK: declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.fma.f80(x86_fp80, x86_fp80, x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_log(f);__builtin_logf(f); __builtin_logl(f); + +// CHECK: declare double @llvm.experimental.constrained.log.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.log.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.log.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_log10(f); __builtin_log10f(f); __builtin_log10l(f); + +// CHECK: declare double @llvm.experimental.constrained.log10.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.log10.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.log10.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_nearbyint(f); __builtin_nearbyintf(f); __builtin_nearbyintl(f); + +// CHECK: declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float
[PATCH] D51372: FENV_ACCESS support for libm-style constrained intrinsics
kpn updated this revision to Diff 165995. kpn added a comment. Rebase. Correct obvious error with powi. Fix test and test both C and (partial) C++. Ping. https://reviews.llvm.org/D51372 Files: include/clang/AST/Expr.h include/clang/AST/ExprCXX.h lib/AST/ASTImporter.cpp lib/AST/Expr.cpp lib/Analysis/BodyFarm.cpp lib/CodeGen/CGBuiltin.cpp lib/Frontend/Rewrite/RewriteModernObjC.cpp lib/Frontend/Rewrite/RewriteObjC.cpp lib/Sema/SemaExpr.cpp lib/Sema/SemaOpenMP.cpp lib/Sema/SemaOverload.cpp lib/Sema/TreeTransform.h test/CodeGen/fenv-access-pragma.c test/CodeGen/fenv-access-pragma.cpp test/CodeGen/fenv-math-builtins.c Index: test/CodeGen/fenv-math-builtins.c === --- test/CodeGen/fenv-math-builtins.c +++ test/CodeGen/fenv-math-builtins.c @@ -0,0 +1,84 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -w -S -o - -emit-llvm %s | FileCheck %s + +// Test codegen of math builtins when using FENV_ACCESS ON. +// Derived from math-builtins.c and keeps calls in the same order. +#pragma STDC FENV_ACCESS ON + +void foo(double *d, float f, float *fp, long double *l, int *i, const char *c) { + __builtin_pow(f,f);__builtin_powf(f,f); __builtin_powl(f,f); + +// CHECK: declare double @llvm.experimental.constrained.pow.f64(double, double, metadata, metadata) [[MATH_INTRINSIC:#[0-9]+]] +// CHECK: declare float @llvm.experimental.constrained.pow.f32(float, float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.pow.f80(x86_fp80, x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_powi(f,f);__builtin_powif(f,f); __builtin_powil(f,f); + +// CHECK: declare double @llvm.experimental.constrained.powi.f64(double, i32, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.powi.f32(float, i32, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.powi.f80(x86_fp80, i32, metadata, metadata) [[MATH_INTRINSIC]] + + /* math */ + __builtin_cos(f);__builtin_cosf(f); __builtin_cosl(f); +// CHECK: declare double @llvm.experimental.constrained.cos.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.cos.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.cos.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_exp(f);__builtin_expf(f); __builtin_expl(f); +// CHECK: declare double @llvm.experimental.constrained.exp.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.exp.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.exp.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_exp2(f); __builtin_exp2f(f); __builtin_exp2l(f); + +// CHECK: declare double @llvm.experimental.constrained.exp2.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.exp2.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.exp2.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_fma(f,f,f);__builtin_fmaf(f,f,f); __builtin_fmal(f,f,f); + +// CHECK: declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.fma.f80(x86_fp80, x86_fp80, x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_log(f);__builtin_logf(f); __builtin_logl(f); + +// CHECK: declare double @llvm.experimental.constrained.log.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.log.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.log.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_log10(f); __builtin_log10f(f); __builtin_log10l(f); + +// CHECK: declare double @llvm.experimental.constrained.log10.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.log10.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.log10.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_nearbyint(f); __builtin_nearbyintf(f); __builtin_nearbyintl(f); + +// CHECK: declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.nearbyint.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK:
[PATCH] D51372: FENV_ACCESS support for libm-style constrained intrinsics
kpn created this revision. kpn added a reviewer: rsmith. Herald added a reviewer: javed.absar. Herald added a subscriber: cfe-commits. This builds on https://reviews.llvm.org/D49865 to get #pragma STDC FENV_ACCESS ON to and used by AST handling of function calls to math intrinsics. This now emits constrained math intrinsics instead of the regular variety for the ones currently implemented in llvm. This should be good for C. More work is needed for C++. Repository: rC Clang https://reviews.llvm.org/D51372 Files: include/clang/AST/Expr.h include/clang/AST/ExprCXX.h lib/AST/ASTImporter.cpp lib/AST/Expr.cpp lib/Analysis/BodyFarm.cpp lib/CodeGen/CGBuiltin.cpp lib/Frontend/Rewrite/RewriteModernObjC.cpp lib/Frontend/Rewrite/RewriteObjC.cpp lib/Sema/SemaExpr.cpp lib/Sema/SemaOpenMP.cpp lib/Sema/SemaOverload.cpp lib/Sema/TreeTransform.h test/CodeGen/fenv-access-pragma.c test/CodeGen/fenv-math-builtins.c test/Parser/pragma-fenv-access.c Index: test/Parser/pragma-fenv-access.c === --- test/Parser/pragma-fenv-access.c +++ test/Parser/pragma-fenv-access.c @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +void f1(void) { + int x = 0; +/* expected-error@+1 {{'#pragma fenv_access' can only appear at file scope or at the start of a compound statement}} */ +#pragma STDC FENV_ACCESS ON +} + +void f2(void) { + #pragma STDC FENV_ACCESS OFF + #pragma STDC FENV_ACCESS ON +} Index: test/CodeGen/fenv-math-builtins.c === --- test/CodeGen/fenv-math-builtins.c +++ test/CodeGen/fenv-math-builtins.c @@ -0,0 +1,84 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -w -S -o - -emit-llvm %s | FileCheck %s + +// Test codegen of math builtins when using FENV_ACCESS ON. +// Derived from math-builtins.c and keeps calls in the same order. +#pragma STDC FENV_ACCESS ON + +void foo(double *d, float f, float *fp, long double *l, int *i, const char *c) { + __builtin_pow(f,f);__builtin_powf(f,f); __builtin_powl(f,f); + +// CHECK: declare double @llvm.experimental.constrained.pow.f64(double, double, metadata, metadata) [[MATH_INTRINSIC:#[0-9]+]] +// CHECK: declare float @llvm.experimental.constrained.pow.f32(float, float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.pow.f80(x86_fp80, x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_powi(f,f);__builtin_powif(f,f); __builtin_powil(f,f); + +// CHECK: declare double @llvm.experimental.constrained.powi.f64(double, i32, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.powi.f32(float, i32, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.powi.f80(x86_fp80, i32, metadata, metadata) [[MATH_INTRINSIC]] + + /* math */ + __builtin_cos(f);__builtin_cosf(f); __builtin_cosl(f); +// CHECK: declare double @llvm.experimental.constrained.cos.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.cos.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.cos.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_exp(f);__builtin_expf(f); __builtin_expl(f); +// CHECK: declare double @llvm.experimental.constrained.exp.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.exp.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.exp.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_exp2(f); __builtin_exp2f(f); __builtin_exp2l(f); + +// CHECK: declare double @llvm.experimental.constrained.exp2.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.exp2.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.exp2.f80(x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_fma(f,f,f);__builtin_fmaf(f,f,f); __builtin_fmal(f,f,f); + +// CHECK: declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare x86_fp80 @llvm.experimental.constrained.fma.f80(x86_fp80, x86_fp80, x86_fp80, metadata, metadata) [[MATH_INTRINSIC]] + + __builtin_log(f);__builtin_logf(f); __builtin_logl(f); + +// CHECK: declare double @llvm.experimental.constrained.log.f64(double, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare float @llvm.experimental.constrained.log.f32(float, metadata, metadata) [[MATH_INTRINSIC]] +// CHECK: declare