brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · dc8bc4b Raw
143 lines · plain
1// Tablegen tests for the verification of clause-based OpenMP dialect operation2// definitions.3 4// Run tablegen to generate OmpCommon.td in temp directory first.5// RUN: mkdir -p %t/mlir/Dialect/OpenMP6// RUN: mlir-tblgen --gen-directive-decl --directives-dialect=OpenMP \7// RUN:   %S/../../../llvm/include/llvm/Frontend/OpenMP/OMP.td \8// RUN:   -I %S/../../../llvm/include > %t/mlir/Dialect/OpenMP/OmpCommon.td9 10// RUN: not mlir-tblgen -verify-openmp-ops -I %S/../../include -I %t %s 2>&1 | FileCheck %s11 12include "mlir/Dialect/OpenMP/OpenMPOpBase.td"13 14 15def OpenMP_SimpleClause : OpenMP_Clause<16    /*traits=*/false, /*arguments=*/false, /*assemblyFormat=*/false,17    /*description=*/false, /*extraClassDeclaration=*/false> {18  let arguments = (ins I32:$val1);19  let reqAssemblyFormat = "`val1` `(` $val1 `)`";20  let description = "Simple clause description.";21  let extraClassDeclaration = "void simpleClauseExtraClassDecl();";22}23 24 25// -----------------------------------------------------------------------------26// Verify errors / warnings for overriding each field.27// -----------------------------------------------------------------------------28 29def 1OverrideArgsOp : OpenMP_Op<"op", clauses=[OpenMP_SimpleClause]> {30  let description = "Description of operation." # clausesDescription;31  dag arguments = (ins I32:$myval);32}33// CHECK: warning: 'Simple' clause-defined argument 'I32:$val1' not present in operation.34// CHECK-SAME: Consider `dag arguments = !con(clausesArgs, ...)` or explicitly skipping this field.35// CHECK-NEXT: def 1OverrideArgsOp36 37def 2OverrideAssemblyFormatOp : OpenMP_Op<"op", clauses=[OpenMP_SimpleClause]> {38  let description = "Description of operation." # clausesDescription;39  string assemblyFormat = "`alt_repr` `(` $val1 `)`";40}41// CHECK: warning: 'Simple' clause-defined `reqAssemblyFormat` not present in operation.42// CHECK-SAME: Consider concatenating `clauses[{Req,Opt}]AssemblyFormat` or explicitly skipping this field.43// CHECK-NEXT: def 2OverrideAssemblyFormatOp44 45def 3OverrideDescriptionOp : OpenMP_Op<"op", clauses=[OpenMP_SimpleClause]> {46  let description = "Description of operation.";47}48// CHECK: error: 'Simple' clause-defined `description` not present in operation.49// CHECK-SAME: Consider concatenating `clausesDescription` or explicitly skipping this field.50// CHECK-NEXT: def 3OverrideDescriptionOp51 52def 4OverrideExtraClassDeclarationOp : OpenMP_Op<"op", clauses=[OpenMP_SimpleClause]> {53  let description = "Description of operation." # clausesDescription;54  string extraClassDeclaration = "";55}56// CHECK: warning: 'Simple' clause-defined `extraClassDeclaration` not present in operation.57// CHECK-SAME: Consider concatenating `clausesExtraClassDeclaration` or explicitly skipping this field.58// CHECK-NEXT: def 4OverrideExtraClassDeclarationOp59 60 61// -----------------------------------------------------------------------------62// Verify that reporting is correct when OpenMP_Clause is inherited indirectly.63// -----------------------------------------------------------------------------64 65class OpenMP_IndirectClauseSkip<66    bit traits = false, bit arguments = false, bit assemblyFormat = false,67    bit description = false, bit extraClassDeclaration = false68  > : OpenMP_Clause<traits, arguments, assemblyFormat, description,69                    extraClassDeclaration> {70  let arguments = (ins I32:$val2);71  let reqAssemblyFormat = "`val2` `(` $val2 `)`";72  let description = "Indirectly-inherited clause description.";73  let extraClassDeclaration = "void indirectClauseExtraClassDecl();";74}75 76def IndirectClause : OpenMP_IndirectClauseSkip<>;77 78def 5IndirectClauseOp : OpenMP_Op<"op", clauses=[IndirectClause]> {79  let description = "Description of operation." # clausesDescription;80  dag arguments = (ins I32:$myval);81}82// CHECK: warning: 'Indirect' clause-defined argument 'I32:$val2' not present in operation.83// CHECK-NEXT: def 5IndirectClauseOp84 85 86// -----------------------------------------------------------------------------87// Verify that multiple clauses are taken into account.88// -----------------------------------------------------------------------------89 90def 6MultiClauseOp : OpenMP_Op<"op", clauses=[OpenMP_SimpleClause, IndirectClause]> {91  let description = "Description of operation." # clausesDescription;92  let arguments = (ins I32:$val1);93  let assemblyFormat = "`val2` `(` $val2 `)`";94}95// CHECK: warning: 'Simple' clause-defined `reqAssemblyFormat` not present in operation.96// CHECK-NEXT: def 6MultiClauseOp97// CHECK: warning: 'Indirect' clause-defined argument 'I32:$val2' not present in operation.98// CHECK-NEXT: def 6MultiClauseOp99 100 101// -----------------------------------------------------------------------------102// Verify that reporting is correct when clause definitions have other103// superclasses in addition to OpenMP_Clause.104// -----------------------------------------------------------------------------105 106class Placeholder {}107def MultiSuperClassClause : Placeholder, OpenMP_IndirectClauseSkip<>;108 109def 7MultiSuperClassClauseOp : OpenMP_Op<"op", clauses=[IndirectClause]> {110  let description = "Description of operation." # clausesDescription;111  dag arguments = (ins I32:$myval);112}113// CHECK: warning: 'Indirect' clause-defined argument 'I32:$val2' not present in operation.114// CHECK-NEXT: def 7MultiSuperClassClauseOp115 116 117// -----------------------------------------------------------------------------118// Verify that no errors are produced if the field being overriden is also119// skipped for the clause.120// -----------------------------------------------------------------------------121 122def SkipArgsOp : OpenMP_Op<"op",123    clauses=[OpenMP_IndirectClauseSkip<arguments=true>]> {124  let description = "Description of operation." # clausesDescription;125  dag arguments = (ins I32:$myval);126}127def SkipAssemblyFormatOp : OpenMP_Op<"op",128    clauses=[OpenMP_IndirectClauseSkip<assemblyFormat=true>]> {129  let description = "Description of operation." # clausesDescription;130  string assemblyFormat = "`alt_repr` `(` $val1 `)`";131}132def SkipDescriptionOp : OpenMP_Op<"op",133    clauses=[OpenMP_IndirectClauseSkip<description=true>]> {134  let description = "Description of operation.";135}136def SkipExtraClassDeclarationOp : OpenMP_Op<"op",137    clauses=[OpenMP_IndirectClauseSkip<extraClassDeclaration=true>]> {138  let description = "Description of operation." # clausesDescription;139  string extraClassDeclaration = "";140}141// CHECK-NOT: error:142// CHECK-NOT: warning:143