diff options
| author | Silviu Baranga <silviu.baranga@arm.com> | 2016-04-29 15:03:32 +0000 |
|---|---|---|
| committer | Silviu Baranga <silviu.baranga@arm.com> | 2016-04-29 15:03:32 +0000 |
| commit | 3102a012582cdc95b9a4ca1685e1428a75a077d4 (patch) | |
| tree | 5beb7a2da722ba47f5abb27a1fc6cde7651587ff | |
| parent | 14824b1c52b07b10ba6a9545f7f50bd72673b69c (diff) | |
| download | bcm5719-llvm-3102a012582cdc95b9a4ca1685e1428a75a077d4.tar.gz bcm5719-llvm-3102a012582cdc95b9a4ca1685e1428a75a077d4.zip | |
[ARM] Guard the declarations of f16 to f32 vcvt intrinsics in arm_neon.h by testing __ARM_FP
Summary:
Conversions between float and half are only available when the
taraget has the half-precision extension. Guard these intrinsics
so that they don't cause crashes in the backend.
Fixes PR27550.
Reviewers: rengolin, t.p.northover
Subscribers: cfe-commits, aemerson, t.p.northover, rengolin
Differential Revision: http://reviews.llvm.org/D19665
llvm-svn: 268047
| -rw-r--r-- | clang/include/clang/Basic/arm_neon.td | 6 | ||||
| -rw-r--r-- | clang/test/Sema/arm-no-fp16.c | 11 |
2 files changed, 15 insertions, 2 deletions
diff --git a/clang/include/clang/Basic/arm_neon.td b/clang/include/clang/Basic/arm_neon.td index 6641ed2edee..44325fde9f5 100644 --- a/clang/include/clang/Basic/arm_neon.td +++ b/clang/include/clang/Basic/arm_neon.td @@ -704,8 +704,10 @@ def VGET_LOW : NoTestOpInst<"vget_low", "dk", "csilhfUcUsUiUlPcPs", OP_LO>; //////////////////////////////////////////////////////////////////////////////// // E.3.22 Converting vectors -def VCVT_F16_F32 : SInst<"vcvt_f16_f32", "md", "Hf">; -def VCVT_F32_F16 : SInst<"vcvt_f32_f16", "wd", "h">; +let ArchGuard = "(__ARM_FP & 2)" in { + def VCVT_F16_F32 : SInst<"vcvt_f16_f32", "md", "Hf">; + def VCVT_F32_F16 : SInst<"vcvt_f32_f16", "wd", "h">; +} def VCVT_S32 : SInst<"vcvt_s32", "xd", "fQf">; def VCVT_U32 : SInst<"vcvt_u32", "ud", "fQf">; diff --git a/clang/test/Sema/arm-no-fp16.c b/clang/test/Sema/arm-no-fp16.c new file mode 100644 index 00000000000..6443d83198c --- /dev/null +++ b/clang/test/Sema/arm-no-fp16.c @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -triple thumbv7-none-eabi %s -target-feature +neon -target-feature -fp16 -fsyntax-only -verify + +#include <arm_neon.h> + +float16x4_t test_vcvt_f16_f32(float32x4_t a) { + return vcvt_f16_f32(a); // expected-warning{{implicit declaration of function 'vcvt_f16_f32'}} expected-error{{returning 'int' from a function with incompatible result type 'float16x4_t'}} +} + +float32x4_t test_vcvt_f32_f16(float16x4_t a) { + return vcvt_f32_f16(a); // expected-warning{{implicit declaration of function 'vcvt_f32_f16'}} expected-error{{returning 'int' from a function with incompatible result type 'float32x4_t'}} +} |

