From 0c8bf1e2bfb7b435f3a223661f52eacb5a77c325 Mon Sep 17 00:00:00 2001 From: Yaxun Liu Date: Tue, 19 Jul 2016 19:39:45 +0000 Subject: [PATCH] [OpenCL] Fixes bug of missing OCL version metadata on the AMDGCN target Added the opencl.ocl.version metadata to be emitted with amdgcn. Created a static function emitOCLVerMD which is shared between triple spir and target amdgcn. Also added new testcases to existing test file, spir_version.cl inside test/CodeGenOpenCL. Patch by Aaron En Ye Shi. Differential Revision: https://reviews.llvm.org/D22424 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@276010 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/TargetInfo.cpp | 13 ++++++++- test/CodeGenOpenCL/spir_version.cl | 47 +++++++++++++++++++----------- 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index aa67e71284..0777779e13 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -6836,6 +6836,8 @@ public: } +static void appendOpenCLVersionMD (CodeGen::CodeGenModule &CGM); + void AMDGPUTargetCodeGenInfo::setTargetAttributes( const Decl *D, llvm::GlobalValue *GV, @@ -6857,8 +6859,10 @@ void AMDGPUTargetCodeGenInfo::setTargetAttributes( if (NumSGPR != 0) F->addFnAttr("amdgpu_num_sgpr", llvm::utostr(NumSGPR)); } -} + appendOpenCLVersionMD(M); +} + unsigned AMDGPUTargetCodeGenInfo::getOpenCLKernelCallingConv() const { return llvm::CallingConv::AMDGPU_KERNEL; @@ -7530,6 +7534,13 @@ void SPIRTargetCodeGenInfo::emitTargetMD(const Decl *D, llvm::GlobalValue *GV, llvm::NamedMDNode *SPIRVerMD = M.getOrInsertNamedMetadata("opencl.spir.version"); SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts)); + appendOpenCLVersionMD(CGM); +} + +static void appendOpenCLVersionMD (CodeGen::CodeGenModule &CGM) { + llvm::LLVMContext &Ctx = CGM.getModule().getContext(); + llvm::Type *Int32Ty = llvm::Type::getInt32Ty(Ctx); + llvm::Module &M = CGM.getModule(); // SPIR v2.0 s2.13 - The OpenCL version used by the module is stored in the // opencl.ocl.version named metadata node. llvm::Metadata *OCLVerElts[] = { diff --git a/test/CodeGenOpenCL/spir_version.cl b/test/CodeGenOpenCL/spir_version.cl index 215b4d7a40..54c851a4ba 100644 --- a/test/CodeGenOpenCL/spir_version.cl +++ b/test/CodeGenOpenCL/spir_version.cl @@ -1,18 +1,31 @@ -// RUN: %clang_cc1 %s -triple "spir-unknown-unknown" -emit-llvm -o - | FileCheck %s --check-prefix=CL10 -// RUN: %clang_cc1 %s -triple "spir-unknown-unknown" -emit-llvm -o - -cl-std=CL1.2 | FileCheck %s --check-prefix=CL12 -// RUN: %clang_cc1 %s -triple "spir-unknown-unknown" -emit-llvm -o - -cl-std=CL2.0 | FileCheck %s --check-prefix=CL20 -// RUN: %clang_cc1 %s -triple "spir64-unknown-unknown" -emit-llvm -o - | FileCheck %s --check-prefix=CL10 -// RUN: %clang_cc1 %s -triple "spir64-unknown-unknown" -emit-llvm -o - -cl-std=CL1.2 | FileCheck %s --check-prefix=CL12 -// RUN: %clang_cc1 %s -triple "spir64-unknown-unknown" -emit-llvm -o - -cl-std=CL2.0 | FileCheck %s --check-prefix=CL20 +// RUN: %clang_cc1 %s -triple "spir-unknown-unknown" -emit-llvm -o - | FileCheck %s --check-prefix=CHECK-SPIR-CL10 +// RUN: %clang_cc1 %s -triple "spir-unknown-unknown" -emit-llvm -o - -cl-std=CL1.2 | FileCheck %s --check-prefix=CHECK-SPIR-CL12 +// RUN: %clang_cc1 %s -triple "spir-unknown-unknown" -emit-llvm -o - -cl-std=CL2.0 | FileCheck %s --check-prefix=CHECK-SPIR-CL20 +// RUN: %clang_cc1 %s -triple "spir64-unknown-unknown" -emit-llvm -o - | FileCheck %s --check-prefix=CHECK-SPIR-CL10 +// RUN: %clang_cc1 %s -triple "spir64-unknown-unknown" -emit-llvm -o - -cl-std=CL1.2 | FileCheck %s --check-prefix=CHECK-SPIR-CL12 +// RUN: %clang_cc1 %s -triple "spir64-unknown-unknown" -emit-llvm -o - -cl-std=CL2.0 | FileCheck %s --check-prefix=CHECK-SPIR-CL20 + +// RUN: %clang_cc1 %s -triple "amdgcn--amdhsa" -emit-llvm -o - | FileCheck %s --check-prefix=CHECK-AMDGCN-CL10 +// RUN: %clang_cc1 %s -triple "amdgcn--amdhsa" -emit-llvm -o - -cl-std=CL1.2 | FileCheck %s --check-prefix=CHECK-AMDGCN-CL12 +// RUN: %clang_cc1 %s -triple "amdgcn--amdhsa" -emit-llvm -o - -cl-std=CL2.0 | FileCheck %s --check-prefix=CHECK-AMDGCN-CL20 + kernel void foo() {} -// CL10: !opencl.spir.version = !{[[SPIR:![0-9]+]]} -// CL10: !opencl.ocl.version = !{[[OCL:![0-9]+]]} -// CL10: [[SPIR]] = !{i32 2, i32 0} -// CL10: [[OCL]] = !{i32 1, i32 0} -// CL12: !opencl.spir.version = !{[[SPIR:![0-9]+]]} -// CL12: !opencl.ocl.version = !{[[OCL:![0-9]+]]} -// CL12: [[SPIR]] = !{i32 2, i32 0} -// CL12: [[OCL]] = !{i32 1, i32 2} -// CL20: !opencl.spir.version = !{[[SPIR:![0-9]+]]} -// CL20: !opencl.ocl.version = !{[[SPIR:![0-9]+]]} -// CL20: [[SPIR]] = !{i32 2, i32 0} + +// CHECK-SPIR-CL10: !opencl.spir.version = !{[[SPIR:![0-9]+]]} +// CHECK-SPIR-CL10: !opencl.ocl.version = !{[[OCL:![0-9]+]]} +// CHECK-SPIR-CL10: [[SPIR]] = !{i32 2, i32 0} +// CHECK-SPIR-CL10: [[OCL]] = !{i32 1, i32 0} +// CHECK-SPIR-CL12: !opencl.spir.version = !{[[SPIR:![0-9]+]]} +// CHECK-SPIR-CL12: !opencl.ocl.version = !{[[OCL:![0-9]+]]} +// CHECK-SPIR-CL12: [[SPIR]] = !{i32 2, i32 0} +// CHECK-SPIR-CL12: [[OCL]] = !{i32 1, i32 2} +// CHECK-SPIR-CL20: !opencl.spir.version = !{[[SPIR:![0-9]+]]} +// CHECK-SPIR-CL20: !opencl.ocl.version = !{[[SPIR:![0-9]+]]} +// CHECK-SPIR-CL20: [[SPIR]] = !{i32 2, i32 0} + +// CHECK-AMDGCN-CL10: !opencl.ocl.version = !{[[OCL:![0-9]+]]} +// CHECK-AMDGCN-CL10: [[OCL]] = !{i32 1, i32 0} +// CHECK-AMDGCN-CL12: !opencl.ocl.version = !{[[OCL:![0-9]+]]} +// CHECK-AMDGCN-CL12: [[OCL]] = !{i32 1, i32 2} +// CHECK-AMDGCN-CL20: !opencl.ocl.version = !{[[OCL:![0-9]+]]} +// CHECK-AMDGCN-CL20: [[OCL]] = !{i32 2, i32 0} \ No newline at end of file -- 2.40.0