1*1295a351SMathieu Fehr// RUN: mlir-opt %s --irdl-file=%S/variadics.irdl.mlir -split-input-file -verify-diagnostics | FileCheck %s 2*1295a351SMathieu Fehr 3*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 4*1295a351SMathieu Fehr// Single operand 5*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 6*1295a351SMathieu Fehr 7*1295a351SMathieu Fehr// Test an operation with a single operand. 8*1295a351SMathieu Fehrfunc.func @testSingleOperand(%x: i32) { 9*1295a351SMathieu Fehr "testvar.single_operand"(%x) : (i32) -> () 10*1295a351SMathieu Fehr // CHECK: "testvar.single_operand"(%{{.*}}) : (i32) -> () 11*1295a351SMathieu Fehr return 12*1295a351SMathieu Fehr} 13*1295a351SMathieu Fehr 14*1295a351SMathieu Fehr// ----- 15*1295a351SMathieu Fehr 16*1295a351SMathieu Fehr// Test an operation with a single operand definition and a wrong number of operands. 17*1295a351SMathieu Fehrfunc.func @testSingleOperandFail(%x: i32) { 18*1295a351SMathieu Fehr // expected-error@+1 {{op expects exactly 1 operands, but got 2}} 19*1295a351SMathieu Fehr "testvar.single_operand"(%x, %x) : (i32, i32) -> () 20*1295a351SMathieu Fehr return 21*1295a351SMathieu Fehr} 22*1295a351SMathieu Fehr 23*1295a351SMathieu Fehr// ----- 24*1295a351SMathieu Fehr 25*1295a351SMathieu Fehr// Test an operation with a single operand definition and a wrong number of operands. 26*1295a351SMathieu Fehrfunc.func @testSingleOperandFail() { 27*1295a351SMathieu Fehr // expected-error@+1 {{op expects exactly 1 operands, but got 0}} 28*1295a351SMathieu Fehr "testvar.single_operand"() : () -> () 29*1295a351SMathieu Fehr return 30*1295a351SMathieu Fehr} 31*1295a351SMathieu Fehr 32*1295a351SMathieu Fehr// ----- 33*1295a351SMathieu Fehr 34*1295a351SMathieu Fehr 35*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 36*1295a351SMathieu Fehr// Variadic operand 37*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 38*1295a351SMathieu Fehr 39*1295a351SMathieu Fehr// Test an operation with a single variadic operand. 40*1295a351SMathieu Fehrfunc.func @testVarOperand(%x: i16, %y: i32, %z: i64) { 41*1295a351SMathieu Fehr "testvar.var_operand"(%x, %z) : (i16, i64) -> () 42*1295a351SMathieu Fehr // CHECK: "testvar.var_operand"(%{{.*}}, %{{.*}}) : (i16, i64) -> () 43*1295a351SMathieu Fehr "testvar.var_operand"(%x, %y, %z) : (i16, i32, i64) -> () 44*1295a351SMathieu Fehr // CHECK-NEXT: "testvar.var_operand"(%{{.*}}, %{{.*}}, %{{.*}}) : (i16, i32, i64) -> () 45*1295a351SMathieu Fehr "testvar.var_operand"(%x, %y, %y, %z) : (i16, i32, i32, i64) -> () 46*1295a351SMathieu Fehr // CHECK-NEXT: "testvar.var_operand"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (i16, i32, i32, i64) -> () 47*1295a351SMathieu Fehr "testvar.var_operand"(%x, %y, %y, %y, %z) : (i16, i32, i32, i32, i64) -> () 48*1295a351SMathieu Fehr // CHECK-NEXT: "testvar.var_operand"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (i16, i32, i32, i32, i64) -> () 49*1295a351SMathieu Fehr return 50*1295a351SMathieu Fehr} 51*1295a351SMathieu Fehr 52*1295a351SMathieu Fehr// ----- 53*1295a351SMathieu Fehr 54*1295a351SMathieu Fehr// Check that the verifier of a variadic operand fails if the variadic is given 55*1295a351SMathieu Fehr// a wrong type. 56*1295a351SMathieu Fehrfunc.func @testVarOperandFail(%x: i16, %y: i64, %z: i64) { 57*1295a351SMathieu Fehr // expected-error@+1 {{expected 'i32' but got 'i64'}} 58*1295a351SMathieu Fehr "testvar.var_operand"(%x, %y, %z) : (i16, i64, i64) -> () 59*1295a351SMathieu Fehr return 60*1295a351SMathieu Fehr} 61*1295a351SMathieu Fehr 62*1295a351SMathieu Fehr// ----- 63*1295a351SMathieu Fehr 64*1295a351SMathieu Fehr// Check that the verifier of a variadic operand fails if the variadic is given 65*1295a351SMathieu Fehr// a wrong type on the second value. 66*1295a351SMathieu Fehrfunc.func @testVarOperandFail(%x: i16, %y1: i32, %y2: i64, %z: i64) { 67*1295a351SMathieu Fehr // expected-error@+1 {{expected 'i32' but got 'i64'}} 68*1295a351SMathieu Fehr "testvar.var_operand"(%x, %y1, %y2, %z) : (i16, i32, i64, i64) -> () 69*1295a351SMathieu Fehr return 70*1295a351SMathieu Fehr} 71*1295a351SMathieu Fehr 72*1295a351SMathieu Fehr// ----- 73*1295a351SMathieu Fehr 74*1295a351SMathieu Fehr// Check that if we do not give enough operands, the verifier fails. 75*1295a351SMathieu Fehrfunc.func @testVarOperandFail() { 76*1295a351SMathieu Fehr // expected-error@+1 {{op expects at least 2 operands, but got 0}} 77*1295a351SMathieu Fehr "testvar.var_operand"() : () -> () 78*1295a351SMathieu Fehr return 79*1295a351SMathieu Fehr} 80*1295a351SMathieu Fehr 81*1295a351SMathieu Fehr// ----- 82*1295a351SMathieu Fehr 83*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 84*1295a351SMathieu Fehr// Optional operand 85*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 86*1295a351SMathieu Fehr 87*1295a351SMathieu Fehr 88*1295a351SMathieu Fehr// Test an operation with a single optional operand. 89*1295a351SMathieu Fehrfunc.func @testOptOperand(%x: i16, %y: i32, %z: i64) { 90*1295a351SMathieu Fehr "testvar.opt_operand"(%x, %z) : (i16, i64) -> () 91*1295a351SMathieu Fehr // CHECK: "testvar.opt_operand"(%{{.*}}, %{{.*}}) : (i16, i64) -> () 92*1295a351SMathieu Fehr "testvar.opt_operand"(%x, %y, %z) : (i16, i32, i64) -> () 93*1295a351SMathieu Fehr // CHECK-NEXT: "testvar.opt_operand"(%{{.*}}, %{{.*}}, %{{.*}}) : (i16, i32, i64) -> () 94*1295a351SMathieu Fehr return 95*1295a351SMathieu Fehr} 96*1295a351SMathieu Fehr 97*1295a351SMathieu Fehr// ----- 98*1295a351SMathieu Fehr 99*1295a351SMathieu Fehr// Check that the verifier of an optional operand fails if the variadic is 100*1295a351SMathieu Fehr// given a wrong type. 101*1295a351SMathieu Fehrfunc.func @testOptOperandFail(%x: i16, %y: i64, %z: i64) { 102*1295a351SMathieu Fehr // expected-error@+1 {{expected 'i32' but got 'i64'}} 103*1295a351SMathieu Fehr "testvar.opt_operand"(%x, %y, %z) : (i16, i64, i64) -> () 104*1295a351SMathieu Fehr return 105*1295a351SMathieu Fehr} 106*1295a351SMathieu Fehr 107*1295a351SMathieu Fehr// ----- 108*1295a351SMathieu Fehr 109*1295a351SMathieu Fehr// Check that the verifier of an optional operand fails if there are too 110*1295a351SMathieu Fehr// many operands. 111*1295a351SMathieu Fehrfunc.func @testOptOperandFail(%x: i16, %y: i32, %z: i64) { 112*1295a351SMathieu Fehr // expected-error@+1 {{op expects at most 3 operands, but got 4}} 113*1295a351SMathieu Fehr "testvar.opt_operand"(%x, %y, %y, %z) : (i16, i32, i32, i64) -> () 114*1295a351SMathieu Fehr return 115*1295a351SMathieu Fehr} 116*1295a351SMathieu Fehr 117*1295a351SMathieu Fehr// ----- 118*1295a351SMathieu Fehr 119*1295a351SMathieu Fehr// Check that the verifier of an optional operand fails if there are not 120*1295a351SMathieu Fehr// enough operands. 121*1295a351SMathieu Fehrfunc.func @testOptOperandFail(%x: i16) { 122*1295a351SMathieu Fehr // expected-error@+1 {{op expects at least 2 operands, but got 1}} 123*1295a351SMathieu Fehr "testvar.opt_operand"(%x) : (i16) -> () 124*1295a351SMathieu Fehr return 125*1295a351SMathieu Fehr} 126*1295a351SMathieu Fehr 127*1295a351SMathieu Fehr// ----- 128*1295a351SMathieu Fehr 129*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 130*1295a351SMathieu Fehr// Multiple variadic 131*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 132*1295a351SMathieu Fehr 133*1295a351SMathieu Fehr// Check that an operation with multiple variadics expects the segment size 134*1295a351SMathieu Fehr// attribute 135*1295a351SMathieu Fehrfunc.func @testMultOperandsMissingSegment(%x: i16, %z: i64) { 136*1295a351SMathieu Fehr // expected-error@+1 {{'operand_segment_sizes' attribute is expected but not provided}} 137*1295a351SMathieu Fehr "testvar.var_and_opt_operand"(%x, %x, %z) : (i16, i16, i64) -> () 138*1295a351SMathieu Fehr return 139*1295a351SMathieu Fehr} 140*1295a351SMathieu Fehr 141*1295a351SMathieu Fehr// ----- 142*1295a351SMathieu Fehr 143*1295a351SMathieu Fehr// Check that an operation with multiple variadics expects the segment size 144*1295a351SMathieu Fehr// attribute of the right type 145*1295a351SMathieu Fehrfunc.func @testMultOperandsWrongSegmentType(%x: i16, %z: i64) { 146*1295a351SMathieu Fehr // expected-error@+1 {{'operand_segment_sizes' attribute is expected to be a dense i32 array}} 147*1295a351SMathieu Fehr "testvar.var_and_opt_operand"(%x, %x, %z) {operand_segment_sizes = i32} : (i16, i16, i64) -> () 148*1295a351SMathieu Fehr return 149*1295a351SMathieu Fehr} 150*1295a351SMathieu Fehr 151*1295a351SMathieu Fehr// ----- 152*1295a351SMathieu Fehr 153*1295a351SMathieu Fehr// Check that an operation with multiple variadics with the right segment size 154*1295a351SMathieu Fehr// verifies. 155*1295a351SMathieu Fehrfunc.func @testMultOperands(%x: i16, %y: i32, %z: i64) { 156*1295a351SMathieu Fehr "testvar.var_and_opt_operand"(%x, %x, %z) {operand_segment_sizes = array<i32: 2, 0, 1>} : (i16, i16, i64) -> () 157*1295a351SMathieu Fehr // CHECK: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}, %{{.*}}) {operand_segment_sizes = array<i32: 2, 0, 1>} : (i16, i16, i64) -> () 158*1295a351SMathieu Fehr "testvar.var_and_opt_operand"(%x, %x, %y, %z) {operand_segment_sizes = array<i32: 2, 1, 1>} : (i16, i16, i32, i64) -> () 159*1295a351SMathieu Fehr // CHECK-NEXT: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {operand_segment_sizes = array<i32: 2, 1, 1>} : (i16, i16, i32, i64) -> () 160*1295a351SMathieu Fehr "testvar.var_and_opt_operand"(%y, %z) {operand_segment_sizes = array<i32: 0, 1, 1>} : (i32, i64) -> () 161*1295a351SMathieu Fehr // CHECK-NEXT: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}) {operand_segment_sizes = array<i32: 0, 1, 1>} : (i32, i64) -> () 162*1295a351SMathieu Fehr return 163*1295a351SMathieu Fehr} 164*1295a351SMathieu Fehr 165*1295a351SMathieu Fehr// ----- 166*1295a351SMathieu Fehr 167*1295a351SMathieu Fehr// Check that the segment sizes expects non-negative values 168*1295a351SMathieu Fehrfunc.func @testMultOperandsSegmentNegative() { 169*1295a351SMathieu Fehr // expected-error@+1 {{'operand_segment_sizes' attribute for specifying operand segments must have non-negative values}} 170*1295a351SMathieu Fehr "testvar.var_and_opt_operand"() {operand_segment_sizes = array<i32: 2, -1, 1>} : () -> () 171*1295a351SMathieu Fehr return 172*1295a351SMathieu Fehr} 173*1295a351SMathieu Fehr 174*1295a351SMathieu Fehr// ----- 175*1295a351SMathieu Fehr 176*1295a351SMathieu Fehr// Check that the segment sizes expects 1 for single values 177*1295a351SMathieu Fehrfunc.func @testMultOperandsSegmentWrongSingle() { 178*1295a351SMathieu Fehr // expected-error@+1 {{element 2 in 'operand_segment_sizes' attribute must be equal to 1}} 179*1295a351SMathieu Fehr "testvar.var_and_opt_operand"() {operand_segment_sizes = array<i32: 0, 0, 0>} : () -> () 180*1295a351SMathieu Fehr return 181*1295a351SMathieu Fehr} 182*1295a351SMathieu Fehr 183*1295a351SMathieu Fehr// ----- 184*1295a351SMathieu Fehr 185*1295a351SMathieu Fehr// Check that the segment sizes expects not more than 1 for optional values 186*1295a351SMathieu Fehrfunc.func @testMultOperandsSegmentWrongOptional() { 187*1295a351SMathieu Fehr // expected-error@+1 {{element 1 in 'operand_segment_sizes' attribute must be equal to 0 or 1}} 188*1295a351SMathieu Fehr "testvar.var_and_opt_operand"() {operand_segment_sizes = array<i32: 0, 2, 0>} : () -> () 189*1295a351SMathieu Fehr return 190*1295a351SMathieu Fehr} 191*1295a351SMathieu Fehr 192*1295a351SMathieu Fehr// ----- 193*1295a351SMathieu Fehr 194*1295a351SMathieu Fehr// Check that the sum of the segment sizes should be equal to the number of operands 195*1295a351SMathieu Fehrfunc.func @testMultOperandsSegmentWrongOptional(%y: i32, %z: i64) { 196*1295a351SMathieu Fehr // expected-error@+1 {{sum of elements in 'operand_segment_sizes' attribute must be equal to the number of operands}} 197*1295a351SMathieu Fehr "testvar.var_and_opt_operand"(%y, %z) {operand_segment_sizes = array<i32: 0, 0, 1>} : (i32, i64) -> () 198*1295a351SMathieu Fehr return 199*1295a351SMathieu Fehr} 200*1295a351SMathieu Fehr 201*1295a351SMathieu Fehr// ----- 202*1295a351SMathieu Fehr 203*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 204*1295a351SMathieu Fehr// Single result 205*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 206*1295a351SMathieu Fehr 207*1295a351SMathieu Fehr// Test an operation with a single result. 208*1295a351SMathieu Fehrfunc.func @testSingleResult() { 209*1295a351SMathieu Fehr %x = "testvar.single_result"() : () -> i32 210*1295a351SMathieu Fehr // CHECK: %{{.*}} = "testvar.single_result"() : () -> i32 211*1295a351SMathieu Fehr return 212*1295a351SMathieu Fehr} 213*1295a351SMathieu Fehr 214*1295a351SMathieu Fehr// ----- 215*1295a351SMathieu Fehr 216*1295a351SMathieu Fehr// Test an operation with a single result definition and a wrong number of results. 217*1295a351SMathieu Fehrfunc.func @testSingleResultFail() { 218*1295a351SMathieu Fehr // expected-error@+1 {{op expects exactly 1 results, but got 2}} 219*1295a351SMathieu Fehr %x, %y = "testvar.single_result"() : () -> (i32, i32) 220*1295a351SMathieu Fehr return 221*1295a351SMathieu Fehr} 222*1295a351SMathieu Fehr 223*1295a351SMathieu Fehr// ----- 224*1295a351SMathieu Fehr 225*1295a351SMathieu Fehr// Test an operation with a single result definition and a wrong number of results. 226*1295a351SMathieu Fehrfunc.func @testSingleResultFail() { 227*1295a351SMathieu Fehr // expected-error@+1 {{op expects exactly 1 results, but got 0}} 228*1295a351SMathieu Fehr "testvar.single_result"() : () -> () 229*1295a351SMathieu Fehr return 230*1295a351SMathieu Fehr} 231*1295a351SMathieu Fehr 232*1295a351SMathieu Fehr// ----- 233*1295a351SMathieu Fehr 234*1295a351SMathieu Fehr 235*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 236*1295a351SMathieu Fehr// Variadic result 237*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 238*1295a351SMathieu Fehr 239*1295a351SMathieu Fehr 240*1295a351SMathieu Fehr// Test an operation with a single variadic result. 241*1295a351SMathieu Fehrfunc.func @testVarResult() { 242*1295a351SMathieu Fehr "testvar.var_result"() : () -> (i16, i64) 243*1295a351SMathieu Fehr // CHECK: "testvar.var_result"() : () -> (i16, i64) 244*1295a351SMathieu Fehr "testvar.var_result"() : () -> (i16, i32, i64) 245*1295a351SMathieu Fehr // CHECK-NEXT: "testvar.var_result"() : () -> (i16, i32, i64) 246*1295a351SMathieu Fehr "testvar.var_result"() : () -> (i16, i32, i32, i64) 247*1295a351SMathieu Fehr // CHECK-NEXT: "testvar.var_result"() : () -> (i16, i32, i32, i64) 248*1295a351SMathieu Fehr "testvar.var_result"() : () -> (i16, i32, i32, i32, i64) 249*1295a351SMathieu Fehr // CHECK-NEXT: "testvar.var_result"() : () -> (i16, i32, i32, i32, i64) 250*1295a351SMathieu Fehr return 251*1295a351SMathieu Fehr} 252*1295a351SMathieu Fehr 253*1295a351SMathieu Fehr// ----- 254*1295a351SMathieu Fehr 255*1295a351SMathieu Fehr// Check that the verifier of a variadic result fails if the variadic is given 256*1295a351SMathieu Fehr// a wrong type. 257*1295a351SMathieu Fehrfunc.func @testVarResultFail() { 258*1295a351SMathieu Fehr // expected-error@+1 {{expected 'i32' but got 'i64'}} 259*1295a351SMathieu Fehr "testvar.var_result"() : () -> (i16, i64, i64) 260*1295a351SMathieu Fehr return 261*1295a351SMathieu Fehr} 262*1295a351SMathieu Fehr 263*1295a351SMathieu Fehr// ----- 264*1295a351SMathieu Fehr 265*1295a351SMathieu Fehr// Check that the verifier of a variadic result fails if the variadic is given 266*1295a351SMathieu Fehr// a wrong type on the second value. 267*1295a351SMathieu Fehrfunc.func @testVarResultFail() { 268*1295a351SMathieu Fehr // expected-error@+1 {{expected 'i32' but got 'i64'}} 269*1295a351SMathieu Fehr "testvar.var_result"() : () -> (i16, i32, i64, i64) 270*1295a351SMathieu Fehr return 271*1295a351SMathieu Fehr} 272*1295a351SMathieu Fehr 273*1295a351SMathieu Fehr// ----- 274*1295a351SMathieu Fehr 275*1295a351SMathieu Fehr// Check that if we do not give enough results, the verifier fails. 276*1295a351SMathieu Fehrfunc.func @testVarResultFail() { 277*1295a351SMathieu Fehr // expected-error@+1 {{op expects at least 2 results, but got 0}} 278*1295a351SMathieu Fehr "testvar.var_result"() : () -> () 279*1295a351SMathieu Fehr return 280*1295a351SMathieu Fehr} 281*1295a351SMathieu Fehr 282*1295a351SMathieu Fehr// ----- 283*1295a351SMathieu Fehr 284*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 285*1295a351SMathieu Fehr// Optional result 286*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 287*1295a351SMathieu Fehr 288*1295a351SMathieu Fehr 289*1295a351SMathieu Fehr// Test an operation with a single optional result. 290*1295a351SMathieu Fehrfunc.func @testOptResult() { 291*1295a351SMathieu Fehr "testvar.opt_result"() : () -> (i16, i64) 292*1295a351SMathieu Fehr // CHECK: "testvar.opt_result"() : () -> (i16, i64) 293*1295a351SMathieu Fehr "testvar.opt_result"() : () -> (i16, i32, i64) 294*1295a351SMathieu Fehr // CHECK-NEXT: "testvar.opt_result"() : () -> (i16, i32, i64) 295*1295a351SMathieu Fehr return 296*1295a351SMathieu Fehr} 297*1295a351SMathieu Fehr 298*1295a351SMathieu Fehr// ----- 299*1295a351SMathieu Fehr 300*1295a351SMathieu Fehr// Check that the verifier of an optional result fails if the variadic is 301*1295a351SMathieu Fehr// given a wrong type. 302*1295a351SMathieu Fehrfunc.func @testOptResultFail() { 303*1295a351SMathieu Fehr // expected-error@+1 {{expected 'i32' but got 'i64'}} 304*1295a351SMathieu Fehr "testvar.opt_result"() : () -> (i16, i64, i64) 305*1295a351SMathieu Fehr return 306*1295a351SMathieu Fehr} 307*1295a351SMathieu Fehr 308*1295a351SMathieu Fehr// ----- 309*1295a351SMathieu Fehr 310*1295a351SMathieu Fehr// Check that the verifier of an optional result fails if there are too 311*1295a351SMathieu Fehr// many results. 312*1295a351SMathieu Fehrfunc.func @testOptResultFail() { 313*1295a351SMathieu Fehr // expected-error@+1 {{op expects at most 3 results, but got 4}} 314*1295a351SMathieu Fehr "testvar.opt_result"() : () -> (i16, i32, i32, i64) 315*1295a351SMathieu Fehr return 316*1295a351SMathieu Fehr} 317*1295a351SMathieu Fehr 318*1295a351SMathieu Fehr// ----- 319*1295a351SMathieu Fehr 320*1295a351SMathieu Fehr// Check that the verifier of an optional result fails if there are not 321*1295a351SMathieu Fehr// enough results. 322*1295a351SMathieu Fehrfunc.func @testOptResultFail() { 323*1295a351SMathieu Fehr // expected-error@+1 {{op expects at least 2 results, but got 1}} 324*1295a351SMathieu Fehr "testvar.opt_result"() : () -> (i16) 325*1295a351SMathieu Fehr return 326*1295a351SMathieu Fehr} 327*1295a351SMathieu Fehr 328*1295a351SMathieu Fehr// ----- 329*1295a351SMathieu Fehr 330*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 331*1295a351SMathieu Fehr// Multiple variadic 332*1295a351SMathieu Fehr//===----------------------------------------------------------------------===// 333*1295a351SMathieu Fehr 334*1295a351SMathieu Fehr// Check that an operation with multiple variadics expects the segment size 335*1295a351SMathieu Fehr// attribute 336*1295a351SMathieu Fehrfunc.func @testMultResultsMissingSegment() { 337*1295a351SMathieu Fehr // expected-error@+1 {{'result_segment_sizes' attribute is expected but not provided}} 338*1295a351SMathieu Fehr "testvar.var_and_opt_result"() : () -> (i16, i16, i64) 339*1295a351SMathieu Fehr return 340*1295a351SMathieu Fehr} 341*1295a351SMathieu Fehr 342*1295a351SMathieu Fehr// ----- 343*1295a351SMathieu Fehr 344*1295a351SMathieu Fehr// Check that an operation with multiple variadics expects the segment size 345*1295a351SMathieu Fehr// attribute of the right type 346*1295a351SMathieu Fehrfunc.func @testMultResultsWrongSegmentType() { 347*1295a351SMathieu Fehr // expected-error@+1 {{'result_segment_sizes' attribute is expected to be a dense i32 array}} 348*1295a351SMathieu Fehr "testvar.var_and_opt_result"() {result_segment_sizes = i32} : () -> (i16, i16, i64) 349*1295a351SMathieu Fehr return 350*1295a351SMathieu Fehr} 351*1295a351SMathieu Fehr 352*1295a351SMathieu Fehr// ----- 353*1295a351SMathieu Fehr 354*1295a351SMathieu Fehr// Check that an operation with multiple variadics with the right segment size 355*1295a351SMathieu Fehr// verifies. 356*1295a351SMathieu Fehrfunc.func @testMultResults() { 357*1295a351SMathieu Fehr "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, 0, 1>} : () -> (i16, i16, i64) 358*1295a351SMathieu Fehr // CHECK: "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, 0, 1>} : () -> (i16, i16, i64) 359*1295a351SMathieu Fehr "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, 1, 1>} : () -> (i16, i16, i32, i64) 360*1295a351SMathieu Fehr // CHECK-NEXT: "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, 1, 1>} : () -> (i16, i16, i32, i64) 361*1295a351SMathieu Fehr "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 1, 1>} : () -> (i32, i64) 362*1295a351SMathieu Fehr // CHECK-NEXT: "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 1, 1>} : () -> (i32, i64) 363*1295a351SMathieu Fehr return 364*1295a351SMathieu Fehr} 365*1295a351SMathieu Fehr 366*1295a351SMathieu Fehr// ----- 367*1295a351SMathieu Fehr 368*1295a351SMathieu Fehr// Check that the segment sizes expects non-negative values 369*1295a351SMathieu Fehrfunc.func @testMultResultsSegmentNegative() { 370*1295a351SMathieu Fehr // expected-error@+1 {{'result_segment_sizes' attribute for specifying result segments must have non-negative values}} 371*1295a351SMathieu Fehr "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, -1, 1>} : () -> () 372*1295a351SMathieu Fehr return 373*1295a351SMathieu Fehr} 374*1295a351SMathieu Fehr 375*1295a351SMathieu Fehr// ----- 376*1295a351SMathieu Fehr 377*1295a351SMathieu Fehr// Check that the segment sizes expects 1 for single values 378*1295a351SMathieu Fehrfunc.func @testMultResultsSegmentWrongSingle() { 379*1295a351SMathieu Fehr // expected-error@+1 {{element 2 in 'result_segment_sizes' attribute must be equal to 1}} 380*1295a351SMathieu Fehr "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 0, 0>} : () -> () 381*1295a351SMathieu Fehr return 382*1295a351SMathieu Fehr} 383*1295a351SMathieu Fehr 384*1295a351SMathieu Fehr// ----- 385*1295a351SMathieu Fehr 386*1295a351SMathieu Fehr// Check that the segment sizes expects not more than 1 for optional values 387*1295a351SMathieu Fehrfunc.func @testMultResultsSegmentWrongOptional() { 388*1295a351SMathieu Fehr // expected-error@+1 {{element 1 in 'result_segment_sizes' attribute must be equal to 0 or 1}} 389*1295a351SMathieu Fehr "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 2, 0>} : () -> () 390*1295a351SMathieu Fehr return 391*1295a351SMathieu Fehr} 392*1295a351SMathieu Fehr 393*1295a351SMathieu Fehr// ----- 394*1295a351SMathieu Fehr 395*1295a351SMathieu Fehr// Check that the sum of the segment sizes should be equal to the number of results 396*1295a351SMathieu Fehrfunc.func @testMultResultsSegmentWrongOptional() { 397*1295a351SMathieu Fehr // expected-error@+1 {{sum of elements in 'result_segment_sizes' attribute must be equal to the number of results}} 398*1295a351SMathieu Fehr "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 0, 1>} : () -> (i32, i64) 399*1295a351SMathieu Fehr return 400*1295a351SMathieu Fehr} 401