// RUN: mlir-opt -split-input-file -verify-diagnostics %s func.func @missing_sizes(%tc : i32, %ts : i32) { %canonloop = omp.new_cli omp.canonical_loop(%canonloop) %iv : i32 in range(%tc) { omp.terminator } // expected-error@+1 {{'omp.tile' op there must be one tile size for each applyee}} omp.tile <-(%canonloop) llvm.return } // ----- func.func @no_loop(%tc : i32, %ts : i32) { // expected-error@+1 {{'omp.tile' op must apply to at least one loop}} omp.tile <-() return } // ----- func.func @missing_generator(%tc : i32, %ts : i32) { // expected-error@+1 {{'omp.new_cli' op CLI has no generator}} %canonloop = omp.new_cli // expected-note@+1 {{see consumer here: "omp.tile"(%0, %arg1) <{operandSegmentSizes = array}> : (!omp.cli, i32) -> ()}} omp.tile <-(%canonloop) sizes(%ts : i32) return } // ----- func.func @insufficient_sizes(%tc : i32, %ts : i32) { %canonloop1 = omp.new_cli %canonloop2 = omp.new_cli omp.canonical_loop(%canonloop1) %iv1 : i32 in range(%tc) { omp.canonical_loop(%canonloop2) %iv2 : i32 in range(%tc) { omp.terminator } omp.terminator } // expected-error@+1 {{'omp.tile' op there must be one tile size for each applyee}} omp.tile <-(%canonloop1, %canonloop2) sizes(%ts : i32) llvm.return } // ----- func.func @insufficient_applyees(%tc : i32, %ts : i32) { %canonloop = omp.new_cli omp.canonical_loop(%canonloop) %iv : i32 in range(%tc) { omp.terminator } // expected-error@+1 {{omp.tile' op there must be one tile size for each applyee}} omp.tile <- (%canonloop) sizes(%ts, %ts : i32, i32) return } // ----- func.func @insufficient_generatees(%tc : i32, %ts : i32) { %canonloop = omp.new_cli %grid = omp.new_cli omp.canonical_loop(%canonloop) %iv : i32 in range(%tc) { omp.terminator } // expected-error@+1 {{'omp.tile' op expecting two times the number of generatees than applyees}} omp.tile (%grid) <- (%canonloop) sizes(%ts : i32) return } // ----- func.func @not_nested(%tc : i32, %ts : i32) { %canonloop1 = omp.new_cli %canonloop2 = omp.new_cli omp.canonical_loop(%canonloop1) %iv1 : i32 in range(%tc) { omp.terminator } omp.canonical_loop(%canonloop2) %iv2 : i32 in range(%tc) { omp.terminator } // expected-error@+1 {{'omp.tile' op tiled loop nest must be nested within each other}} omp.tile <-(%canonloop1, %canonloop2) sizes(%ts, %ts : i32, i32) llvm.return } // ----- func.func @not_perfectly_nested(%tc : i32, %ts : i32) { %canonloop1 = omp.new_cli %canonloop2 = omp.new_cli omp.canonical_loop(%canonloop1) %iv1 : i32 in range(%tc) { %v = arith.constant 42 : i32 omp.canonical_loop(%canonloop2) %iv2 : i32 in range(%tc) { omp.terminator } omp.terminator } // expected-error@+1 {{'omp.tile' op tiled loop nest must be perfectly nested}} omp.tile <-(%canonloop1, %canonloop2) sizes(%ts, %ts : i32, i32) llvm.return } // ----- func.func @non_nectangular(%tc : i32, %ts : i32) { %canonloop1 = omp.new_cli %canonloop2 = omp.new_cli omp.canonical_loop(%canonloop1) %iv1 : i32 in range(%tc) { omp.canonical_loop(%canonloop2) %iv2 : i32 in range(%iv1) { omp.terminator } omp.terminator } // expected-error@+1 {{'omp.tile' op tiled loop nest must be rectangular}} omp.tile <-(%canonloop1, %canonloop2) sizes(%ts, %ts : i32, i32) llvm.return }