]> granicus.if.org Git - clang/commitdiff
Implement -cl-single-precision-constant
authorPeter Collingbourne <peter@pcc.me.uk>
Sat, 4 Dec 2010 01:50:56 +0000 (01:50 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Sat, 4 Dec 2010 01:50:56 +0000 (01:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120877 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/LangOptions.h
include/clang/Driver/CC1Options.td
lib/Frontend/CompilerInvocation.cpp
lib/Sema/SemaExpr.cpp
test/CodeGen/cl-single-precision-constant.c [new file with mode: 0644]

index aa4eae069d8ee29f270fcc7fd14c46011699e607..88e3c8a215716dde50656017007c184185e9bd64 100644 (file)
@@ -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;
   }
 
index 27db9cf5bfb8d0abab9237e867987e304bba6afb..eab473b4b7c6dfe402822087701ca69783350962 100644 (file)
@@ -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.">;
index 8795b38a41c827dbdfc2671cbe3605df0054660e..7f9d4a560ed218c9db33aaa9610a1d621e7b7a7a 100644 (file)
@@ -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.
index 270aa3e06b4b475cc82221a62d7eaa87ff16785c..177d61cc822aaf75725fa02903471a9f2a0afc8e 100644 (file)
@@ -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/test/CodeGen/cl-single-precision-constant.c b/test/CodeGen/cl-single-precision-constant.c
new file mode 100644 (file)
index 0000000..adde193
--- /dev/null
@@ -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.;
+}