]> granicus.if.org Git - clang/commitdiff
OpenCL: Do not force 64 bit floats for (embedded) targets with only 32bit floats.
authorPekka Jaaskelainen <pekka.jaaskelainen@tut.fi>
Wed, 18 Dec 2013 18:15:03 +0000 (18:15 +0000)
committerPekka Jaaskelainen <pekka.jaaskelainen@tut.fi>
Wed, 18 Dec 2013 18:15:03 +0000 (18:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197592 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/TargetInfo.cpp

index d0ed6e6b161c964c3a152d029c0fe35d749f7cb4..7ee2706d3e1161fc313bb0cc41e95c557ca75fb9 100644 (file)
@@ -244,7 +244,14 @@ void TargetInfo::setForcedLangOptions(LangOptions &Opts) {
     LongLongWidth = LongLongAlign = 128;
     HalfWidth = HalfAlign = 16;
     FloatWidth = FloatAlign = 32;
-    DoubleWidth = DoubleAlign = 64;
+    
+    // Embedded 32-bit targets (OpenCL EP) might have double C type 
+    // defined as float. Let's not override this as it might lead 
+    // to generating illegal code that uses 64bit doubles.
+    if (DoubleWidth != FloatWidth) {
+      DoubleWidth = DoubleAlign = 64;
+      DoubleFormat = &llvm::APFloat::IEEEdouble;
+    }
     LongDoubleWidth = LongDoubleAlign = 128;
 
     assert(PointerWidth == 32 || PointerWidth == 64);
@@ -259,7 +266,6 @@ void TargetInfo::setForcedLangOptions(LangOptions &Opts) {
 
     HalfFormat = &llvm::APFloat::IEEEhalf;
     FloatFormat = &llvm::APFloat::IEEEsingle;
-    DoubleFormat = &llvm::APFloat::IEEEdouble;
     LongDoubleFormat = &llvm::APFloat::IEEEquad;
   }
 }