@@ -9,13 +9,17 @@ func.func @basic(%arg0: !torch.tensor {torch.type_bound = !torch.vtensor<[2,3,?]
9
9
return %arg0 : !torch.tensor
10
10
}
11
11
12
+ // -----
13
+
12
14
// CHECK-LABEL: func.func @no_type_bound(
13
15
// CHECK-SAME: %[[ARG:.*]]: !torch.tensor) -> !torch.tensor {
14
16
// CHECK: return %[[ARG]] : !torch.tensor
15
17
func.func @no_type_bound (%arg0: !torch.tensor ) -> !torch.tensor {
16
18
return %arg0 : !torch.tensor
17
19
}
18
20
21
+ // -----
22
+
19
23
// CHECK-LABEL: func.func @call(
20
24
// CHECK-SAME: %[[ARG:.*]]: !torch.vtensor<[2,3,?],f32>) -> !torch.tensor {
21
25
// CHECK: %[[ARG_ERASED:.*]] = torch.tensor_static_info_cast %[[ARG]] : !torch.vtensor<[2,3,?],f32> to !torch.vtensor
@@ -29,71 +33,68 @@ func.func @call(%arg0: !torch.tensor {torch.type_bound = !torch.vtensor<[2,3,?],
29
33
return %arg0 : !torch.tensor
30
34
}
31
35
32
- // COM: func.func @none_return() {
33
- // COM: %[[NONE:.*]] = torch.constant.none
34
- // COM: return
35
- // func.func @none_return() -> !torch.none {
36
- // %1 = torch.constant.none
37
- // return %1 : !torch.none
38
- // }
36
+ // -----
37
+
38
+ // CHECK-LABEL: func.func @none_return() {
39
+ // CHECK: %[[NONE:.*]] = torch.constant.none
40
+ // CHECK: return
41
+ func.func @none_return () -> !torch.none {
42
+ %1 = torch.constant.none
43
+ return %1 : !torch.none
44
+ }
45
+
46
+ // CHECK-LABEL: func.func @none_call_return() {
47
+ // CHECK: call @none_return() : () -> ()
48
+ // CHECK: %[[NONE:.*]] = torch.constant.none
49
+ // CHECK: "test.use"(%[[NONE]]) : (!torch.none) -> ()
50
+ // CHECK: return
51
+ func.func @none_call_return () {
52
+ %0 = call @none_return () : () -> !torch.none
53
+ " test.use" (%0 ) : (!torch.none ) -> ()
54
+ return
55
+ }
39
56
40
- // COM: func.func @none_call_return() {
41
- // COM: call @none_return() : () -> ()
42
- // COM: %[[NONE:.*]] = torch.constant.none
43
- // COM: "test.use"(%[[NONE]]) : (!torch.none) -> ()
44
- // COM: return
45
- // func.func @none_call_return() {
46
- // %0 = call @none_return() : () -> !torch.none
47
- // "test.use"(%0) : (!torch.none) -> ()
48
- // return
49
- // }
57
+ // -----
50
58
51
- // COM: func.func @tuple_return(
52
- // COM: %[[ARG0:.*]]: !torch.vtensor<[?],f32>,
53
- // COM: %[[ARG1:.*]]: !torch.vtensor<[?],f32>) -> (!torch.tensor, !torch.tensor) {
54
- // COM: %[[ARG0_ERASED:.*]] = torch.tensor_static_info_cast %[[ARG0]] : !torch.vtensor<[?],f32> to !torch.vtensor
55
- // COM: %[[ARG0_NONVAL:.*]] = torch.copy.to_tensor %[[ARG0_ERASED]] : !torch.tensor
56
- // COM: %[[ARG1_ERASED:.*]] = torch.tensor_static_info_cast %[[ARG1]] : !torch.vtensor<[?],f32> to !torch.vtensor
57
- // COM: %[[ARG1_NONVAL:.*]] = torch.copy.to_tensor %[[ARG1_ERASED]] : !torch.tensor
58
- // COM: %[[TUPLE:.*]] = torch.prim.TupleConstruct %[[ARG0_NONVAL]], %[[ARG1_NONVAL]] :
59
- // COM: !torch.tensor, !torch.tensor -> !torch.tuple<tensor, tensor>
60
- // COM: %[[CST0:.*]] = torch.constant.int 0
61
- // COM: %[[RET0:.*]] = torch.prim.TupleIndex %[[TUPLE]], %[[CST0]] :
62
- // COM: !torch.tuple<tensor, tensor>, !torch.int -> !torch.tensor
63
- // COM: %[[CST1:.*]] = torch.constant.int 1
64
- // COM: %[[RET1:.*]] = torch.prim.TupleIndex %[[TUPLE]], %[[CST1]] :
65
- // COM: !torch.tuple<tensor, tensor>, !torch.int -> !torch.tensor
66
- // COM: return %[[RET0]], %[[RET1]] : !torch.tensor, !torch.tensor
67
- // func.func @tuple_return(%arg0: !torch.tensor {torch.type_bound = !torch.vtensor<[?],f32>},
68
- // %arg1: !torch.tensor {torch.type_bound = !torch.vtensor<[?],f32>}) -> !torch.tuple<tensor, tensor> {
69
- // %1 = torch.prim.TupleConstruct %arg0, %arg1 : !torch.tensor, !torch.tensor -> !torch.tuple<tensor, tensor>
70
- // return %1 : !torch.tuple<tensor, tensor>
71
- // }
59
+ // CHECK-LABEL: func.func @tuple_return(
60
+ // CHECK: %[[ARG0:.*]]: !torch.vtensor<[?],f32>,
61
+ // CHECK: %[[ARG1:.*]]: !torch.vtensor<[?],f32>) -> (!torch.tensor, !torch.tensor) {
62
+ // CHECK: %[[ARG1_ERASED:.*]] = torch.tensor_static_info_cast %[[ARG1]] : !torch.vtensor<[?],f32> to !torch.vtensor
63
+ // CHECK: %[[ARG1_NONVAL:.*]] = torch.copy.to_tensor %[[ARG1_ERASED]] : !torch.tensor
64
+ // CHECK: %[[ARG0_ERASED:.*]] = torch.tensor_static_info_cast %[[ARG0]] : !torch.vtensor<[?],f32> to !torch.vtensor
65
+ // CHECK: %[[ARG0_NONVAL:.*]] = torch.copy.to_tensor %[[ARG0_ERASED]] : !torch.tensor
66
+ // CHECK: %[[TUPLE:.*]] = torch.prim.TupleConstruct %[[ARG0_NONVAL]], %[[ARG1_NONVAL]] : !torch.tensor, !torch.tensor -> !torch.tuple<tensor, tensor>
67
+ // CHECK: %[[CST0:.*]] = torch.constant.int 0
68
+ // CHECK: %[[RET0:.*]] = torch.prim.TupleIndex %[[TUPLE]], %[[CST0]] : !torch.tuple<tensor, tensor>, !torch.int -> !torch.tensor
69
+ // CHECK: %[[CST1:.*]] = torch.constant.int 1
70
+ // CHECK: %[[RET1:.*]] = torch.prim.TupleIndex %[[TUPLE]], %[[CST1]] : !torch.tuple<tensor, tensor>, !torch.int -> !torch.tensor
71
+ // CHECK: return %[[RET0]], %[[RET1]] : !torch.tensor, !torch.tensor
72
+ func.func @tuple_return (%arg0: !torch.tensor {torch.type_bound = !torch.vtensor <[?],f32 >},
73
+ %arg1: !torch.tensor {torch.type_bound = !torch.vtensor <[?],f32 >}) -> !torch.tuple <tensor , tensor > {
74
+ %1 = torch.prim.TupleConstruct %arg0 , %arg1 : !torch.tensor , !torch.tensor -> !torch.tuple <tensor , tensor >
75
+ return %1 : !torch.tuple <tensor , tensor >
76
+ }
72
77
73
- // COM: func.func @call_tuple_return(
74
- // COM: %[[ARG0:.*]]: !torch.vtensor<[?],f32>,
75
- // COM: %[[ARG1:.*]]: !torch.vtensor<[?],f32>) -> (!torch.tensor, !torch.tensor) {
76
- // COM: %[[ARG0_ERASED:.*]] = torch.tensor_static_info_cast %[[ARG0]] : !torch.vtensor<[?],f32> to !torch.vtensor
77
- // COM: %[[ARG0_NONVAL:.*]] = torch.copy.to_tensor %[[ARG0_ERASED]] : !torch.tensor
78
- // COM: %[[ARG1_ERASED:.*]] = torch.tensor_static_info_cast %[[ARG1]] : !torch.vtensor<[?],f32> to !torch.vtensor
79
- // COM: %[[ARG1_NONVAL:.*]] = torch.copy.to_tensor %[[ARG1_ERASED]] : !torch.tensor
80
- // COM: %[[ARG0_NONVAL_SHAPED:.*]] = torch.tensor_static_info_cast %[[ARG0_NONVAL]] : !torch.tensor to !torch.tensor<[?],f32>
81
- // COM: %[[ARG0_VAL_SHAPED:.*]] = torch.copy.to_vtensor %[[ARG0_NONVAL_SHAPED]] : !torch.vtensor<[?],f32>
82
- // COM: %[[ARG1_NONVAL_SHAPED:.*]] = torch.tensor_static_info_cast %[[ARG1_NONVAL]] : !torch.tensor to !torch.tensor<[?],f32>
83
- // COM: %[[ARG1_VAL_SHAPED:.*]] = torch.copy.to_vtensor %[[ARG1_NONVAL_SHAPED]] : !torch.vtensor<[?],f32>
84
- // COM: %[[RETS:.*]]:2 = call @tuple_return(%[[ARG0_VAL_SHAPED]], %[[ARG1_VAL_SHAPED]]) :
85
- // COM: (!torch.vtensor<[?],f32>, !torch.vtensor<[?],f32>) -> (!torch.tensor, !torch.tensor)
86
- // COM: %[[TUPLE:.*]] = torch.prim.TupleConstruct %[[RETS]]#0, %[[RETS]]#1 :
87
- // COM: !torch.tensor, !torch.tensor -> !torch.tuple<tensor, tensor>
88
- // COM: %[[CST0:.*]] = torch.constant.int 0
89
- // COM: %[[RET0:.*]] = torch.prim.TupleIndex %[[TUPLE]], %[[CST0]] :
90
- // COM: !torch.tuple<tensor, tensor>, !torch.int -> !torch.tensor
91
- // COM: %[[CST1:.*]] = torch.constant.int 1
92
- // COM: %[[RET1:.*]] = torch.prim.TupleIndex %[[TUPLE]], %[[CST1]] :
93
- // COM: !torch.tuple<tensor, tensor>, !torch.int -> !torch.tensor
94
- // COM: return %[[RET0]], %[[RET1]] : !torch.tensor, !torch.tensor
95
- // func.func @call_tuple_return(%arg0: !torch.tensor {torch.type_bound = !torch.vtensor<[?],f32>},
96
- // %arg1: !torch.tensor {torch.type_bound = !torch.vtensor<[?],f32>}) -> !torch.tuple<tensor, tensor> {
97
- // %0 = call @tuple_return(%arg0, %arg1) : (!torch.tensor, !torch.tensor) -> !torch.tuple<tensor, tensor>
98
- // return %0 : !torch.tuple<tensor, tensor>
99
- // }
78
+ // CHECK-LABEL: func.func @call_tuple_return(
79
+ // CHECK: %[[ARG0:.*]]: !torch.vtensor<[?],f32>,
80
+ // CHECK: %[[ARG1:.*]]: !torch.vtensor<[?],f32>) -> (!torch.tensor, !torch.tensor) {
81
+ // CHECK: %[[ARG1_ERASED:.*]] = torch.tensor_static_info_cast %[[ARG1]] : !torch.vtensor<[?],f32> to !torch.vtensor
82
+ // CHECK: %[[ARG1_NONVAL:.*]] = torch.copy.to_tensor %[[ARG1_ERASED]] : !torch.tensor
83
+ // CHECK: %[[ARG0_ERASED:.*]] = torch.tensor_static_info_cast %[[ARG0]] : !torch.vtensor<[?],f32> to !torch.vtensor
84
+ // CHECK: %[[ARG0_NONVAL:.*]] = torch.copy.to_tensor %[[ARG0_ERASED]] : !torch.tensor
85
+ // CHECK: %[[ARG0_NONVAL_SHAPED:.*]] = torch.tensor_static_info_cast %[[ARG0_NONVAL]] : !torch.tensor to !torch.tensor<[?],f32>
86
+ // CHECK: %[[ARG0_VAL_SHAPED:.*]] = torch.copy.to_vtensor %[[ARG0_NONVAL_SHAPED]] : !torch.vtensor<[?],f32>
87
+ // CHECK: %[[ARG1_NONVAL_SHAPED:.*]] = torch.tensor_static_info_cast %[[ARG1_NONVAL]] : !torch.tensor to !torch.tensor<[?],f32>
88
+ // CHECK: %[[ARG1_VAL_SHAPED:.*]] = torch.copy.to_vtensor %[[ARG1_NONVAL_SHAPED]] : !torch.vtensor<[?],f32>
89
+ // CHECK: %[[RETS:.*]]:2 = call @tuple_return(%[[ARG0_VAL_SHAPED]], %[[ARG1_VAL_SHAPED]]) : (!torch.vtensor<[?],f32>, !torch.vtensor<[?],f32>) -> (!torch.tensor, !torch.tensor)
90
+ // CHECK: %[[TUPLE:.*]] = torch.prim.TupleConstruct %[[RETS]]#0, %[[RETS]]#1 : !torch.tensor, !torch.tensor -> !torch.tuple<tensor, tensor>
91
+ // CHECK: %[[CST0:.*]] = torch.constant.int 0
92
+ // CHECK: %[[RET0:.*]] = torch.prim.TupleIndex %[[TUPLE]], %[[CST0]] : !torch.tuple<tensor, tensor>, !torch.int -> !torch.tensor
93
+ // CHECK: %[[CST1:.*]] = torch.constant.int 1
94
+ // CHECK: %[[RET1:.*]] = torch.prim.TupleIndex %[[TUPLE]], %[[CST1]] : !torch.tuple<tensor, tensor>, !torch.int -> !torch.tensor
95
+ // CHECK: return %[[RET0]], %[[RET1]] : !torch.tensor, !torch.tensor
96
+ func.func @call_tuple_return (%arg0: !torch.tensor {torch.type_bound = !torch.vtensor <[?],f32 >},
97
+ %arg1: !torch.tensor {torch.type_bound = !torch.vtensor <[?],f32 >}) -> !torch.tuple <tensor , tensor > {
98
+ %0 = call @tuple_return (%arg0 , %arg1 ) : (!torch.tensor , !torch.tensor ) -> !torch.tuple <tensor , tensor >
99
+ return %0 : !torch.tuple <tensor , tensor >
100
+ }
0 commit comments