Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions mlir/lib/Tools/PDLL/Parser/Parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -899,10 +899,11 @@ LogicalResult Parser::convertTupleExpressionTo(
// Handle conversion to a range.
auto convertToRange = [&](ArrayRef<ast::Type> allowedElementTypes,
ast::RangeType resultTy) -> LogicalResult {
// TODO: We currently only allow range conversion within a rewrite context.
if (parserContext != ParserContext::Rewrite) {
return emitErrorFn()->attachNote("Tuple to Range conversion is currently "
"only allowed within a rewrite context");
if (parserContext != ParserContext::Rewrite &&
parserContext != ParserContext::Constraint) {
return emitErrorFn()->attachNote(
"Tuple to Range conversion is currently only allowed within a "
"rewrite or constraint context");
}

// All of the tuple elements must be allowed types.
Expand Down
66 changes: 66 additions & 0 deletions mlir/test/mlir-pdll/Parser/constraint.pdll
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,69 @@ Constraint Outer() {
Constraint() {};
Constraint() => attr<"10">;
}

// -----

//===----------------------------------------------------------------------===//
// ValueRange creation inside a Constraint body
//===----------------------------------------------------------------------===//

// Test building a ValueRange from individual Values via a let statement inside
// a Constraint body.

// CHECK: Module
// CHECK: `-UserConstraintDecl {{.*}} Name<Foo> ResultType<ValueRange>
// CHECK: `Inputs`
// CHECK: |-VariableDecl {{.*}} Name<v1> Type<Value>
// CHECK: `-VariableDecl {{.*}} Name<v2> Type<Value>
// CHECK: `Results`
// CHECK: `-VariableDecl {{.*}} Name<> Type<ValueRange>
// CHECK: `-CompoundStmt {{.*}}
// CHECK: |-LetStmt
// CHECK: | `-VariableDecl {{.*}} Name<r> Type<ValueRange>
// CHECK: | `-RangeExpr {{.*}} Type<ValueRange>
// CHECK: | |-MemberAccessExpr {{.*}} Member<0> Type<Value>
// CHECK: | `-MemberAccessExpr {{.*}} Member<1> Type<Value>
// CHECK: `-ReturnStmt
// CHECK: `-DeclRefExpr {{.*}} Type<ValueRange>
// CHECK: `-VariableDecl {{.*}} Name<r> Type<ValueRange>
Constraint Foo(v1: Value, v2: Value) -> ValueRange {
let r: ValueRange = (v1, v2);
return r;
}

// -----

// Test building a ValueRange from a mix of Value and ValueRange arguments.

// CHECK: Module
// CHECK: `-UserConstraintDecl {{.*}} Name<Foo> ResultType<ValueRange>
// CHECK: `Inputs`
// CHECK: |-VariableDecl {{.*}} Name<v> Type<Value>
// CHECK: `-VariableDecl {{.*}} Name<vr> Type<ValueRange>
// CHECK: `Results`
// CHECK: `-VariableDecl {{.*}} Name<> Type<ValueRange>
// CHECK: `-CompoundStmt {{.*}}
// CHECK: `-ReturnStmt
// CHECK: `-RangeExpr {{.*}} Type<ValueRange>
// CHECK: |-MemberAccessExpr {{.*}} Member<0> Type<Value>
// CHECK: `-MemberAccessExpr {{.*}} Member<1> Type<ValueRange>
Constraint Foo(v: Value, vr: ValueRange) -> ValueRange => (v, vr);

// -----

// Test building a TypeRange from individual Types inside a Constraint body.

// CHECK: Module
// CHECK: `-UserConstraintDecl {{.*}} Name<Foo> ResultType<TypeRange>
// CHECK: `Inputs`
// CHECK: |-VariableDecl {{.*}} Name<t1> Type<Type>
// CHECK: `-VariableDecl {{.*}} Name<t2> Type<Type>
// CHECK: `Results`
// CHECK: `-VariableDecl {{.*}} Name<> Type<TypeRange>
// CHECK: `-CompoundStmt {{.*}}
// CHECK: `-ReturnStmt
// CHECK: `-RangeExpr {{.*}} Type<TypeRange>
// CHECK: |-MemberAccessExpr {{.*}} Member<0> Type<Type>
// CHECK: `-MemberAccessExpr {{.*}} Member<1> Type<Type>
Constraint Foo(t1: Type, t2: Type) -> TypeRange => (t1, t2);
2 changes: 1 addition & 1 deletion mlir/test/mlir-pdll/Parser/expr-failure.pdll
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ Pattern ConstraintArrayAttrWithAttrAndValue {

Pattern {
// CHECK: unable to convert expression of type `Tuple<>` to the expected type of `ValueRange`
// CHECK: Tuple to Range conversion is currently only allowed within a rewrite context
// CHECK: Tuple to Range conversion is currently only allowed within a rewrite or constraint context
erase op<>(());
}

Expand Down
Loading