File: openmp-ops-verify.td

package info (click to toggle)
swiftlang 6.1.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,791,604 kB
  • sloc: cpp: 9,901,740; ansic: 2,201,431; asm: 1,091,827; python: 308,252; objc: 82,166; f90: 80,126; lisp: 38,358; pascal: 25,559; sh: 20,429; ml: 5,058; perl: 4,745; makefile: 4,484; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (143 lines) | stat: -rw-r--r-- 6,461 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Tablegen tests for the verification of clause-based OpenMP dialect operation
// definitions.

// Run tablegen to generate OmpCommon.td in temp directory first.
// RUN: mkdir -p %t/mlir/Dialect/OpenMP
// RUN: mlir-tblgen --gen-directive-decl --directives-dialect=OpenMP \
// RUN:   %S/../../../llvm/include/llvm/Frontend/OpenMP/OMP.td \
// RUN:   -I %S/../../../llvm/include > %t/mlir/Dialect/OpenMP/OmpCommon.td

// RUN: not mlir-tblgen -verify-openmp-ops -I %S/../../include -I %t %s 2>&1 | FileCheck %s

include "mlir/Dialect/OpenMP/OpenMPOpBase.td"


def OpenMP_SimpleClause : OpenMP_Clause<
    /*isRequired=*/true, /*traits=*/false, /*arguments=*/false,
    /*assemblyFormat=*/false, /*description=*/false,
    /*extraClassDeclaration=*/false> {
  let arguments = (ins I32:$val1);
  let assemblyFormat = "`val1` `(` $val1 `)`";
  let description = "Simple clause description.";
  let extraClassDeclaration = "void simpleClauseExtraClassDecl();";
}


// -----------------------------------------------------------------------------
// Verify errors / warnings for overriding each field.
// -----------------------------------------------------------------------------

def 1OverrideArgsOp : OpenMP_Op<"op", clauses=[OpenMP_SimpleClause]> {
  let description = "Description of operation." # clausesDescription;
  dag arguments = (ins I32:$myval);
}
// CHECK: warning: 'Simple' clause-defined argument 'I32:$val1' not present in operation.
// CHECK-SAME: Consider `dag arguments = !con(clausesArgs, ...)` or explicitly skipping this field.
// CHECK-NEXT: def 1OverrideArgsOp

def 2OverrideAssemblyFormatOp : OpenMP_Op<"op", clauses=[OpenMP_SimpleClause]> {
  let description = "Description of operation." # clausesDescription;
  string assemblyFormat = "`alt_repr` `(` $val1 `)`";
}
// CHECK: warning: 'Simple' clause-defined `assemblyFormat` not present in operation.
// CHECK-SAME: Consider concatenating `clausesAssemblyFormat` or explicitly skipping this field.
// CHECK-NEXT: def 2OverrideAssemblyFormatOp

def 3OverrideDescriptionOp : OpenMP_Op<"op", clauses=[OpenMP_SimpleClause]> {
  let description = "Description of operation.";
}
// CHECK: error: 'Simple' clause-defined `description` not present in operation.
// CHECK-SAME: Consider concatenating `clausesDescription` or explicitly skipping this field.
// CHECK-NEXT: def 3OverrideDescriptionOp

def 4OverrideExtraClassDeclarationOp : OpenMP_Op<"op", clauses=[OpenMP_SimpleClause]> {
  let description = "Description of operation." # clausesDescription;
  string extraClassDeclaration = "";
}
// CHECK: warning: 'Simple' clause-defined `extraClassDeclaration` not present in operation.
// CHECK-SAME: Consider concatenating `clausesExtraClassDeclaration` or explicitly skipping this field.
// CHECK-NEXT: def 4OverrideExtraClassDeclarationOp


// -----------------------------------------------------------------------------
// Verify that reporting is correct when OpenMP_Clause is inherited indirectly.
// -----------------------------------------------------------------------------

class OpenMP_IndirectClauseSkip<
    bit traits = false, bit arguments = false, bit assemblyFormat = false,
    bit description = false, bit extraClassDeclaration = false
  > : OpenMP_Clause</*isRequired=*/true, traits, arguments, assemblyFormat,
                    description, extraClassDeclaration> {
  let arguments = (ins I32:$val2);
  let assemblyFormat = "`val2` `(` $val2 `)`";
  let description = "Indirectly-inherited clause description.";
  let extraClassDeclaration = "void indirectClauseExtraClassDecl();";
}

def IndirectClause : OpenMP_IndirectClauseSkip<>;

def 5IndirectClauseOp : OpenMP_Op<"op", clauses=[IndirectClause]> {
  let description = "Description of operation." # clausesDescription;
  dag arguments = (ins I32:$myval);
}
// CHECK: warning: 'Indirect' clause-defined argument 'I32:$val2' not present in operation.
// CHECK-NEXT: def 5IndirectClauseOp


// -----------------------------------------------------------------------------
// Verify that multiple clauses are taken into account.
// -----------------------------------------------------------------------------

def 6MultiClauseOp : OpenMP_Op<"op", clauses=[OpenMP_SimpleClause, IndirectClause]> {
  let description = "Description of operation." # clausesDescription;
  let arguments = (ins I32:$val1);
  let assemblyFormat = "`val2` `(` $val2 `)`";
}
// CHECK: warning: 'Simple' clause-defined `assemblyFormat` not present in operation.
// CHECK-NEXT: def 6MultiClauseOp
// CHECK: warning: 'Indirect' clause-defined argument 'I32:$val2' not present in operation.
// CHECK-NEXT: def 6MultiClauseOp


// -----------------------------------------------------------------------------
// Verify that reporting is correct when clause definitions have other
// superclasses in addition to OpenMP_Clause.
// -----------------------------------------------------------------------------

class Placeholder {}
def MultiSuperClassClause : Placeholder, OpenMP_IndirectClauseSkip<>;

def 7MultiSuperClassClauseOp : OpenMP_Op<"op", clauses=[IndirectClause]> {
  let description = "Description of operation." # clausesDescription;
  dag arguments = (ins I32:$myval);
}
// CHECK: warning: 'Indirect' clause-defined argument 'I32:$val2' not present in operation.
// CHECK-NEXT: def 7MultiSuperClassClauseOp


// -----------------------------------------------------------------------------
// Verify that no errors are produced if the field being overriden is also
// skipped for the clause.
// -----------------------------------------------------------------------------

def SkipArgsOp : OpenMP_Op<"op",
    clauses=[OpenMP_IndirectClauseSkip<arguments=true>]> {
  let description = "Description of operation." # clausesDescription;
  dag arguments = (ins I32:$myval);
}
def SkipAssemblyFormatOp : OpenMP_Op<"op",
    clauses=[OpenMP_IndirectClauseSkip<assemblyFormat=true>]> {
  let description = "Description of operation." # clausesDescription;
  string assemblyFormat = "`alt_repr` `(` $val1 `)`";
}
def SkipDescriptionOp : OpenMP_Op<"op",
    clauses=[OpenMP_IndirectClauseSkip<description=true>]> {
  let description = "Description of operation.";
}
def SkipExtraClassDeclarationOp : OpenMP_Op<"op",
    clauses=[OpenMP_IndirectClauseSkip<extraClassDeclaration=true>]> {
  let description = "Description of operation." # clausesDescription;
  string extraClassDeclaration = "";
}
// CHECK-NOT: error:
// CHECK-NOT: warning: