forked from OSchip/llvm-project
OpenCL C: Add support for a set of floating point
arithmetic relaxation flags: -cl-no-signed-zeros -cl-unsafe-math-optimizations -cl-finite-math-only -cl-fast-relaxed-math Propagate the info to FP instruction flags as well as function attributes where they are available. llvm-svn: 223928
This commit is contained in:
parent
d83248e60c
commit
3701450b06
|
@ -578,6 +578,8 @@ def cl_finite_math_only : Flag<["-"], "cl-finite-math-only">,
|
|||
HelpText<"OpenCL only. Allow floating-point optimizations that assume arguments and results are not NaNs or +-Inf.">;
|
||||
def cl_kernel_arg_info : Flag<["-"], "cl-kernel-arg-info">,
|
||||
HelpText<"OpenCL only. Generate kernel argument metadata.">;
|
||||
def cl_no_signed_zeros : Flag<["-"], "cl-no-signed-zeros">,
|
||||
HelpText<"OpenCL only. Allow optimizations to ignore the signedness of the floating-point zero.">;
|
||||
def cl_unsafe_math_optimizations : Flag<["-"], "cl-unsafe-math-optimizations">,
|
||||
HelpText<"OpenCL only. Allow unsafe floating-point optimizations. Also implies -cl-no-signed-zeros and -cl-mad-enable">;
|
||||
def cl_fast_relaxed_math : Flag<["-"], "cl-fast-relaxed-math">,
|
||||
|
|
|
@ -78,6 +78,7 @@ CODEGENOPT(EnableSegmentedStacks , 1, 0) ///< Set when -fsplit-stack is enabled.
|
|||
CODEGENOPT(NoGlobalMerge , 1, 0) ///< Set when -mno-global-merge is enabled.
|
||||
CODEGENOPT(NoImplicitFloat , 1, 0) ///< Set when -mno-implicit-float is enabled.
|
||||
CODEGENOPT(NoInfsFPMath , 1, 0) ///< Assume FP arguments, results not +-Inf.
|
||||
CODEGENOPT(NoSignedZeros , 1, 0) ///< Allow ignoring the signedness of FP zero
|
||||
CODEGENOPT(NoInline , 1, 0) ///< Set when -fno-inline is enabled.
|
||||
///< Disables use of the inline keyword.
|
||||
CODEGENOPT(NoNaNsFPMath , 1, 0) ///< Assume FP arguments, results not NaN.
|
||||
|
|
|
@ -63,6 +63,12 @@ CodeGenFunction::CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext)
|
|||
FMF.setNoNaNs();
|
||||
FMF.setNoInfs();
|
||||
}
|
||||
if (CGM.getCodeGenOpts().NoNaNsFPMath) {
|
||||
FMF.setNoNaNs();
|
||||
}
|
||||
if (CGM.getCodeGenOpts().NoSignedZeros) {
|
||||
FMF.setNoSignedZeros();
|
||||
}
|
||||
Builder.SetFastMathFlags(FMF);
|
||||
}
|
||||
|
||||
|
|
|
@ -417,11 +417,13 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
|||
Opts.LessPreciseFPMAD = Args.hasArg(OPT_cl_mad_enable);
|
||||
Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision);
|
||||
Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) ||
|
||||
Args.hasArg(OPT_cl_finite_math_only)||
|
||||
Args.hasArg(OPT_cl_finite_math_only) ||
|
||||
Args.hasArg(OPT_cl_fast_relaxed_math));
|
||||
Opts.NoNaNsFPMath = (Args.hasArg(OPT_menable_no_nans) ||
|
||||
Args.hasArg(OPT_cl_finite_math_only)||
|
||||
Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
|
||||
Args.hasArg(OPT_cl_finite_math_only) ||
|
||||
Args.hasArg(OPT_cl_fast_relaxed_math));
|
||||
Opts.NoSignedZeros = Args.hasArg(OPT_cl_no_signed_zeros);
|
||||
Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);
|
||||
Opts.BackendOptions = Args.getAllArgValues(OPT_backend_option);
|
||||
Opts.NumRegisterParameters = getLastArgIntValue(Args, OPT_mregparm, 0, Diags);
|
||||
|
@ -1598,8 +1600,11 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
|
|||
// inlining enabled.
|
||||
Opts.NoInlineDefine = !Opt || Args.hasArg(OPT_fno_inline);
|
||||
|
||||
Opts.FastMath = Args.hasArg(OPT_ffast_math);
|
||||
Opts.FiniteMathOnly = Args.hasArg(OPT_ffinite_math_only);
|
||||
Opts.FastMath = Args.hasArg(OPT_ffast_math) ||
|
||||
Args.hasArg(OPT_cl_fast_relaxed_math);
|
||||
Opts.FiniteMathOnly = Args.hasArg(OPT_ffinite_math_only) ||
|
||||
Args.hasArg(OPT_cl_finite_math_only) ||
|
||||
Args.hasArg(OPT_cl_fast_relaxed_math);
|
||||
|
||||
Opts.RetainCommentsFromSystemHeaders =
|
||||
Args.hasArg(OPT_fretain_comments_from_system_headers);
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s -check-prefix=NORMAL
|
||||
// RUN: %clang_cc1 %s -emit-llvm -cl-fast-relaxed-math -o - | FileCheck %s -check-prefix=FAST
|
||||
// RUN: %clang_cc1 %s -emit-llvm -cl-finite-math-only -o - | FileCheck %s -check-prefix=FINITE
|
||||
// RUN: %clang_cc1 %s -emit-llvm -cl-unsafe-math-optimizations -o - | FileCheck %s -check-prefix=UNSAFE
|
||||
// RUN: %clang_cc1 %s -emit-llvm -cl-no-signed-zeros -o - | FileCheck %s -check-prefix=NOSZ
|
||||
|
||||
typedef __attribute__(( ext_vector_type(4) )) float float4;
|
||||
|
||||
float spscalardiv(float a, float b) {
|
||||
// CHECK: @spscalardiv(
|
||||
|
||||
// NORMAL: fdiv float
|
||||
// FAST: fdiv fast float
|
||||
// FINITE: fdiv nnan ninf float
|
||||
// UNSAFE: fdiv nnan float
|
||||
// NOSZ: fdiv nsz float
|
||||
return a / b;
|
||||
}
|
||||
// CHECK: attributes
|
||||
|
||||
// NORMAL: "no-infs-fp-math"="false"
|
||||
// NORMAL: "no-nans-fp-math"="false"
|
||||
// NORMAL: "unsafe-fp-math"="false"
|
||||
|
||||
// FAST: "no-infs-fp-math"="true"
|
||||
// FAST: "no-nans-fp-math"="true"
|
||||
// FAST: "unsafe-fp-math"="true"
|
||||
|
||||
// FINITE: "no-infs-fp-math"="true"
|
||||
// FINITE: "no-nans-fp-math"="true"
|
||||
// FINITE: "unsafe-fp-math"="false"
|
||||
|
||||
// UNSAFE: "no-infs-fp-math"="false"
|
||||
// UNSAFE: "no-nans-fp-math"="true"
|
||||
// UNSAFE: "unsafe-fp-math"="true"
|
||||
|
Loading…
Reference in New Issue