From 91b3083aecdcb7beb33d497a94f4467f110b4f6d Mon Sep 17 00:00:00 2001 From: Sven van Haastregt Date: Wed, 5 Feb 2020 16:05:20 +0000 Subject: [PATCH 1/2] [OpenCL] Fix tblgen support for cl_khr_mipmap_image_writes Apply the fix of f780e15caf1 ("[OpenCL] Fix support for cl_khr_mipmap_image_writes", 2020-01-27) also to the TableGen OpenCL builtin function definitions. --- clang/lib/Sema/OpenCLBuiltins.td | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/clang/lib/Sema/OpenCLBuiltins.td b/clang/lib/Sema/OpenCLBuiltins.td index 0cbdc05700e9f..888978dfdbd3e 100644 --- a/clang/lib/Sema/OpenCLBuiltins.td +++ b/clang/lib/Sema/OpenCLBuiltins.td @@ -60,10 +60,11 @@ def FuncExtKhrLocalInt32ExtendedAtomics : FunctionExtension<"cl_khr_local_int32 def FuncExtKhrInt64BaseAtomics : FunctionExtension<"cl_khr_int64_base_atomics">; def FuncExtKhrInt64ExtendedAtomics : FunctionExtension<"cl_khr_int64_extended_atomics">; def FuncExtKhrMipmapImage : FunctionExtension<"cl_khr_mipmap_image">; +def FuncExtKhrMipmapImageWrites : FunctionExtension<"cl_khr_mipmap_image_writes">; def FuncExtKhrGlMsaaSharing : FunctionExtension<"cl_khr_gl_msaa_sharing">; // Multiple extensions -def FuncExtKhrMipmapAndWrite3d : FunctionExtension<"cl_khr_mipmap_image cl_khr_3d_image_writes">; +def FuncExtKhrMipmapWritesAndWrite3d : FunctionExtension<"cl_khr_mipmap_image_writes cl_khr_3d_image_writes">; // Qualified Type. These map to ASTContext::QualType. class QualType { @@ -1271,6 +1272,16 @@ let Extension = FuncExtKhrMipmapImage in { } } } + // Added to section 6.13.14.5 + foreach aQual = ["RO", "WO", "RW"] in { + foreach imgTy = [Image1d, Image2d, Image3d, Image1dArray, Image2dArray, Image2dDepth, Image2dArrayDepth] in { + def : Builtin<"get_image_num_mip_levels", [Int, ImageType]>; + } + } +} + +// Write functions are enabled using a separate extension. +let Extension = FuncExtKhrMipmapImageWrites in { // Added to section 6.13.14.4. foreach aQual = ["WO"] in { foreach imgTy = [Image2d] in { @@ -1295,7 +1306,7 @@ let Extension = FuncExtKhrMipmapImage in { def : Builtin<"write_imageui", [Void, ImageType, VectorType, Int, VectorType]>; } def : Builtin<"write_imagef", [Void, ImageType, VectorType, Int, Float]>; - let Extension = FuncExtKhrMipmapAndWrite3d in { + let Extension = FuncExtKhrMipmapWritesAndWrite3d in { foreach imgTy = [Image3d] in { def : Builtin<"write_imagef", [Void, ImageType, VectorType, Int, VectorType]>; def : Builtin<"write_imagei", [Void, ImageType, VectorType, Int, VectorType]>; @@ -1303,15 +1314,8 @@ let Extension = FuncExtKhrMipmapImage in { } } } - // Added to section 6.13.14.5 - foreach aQual = ["RO", "WO", "RW"] in { - foreach imgTy = [Image1d, Image2d, Image3d, Image1dArray, Image2dArray, Image2dDepth, Image2dArrayDepth] in { - def : Builtin<"get_image_num_mip_levels", [Int, ImageType]>; - } - } } - //-------------------------------------------------------------------- // OpenCL Extension v2.0 s18.3 - Creating OpenCL Memory Objects from OpenGL MSAA Textures let Extension = FuncExtKhrGlMsaaSharing in { From 3627c91ead934486fdb3986b911482a78f101309 Mon Sep 17 00:00:00 2001 From: Momchil Velikov Date: Wed, 5 Feb 2020 15:19:03 +0000 Subject: [PATCH 2/2] [ARM][TargetParser] Improve handling of dependencies between target features The patch at https://reviews.llvm.org/D64048 added "negative" dependency handling in `ARM::appendArchExtFeatures`: feature "noX" removes all features, which imply "X". This patch adds the "positive" handling: feature "X" adds all the feature strings implied by "X". (This patch also comes from the suggestion here https://reviews.llvm.org/D72633#inline-658582) Differential Revision: https://reviews.llvm.org/D72762 --- clang/lib/Basic/Targets/ARM.cpp | 2 -- clang/test/Driver/arm-mfpu.c | 4 +++- clang/test/Preprocessor/arm-target-features.c | 12 ++++++++--- llvm/lib/Support/ARMTargetParser.cpp | 11 ++++++---- llvm/unittests/Support/TargetParserTest.cpp | 21 +++++++++++++++++++ 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index c6f661fdec99c..02144c6ebe858 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -480,10 +480,8 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector &Features, } else if (Feature == "+dotprod") { DotProd = true; } else if (Feature == "+mve") { - DSP = 1; MVE |= MVE_INT; } else if (Feature == "+mve.fp") { - DSP = 1; HasLegalHalfType = true; FPU |= FPARMV8; MVE |= MVE_INT | MVE_FP; diff --git a/clang/test/Driver/arm-mfpu.c b/clang/test/Driver/arm-mfpu.c index c3731fa5bd635..5309977d0f908 100644 --- a/clang/test/Driver/arm-mfpu.c +++ b/clang/test/Driver/arm-mfpu.c @@ -414,12 +414,14 @@ // CHECK-MVEFP-FPUNONE-DAG: "-target-feature" "-d32" // CHECK-MVEFP-FPUNONE-DAG: "-target-feature" "-neon" // CHECK-MVEFP-FPUNONE-DAG: "-target-feature" "-crypto" +// CHECK-MVEFP-FPUNONE-DAG: "-target-feature" "+mve" +// CHECK-MVEFP-FPUNONE-DAG: "-target-feature" "+dsp" // CHECK-MVEFP-FPUNONE-DAG: "-target-feature" "-mve.fp" // CHECK-MVEFP-FPUNONE-NOT: "-target-feature" "-fpregs" - // RUN: %clang -target arm-none-none-eabi %s -march=armv8.1-m.main+mve -mfpu=none -### -c 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-MVEI-FPUNONE %s // CHECK-MVEI-FPUNONE-DAG: "-target-feature" "-mve.fp" // CHECK-MVEI-FPUNONE-DAG: "-target-feature" "+mve" +// CHECK-MVEI-FPUNONE-DAG: "-target-feature" "+dsp" // CHECK-MVEI-FPUNONE-NOT: "-target-feature" "-fpregs" diff --git a/clang/test/Preprocessor/arm-target-features.c b/clang/test/Preprocessor/arm-target-features.c index 3d80a1bd88cf6..72b77b6124fed 100644 --- a/clang/test/Preprocessor/arm-target-features.c +++ b/clang/test/Preprocessor/arm-target-features.c @@ -761,9 +761,10 @@ // CHECK-V81M-MVEFP: #define __ARM_FEATURE_SIMD32 1 // CHECK-V81M-MVEFP: #define __ARM_FPV5__ 1 -// nofp discards mve.fp +// nofp discards mve.fp, but not mve/dsp // RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve.fp+nofp -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M-MVEFP-NOFP %s -// CHECK-V81M-MVEFP-NOFP-NOT: #define __ARM_FEATURE_MVE +// CHECK-V81M-MVEFP-NOFP: #define __ARM_FEATURE_DSP 1 +// CHECK-V81M-MVEFP-NOFP: #define __ARM_FEATURE_MVE 1 // nomve discards mve.fp // RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve.fp+nomve -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M-MVEFP-NOMVE %s @@ -773,11 +774,16 @@ // RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve+fp -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M-MVE-FP %s // CHECK-V81M-MVE-FP: #define __ARM_FEATURE_MVE 1 -// nodsp discards both dsp and mve +// nodsp discards both dsp and mve ... // RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve+nodsp -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M-MVE-NODSP %s // CHECK-V81M-MVE-NODSP-NOT: #define __ARM_FEATURE_MVE // CHECK-V81M-MVE-NODSP-NOT: #define __ARM_FEATURE_DSP +// ... and also mve.fp +// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve.fp+nodsp -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M-MVE-NODSP %s +// CHECK-V81M-MVE-NODSP-NOT: #define __ARM_FEATURE_MVE +// CHECK-V81M-MVE-NODSP-NOT: #define __ARM_FEATURE_DSP + // RUN: %clang -target armv8.1a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81A %s // CHECK-V81A: #define __ARM_ARCH 8 // CHECK-V81A: #define __ARM_ARCH_8_1A__ 1 diff --git a/llvm/lib/Support/ARMTargetParser.cpp b/llvm/lib/Support/ARMTargetParser.cpp index 360e64a5a5f45..3c3c2103a5c13 100644 --- a/llvm/lib/Support/ARMTargetParser.cpp +++ b/llvm/lib/Support/ARMTargetParser.cpp @@ -498,10 +498,13 @@ bool ARM::appendArchExtFeatures( return false; for (const auto AE : ARCHExtNames) { - if (Negated && (AE.ID & ID) == ID && AE.NegFeature) - Features.push_back(AE.NegFeature); - else if (AE.ID == ID && AE.Feature) - Features.push_back(AE.Feature); + if (Negated) { + if ((AE.ID & ID) == ID && AE.NegFeature) + Features.push_back(AE.NegFeature); + } else { + if ((AE.ID & ID) == AE.ID && AE.Feature) + Features.push_back(AE.Feature); + } } if (CPU == "") diff --git a/llvm/unittests/Support/TargetParserTest.cpp b/llvm/unittests/Support/TargetParserTest.cpp index dbdaedd3892d1..9349f76701462 100644 --- a/llvm/unittests/Support/TargetParserTest.cpp +++ b/llvm/unittests/Support/TargetParserTest.cpp @@ -637,6 +637,27 @@ TEST(TargetParserTest, ARMArchExtFeature) { } } +static bool +testArchExtDependency(const char *ArchExt, + const std::initializer_list &Expected) { + std::vector Features; + + if (!ARM::appendArchExtFeatures("", ARM::ArchKind::ARMV8_1MMainline, ArchExt, + Features)) + return false; + + return llvm::all_of(Expected, [&](StringRef Ext) { + return llvm::is_contained(Features, Ext); + }); +} + +TEST(TargetParserTest, ARMArchExtDependencies) { + EXPECT_TRUE(testArchExtDependency("mve", {"+mve", "+dsp"})); + EXPECT_TRUE(testArchExtDependency("mve.fp", {"+mve.fp", "+mve", "+dsp"})); + EXPECT_TRUE(testArchExtDependency("nodsp", {"-dsp", "-mve", "-mve.fp"})); + EXPECT_TRUE(testArchExtDependency("nomve", {"-mve", "-mve.fp"})); +} + TEST(TargetParserTest, ARMparseHWDiv) { const char *hwdiv[] = {"thumb", "arm", "arm,thumb", "thumb,arm"};