[PATCH] D34235: [OpenCL] Fix OpenCL and SPIR version metadata generation.
Anastasia accepted this revision. Anastasia added a comment. This revision is now accepted and ready to land. LGTM! Thanks! https://reviews.llvm.org/D34235 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34235: [OpenCL] Fix OpenCL and SPIR version metadata generation.
bader added inline comments. Comment at: test/CodeGenOpenCL/spir_version.cl:13 kernel void foo() {} +kernel void bar() {} Anastasia wrote: > Would the original code produce duplicate version metadata here or is it just > for overloaded functions? Would it make sense to add `CHECK-NOT` to make sure > they are not generated twice? The original code will duplicate the metadata here. Something like: ``` !opencl.ocl.version = !{!0, !0} ``` One per global value - function in case. Existing check is already good enough as it checks exactly for one metadata: ``` // CHECK-SPIR-CL10-DAG: !opencl.ocl.version = !{[[OCL:![0-9]+]]} ``` It was passing with buggy code, since test contains exactly one function (i.e. global value). Now we have two global values and fix is required to pass existing check. https://reviews.llvm.org/D34235 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34235: [OpenCL] Fix OpenCL and SPIR version metadata generation.
Anastasia added inline comments. Comment at: test/CodeGenOpenCL/spir_version.cl:13 kernel void foo() {} +kernel void bar() {} Would the original code produce duplicate version metadata here or is it just for overloaded functions? Would it make sense to add `CHECK-NOT` to make sure they are not generated twice? https://reviews.llvm.org/D34235 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34235: [OpenCL] Fix OpenCL and SPIR version metadata generation.
bader updated this revision to Diff 102789. bader added a comment. Applied Akira's comment: re-used cached Int32Ty type. https://reviews.llvm.org/D34235 Files: lib/CodeGen/CodeGenModule.cpp lib/CodeGen/CodeGenModule.h lib/CodeGen/TargetInfo.cpp test/CodeGenOpenCL/spir_version.cl Index: test/CodeGenOpenCL/spir_version.cl === --- test/CodeGenOpenCL/spir_version.cl +++ test/CodeGenOpenCL/spir_version.cl @@ -10,17 +10,18 @@ // RUN: %clang_cc1 %s -triple "amdgcn--amdhsa" -emit-llvm -o - -cl-std=CL2.0 | FileCheck %s --check-prefix=CHECK-AMDGCN-CL20 kernel void foo() {} +kernel void bar() {} -// CHECK-SPIR-CL10: !opencl.spir.version = !{[[SPIR:![0-9]+]]} -// CHECK-SPIR-CL10: !opencl.ocl.version = !{[[OCL:![0-9]+]]} -// CHECK-SPIR-CL10: [[SPIR]] = !{i32 1, i32 2} -// CHECK-SPIR-CL10: [[OCL]] = !{i32 1, i32 0} -// CHECK-SPIR-CL12: !opencl.spir.version = !{[[VER:![0-9]+]]} -// CHECK-SPIR-CL12: !opencl.ocl.version = !{[[VER]]} +// CHECK-SPIR-CL10-DAG: !opencl.spir.version = !{[[SPIR:![0-9]+]]} +// CHECK-SPIR-CL10-DAG: !opencl.ocl.version = !{[[OCL:![0-9]+]]} +// CHECK-SPIR-CL10-DAG: [[SPIR]] = !{i32 1, i32 2} +// CHECK-SPIR-CL10-DAG: [[OCL]] = !{i32 1, i32 0} +// CHECK-SPIR-CL12-DAG: !opencl.spir.version = !{[[VER:![0-9]+]]} +// CHECK-SPIR-CL12-DAG: !opencl.ocl.version = !{[[VER]]} // CHECK-SPIR-CL12: [[VER]] = !{i32 1, i32 2} -// CHECK-SPIR-CL20: !opencl.spir.version = !{[[VER:![0-9]+]]} -// CHECK-SPIR-CL20: !opencl.ocl.version = !{[[VER]]} +// CHECK-SPIR-CL20-DAG: !opencl.spir.version = !{[[VER:![0-9]+]]} +// CHECK-SPIR-CL20-DAG: !opencl.ocl.version = !{[[VER]]} // CHECK-SPIR-CL20: [[VER]] = !{i32 2, i32 0} // CHECK-AMDGCN-CL10-NOT: !opencl.spir.version Index: lib/CodeGen/TargetInfo.cpp === --- lib/CodeGen/TargetInfo.cpp +++ lib/CodeGen/TargetInfo.cpp @@ -7344,8 +7344,6 @@ }; } -static void appendOpenCLVersionMD (CodeGen::CodeGenModule ); - void AMDGPUTargetCodeGenInfo::setTargetAttributes( const Decl *D, llvm::GlobalValue *GV, @@ -7402,8 +7400,6 @@ if (NumVGPR != 0) F->addFnAttr("amdgpu-num-vgpr", llvm::utostr(NumVGPR)); } - - appendOpenCLVersionMD(M); } unsigned AMDGPUTargetCodeGenInfo::getOpenCLKernelCallingConv() const { @@ -8074,8 +8070,6 @@ public: SPIRTargetCodeGenInfo(CodeGen::CodeGenTypes ) : TargetCodeGenInfo(new DefaultABIInfo(CGT)) {} - void emitTargetMD(const Decl *D, llvm::GlobalValue *GV, -CodeGen::CodeGenModule ) const override; unsigned getOpenCLKernelCallingConv() const override; }; @@ -8090,41 +8084,6 @@ } } -/// Emit SPIR specific metadata: OpenCL and SPIR version. -void SPIRTargetCodeGenInfo::emitTargetMD(const Decl *D, llvm::GlobalValue *GV, - CodeGen::CodeGenModule ) const { - llvm::LLVMContext = CGM.getModule().getContext(); - llvm::Type *Int32Ty = llvm::Type::getInt32Ty(Ctx); - llvm::Module = CGM.getModule(); - // SPIR v2.0 s2.12 - The SPIR version used by the module is stored in the - // opencl.spir.version named metadata. - llvm::Metadata *SPIRVerElts[] = { - llvm::ConstantAsMetadata::get( - llvm::ConstantInt::get(Int32Ty, CGM.getLangOpts().OpenCLVersion / 100)), - llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( - Int32Ty, (CGM.getLangOpts().OpenCLVersion / 100 > 1) ? 0 : 2))}; - llvm::NamedMDNode *SPIRVerMD = - M.getOrInsertNamedMetadata("opencl.spir.version"); - SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts)); - appendOpenCLVersionMD(CGM); -} - -static void appendOpenCLVersionMD(CodeGen::CodeGenModule ) { - llvm::LLVMContext = CGM.getModule().getContext(); - llvm::Type *Int32Ty = llvm::Type::getInt32Ty(Ctx); - llvm::Module = 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[] = { - llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( - Int32Ty, CGM.getLangOpts().OpenCLVersion / 100)), - llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( - Int32Ty, (CGM.getLangOpts().OpenCLVersion % 100) / 10))}; - llvm::NamedMDNode *OCLVerMD = - M.getOrInsertNamedMetadata("opencl.ocl.version"); - OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts)); -} - unsigned SPIRTargetCodeGenInfo::getOpenCLKernelCallingConv() const { return llvm::CallingConv::SPIR_KERNEL; } Index: lib/CodeGen/CodeGenModule.h === --- lib/CodeGen/CodeGenModule.h +++ lib/CodeGen/CodeGenModule.h @@ -1321,6 +1321,9 @@ /// Emits target specific Metadata for global declarations. void EmitTargetMetadata(); + /// Emits OpenCL specific Metadata e.g. OpenCL version. + void EmitOpenCLMetadata(); + /// Emit the llvm.gcov metadata used to tell LLVM where to emit the .gcno
[PATCH] D34235: [OpenCL] Fix OpenCL and SPIR version metadata generation.
ahatanak added inline comments. Comment at: lib/CodeGen/CodeGenModule.cpp:516 + llvm::LLVMContext = TheModule.getContext(); + llvm::Type *Int32Ty = llvm::Type::getInt32Ty(Ctx); + // SPIR v2.0 s2.12 - The SPIR version used by the module is stored in the CodeGenTypeCache (CodeGenModule's base class) has member Int32Ty, so I don't think you need to call getInt32Ty here? https://reviews.llvm.org/D34235 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34235: [OpenCL] Fix OpenCL and SPIR version metadata generation.
yaxunl added a comment. LGTM. Thanks. https://reviews.llvm.org/D34235 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34235: [OpenCL] Fix OpenCL and SPIR version metadata generation.
bader created this revision. OpenCL and SPIR version metadata must be generated once per module instead of once per mangled global value. https://reviews.llvm.org/D34235 Files: lib/CodeGen/CodeGenModule.cpp lib/CodeGen/CodeGenModule.h lib/CodeGen/TargetInfo.cpp test/CodeGenOpenCL/spir_version.cl Index: test/CodeGenOpenCL/spir_version.cl === --- test/CodeGenOpenCL/spir_version.cl +++ test/CodeGenOpenCL/spir_version.cl @@ -10,17 +10,18 @@ // RUN: %clang_cc1 %s -triple "amdgcn--amdhsa" -emit-llvm -o - -cl-std=CL2.0 | FileCheck %s --check-prefix=CHECK-AMDGCN-CL20 kernel void foo() {} +kernel void bar() {} -// CHECK-SPIR-CL10: !opencl.spir.version = !{[[SPIR:![0-9]+]]} -// CHECK-SPIR-CL10: !opencl.ocl.version = !{[[OCL:![0-9]+]]} -// CHECK-SPIR-CL10: [[SPIR]] = !{i32 1, i32 2} -// CHECK-SPIR-CL10: [[OCL]] = !{i32 1, i32 0} -// CHECK-SPIR-CL12: !opencl.spir.version = !{[[VER:![0-9]+]]} -// CHECK-SPIR-CL12: !opencl.ocl.version = !{[[VER]]} +// CHECK-SPIR-CL10-DAG: !opencl.spir.version = !{[[SPIR:![0-9]+]]} +// CHECK-SPIR-CL10-DAG: !opencl.ocl.version = !{[[OCL:![0-9]+]]} +// CHECK-SPIR-CL10-DAG: [[SPIR]] = !{i32 1, i32 2} +// CHECK-SPIR-CL10-DAG: [[OCL]] = !{i32 1, i32 0} +// CHECK-SPIR-CL12-DAG: !opencl.spir.version = !{[[VER:![0-9]+]]} +// CHECK-SPIR-CL12-DAG: !opencl.ocl.version = !{[[VER]]} // CHECK-SPIR-CL12: [[VER]] = !{i32 1, i32 2} -// CHECK-SPIR-CL20: !opencl.spir.version = !{[[VER:![0-9]+]]} -// CHECK-SPIR-CL20: !opencl.ocl.version = !{[[VER]]} +// CHECK-SPIR-CL20-DAG: !opencl.spir.version = !{[[VER:![0-9]+]]} +// CHECK-SPIR-CL20-DAG: !opencl.ocl.version = !{[[VER]]} // CHECK-SPIR-CL20: [[VER]] = !{i32 2, i32 0} // CHECK-AMDGCN-CL10-NOT: !opencl.spir.version Index: lib/CodeGen/TargetInfo.cpp === --- lib/CodeGen/TargetInfo.cpp +++ lib/CodeGen/TargetInfo.cpp @@ -7344,8 +7344,6 @@ }; } -static void appendOpenCLVersionMD (CodeGen::CodeGenModule ); - void AMDGPUTargetCodeGenInfo::setTargetAttributes( const Decl *D, llvm::GlobalValue *GV, @@ -7402,8 +7400,6 @@ if (NumVGPR != 0) F->addFnAttr("amdgpu-num-vgpr", llvm::utostr(NumVGPR)); } - - appendOpenCLVersionMD(M); } unsigned AMDGPUTargetCodeGenInfo::getOpenCLKernelCallingConv() const { @@ -8074,8 +8070,6 @@ public: SPIRTargetCodeGenInfo(CodeGen::CodeGenTypes ) : TargetCodeGenInfo(new DefaultABIInfo(CGT)) {} - void emitTargetMD(const Decl *D, llvm::GlobalValue *GV, -CodeGen::CodeGenModule ) const override; unsigned getOpenCLKernelCallingConv() const override; }; @@ -8090,41 +8084,6 @@ } } -/// Emit SPIR specific metadata: OpenCL and SPIR version. -void SPIRTargetCodeGenInfo::emitTargetMD(const Decl *D, llvm::GlobalValue *GV, - CodeGen::CodeGenModule ) const { - llvm::LLVMContext = CGM.getModule().getContext(); - llvm::Type *Int32Ty = llvm::Type::getInt32Ty(Ctx); - llvm::Module = CGM.getModule(); - // SPIR v2.0 s2.12 - The SPIR version used by the module is stored in the - // opencl.spir.version named metadata. - llvm::Metadata *SPIRVerElts[] = { - llvm::ConstantAsMetadata::get( - llvm::ConstantInt::get(Int32Ty, CGM.getLangOpts().OpenCLVersion / 100)), - llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( - Int32Ty, (CGM.getLangOpts().OpenCLVersion / 100 > 1) ? 0 : 2))}; - llvm::NamedMDNode *SPIRVerMD = - M.getOrInsertNamedMetadata("opencl.spir.version"); - SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts)); - appendOpenCLVersionMD(CGM); -} - -static void appendOpenCLVersionMD(CodeGen::CodeGenModule ) { - llvm::LLVMContext = CGM.getModule().getContext(); - llvm::Type *Int32Ty = llvm::Type::getInt32Ty(Ctx); - llvm::Module = 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[] = { - llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( - Int32Ty, CGM.getLangOpts().OpenCLVersion / 100)), - llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( - Int32Ty, (CGM.getLangOpts().OpenCLVersion % 100) / 10))}; - llvm::NamedMDNode *OCLVerMD = - M.getOrInsertNamedMetadata("opencl.ocl.version"); - OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts)); -} - unsigned SPIRTargetCodeGenInfo::getOpenCLKernelCallingConv() const { return llvm::CallingConv::SPIR_KERNEL; } Index: lib/CodeGen/CodeGenModule.h === --- lib/CodeGen/CodeGenModule.h +++ lib/CodeGen/CodeGenModule.h @@ -1321,6 +1321,9 @@ /// Emits target specific Metadata for global declarations. void EmitTargetMetadata(); + /// Emits OpenCL specific Metadata e.g. OpenCL version. + void EmitOpenCLMetadata(); + /// Emit the llvm.gcov metadata used to tell LLVM where