summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2010-12-04 01:50:56 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2010-12-04 01:50:56 +0000
commit0b69e1a6280d8cfc83b995be8e02bf0c676540bd (patch)
tree63e87fe6df7763564318da9d3b2f9fcfea9d8622
parent31587c86c161f29f5ce6144207a6043edae82c9f (diff)
downloadbcm5719-llvm-0b69e1a6280d8cfc83b995be8e02bf0c676540bd.tar.gz
bcm5719-llvm-0b69e1a6280d8cfc83b995be8e02bf0c676540bd.zip
Implement -cl-single-precision-constant
llvm-svn: 120877
-rw-r--r--clang/include/clang/Basic/LangOptions.h4
-rw-r--r--clang/include/clang/Driver/CC1Options.td2
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp1
-rw-r--r--clang/lib/Sema/SemaExpr.cpp3
-rw-r--r--clang/test/CodeGen/cl-single-precision-constant.c7
5 files changed, 17 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h
index aa4eae069d8..88e3c8a2157 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -110,6 +110,9 @@ public:
unsigned SpellChecking : 1; // Whether to perform spell-checking for error
// recovery.
+ unsigned SinglePrecisionConstants : 1; // Whether to treat double-precision
+ // floating point constants as
+ // single precision constants.
// FIXME: This is just a temporary option, for testing purposes.
unsigned NoBitFieldTypeAlign : 1;
@@ -196,6 +199,7 @@ public:
DumpRecordLayouts = 0;
DumpVTableLayouts = 0;
SpellChecking = 1;
+ SinglePrecisionConstants = 0;
NoBitFieldTypeAlign = 0;
}
diff --git a/clang/include/clang/Driver/CC1Options.td b/clang/include/clang/Driver/CC1Options.td
index 27db9cf5bfb..eab473b4b7c 100644
--- a/clang/include/clang/Driver/CC1Options.td
+++ b/clang/include/clang/Driver/CC1Options.td
@@ -599,3 +599,5 @@ def H : Flag<"-H">,
def cl_opt_disable : Flag<"-cl-opt-disable">,
HelpText<"OpenCL only. This option disables all optimizations. The default is optimizations are enabled.">;
+def cl_single_precision_constant : Flag<"-cl-single-precision-constant">,
+ HelpText<"OpenCL only. Treat double precision floating-point constant as single precision constant.">;
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index 8795b38a41c..7f9d4a560ed 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -1418,6 +1418,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
Opts.DumpVTableLayouts = Args.hasArg(OPT_fdump_vtable_layouts);
Opts.SpellChecking = !Args.hasArg(OPT_fno_spell_checking);
Opts.NoBitFieldTypeAlign = Args.hasArg(OPT_fno_bitfield_type_align);
+ Opts.SinglePrecisionConstants = Args.hasArg(OPT_cl_single_precision_constant);
Opts.OptimizeSize = 0;
// FIXME: Eliminate this dependency.
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 270aa3e06b4..177d61cc822 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -2394,6 +2394,9 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok) {
bool isExact = (result == APFloat::opOK);
Res = FloatingLiteral::Create(Context, Val, isExact, Ty, Tok.getLocation());
+ if (getLangOptions().SinglePrecisionConstants && Ty == Context.DoubleTy)
+ ImpCastExprToType(Res, Context.FloatTy, CK_FloatingCast);
+
} else if (!Literal.isIntegerLiteral()) {
return ExprError();
} else {
diff --git a/clang/test/CodeGen/cl-single-precision-constant.c b/clang/test/CodeGen/cl-single-precision-constant.c
new file mode 100644
index 00000000000..adde19361b1
--- /dev/null
+++ b/clang/test/CodeGen/cl-single-precision-constant.c
@@ -0,0 +1,7 @@
+// RUN: %clang_cc1 %s -x cl -cl-single-precision-constant -emit-llvm -o - | FileCheck %s
+
+float fn(float f) {
+ // CHECK: fmul float
+ // CHECK: fadd float
+ return f*2. + 1.;
+}
OpenPOWER on IntegriCloud