@@ -1048,6 +1048,48 @@ func.func @convert_logical_not_to_not_equal(%arg0: vector<3xi64>, %arg1: vector<
1048
1048
spirv.ReturnValue %3 : vector <3 xi1 >
1049
1049
}
1050
1050
1051
+ // -----
1052
+
1053
+ //===----------------------------------------------------------------------===//
1054
+ // spirv.LogicalEqual
1055
+ //===----------------------------------------------------------------------===//
1056
+
1057
+ // CHECK-LABEL: @logical_equal_same
1058
+ func.func @logical_equal_same (%arg0 : i1 , %arg1 : vector <3 xi1 >) -> (i1 , vector <3 xi1 >) {
1059
+ // CHECK-DAG: %[[CTRUE:.*]] = spirv.Constant true
1060
+ // CHECK-DAG: %[[CVTRUE:.*]] = spirv.Constant dense<true>
1061
+
1062
+ %0 = spirv.LogicalEqual %arg0 , %arg0 : i1
1063
+ %1 = spirv.LogicalEqual %arg1 , %arg1 : vector <3 xi1 >
1064
+ // CHECK: return %[[CTRUE]], %[[CVTRUE]]
1065
+ return %0 , %1 : i1 , vector <3 xi1 >
1066
+ }
1067
+
1068
+ // CHECK-LABEL: @const_fold_scalar_logical_equal
1069
+ func.func @const_fold_scalar_logical_equal () -> (i1 , i1 ) {
1070
+ %true = spirv.Constant true
1071
+ %false = spirv.Constant false
1072
+
1073
+ // CHECK-DAG: %[[CTRUE:.*]] = spirv.Constant true
1074
+ // CHECK-DAG: %[[CFALSE:.*]] = spirv.Constant false
1075
+ %0 = spirv.LogicalEqual %true , %false : i1
1076
+ %1 = spirv.LogicalEqual %false , %false : i1
1077
+
1078
+ // CHECK: return %[[CFALSE]], %[[CTRUE]]
1079
+ return %0 , %1 : i1 , i1
1080
+ }
1081
+
1082
+ // CHECK-LABEL: @const_fold_vector_logical_equal
1083
+ func.func @const_fold_vector_logical_equal () -> vector <3 xi1 > {
1084
+ %cv0 = spirv.Constant dense <[true , false , true ]> : vector <3 xi1 >
1085
+ %cv1 = spirv.Constant dense <[true , false , false ]> : vector <3 xi1 >
1086
+
1087
+ // CHECK: %[[RET:.*]] = spirv.Constant dense<[true, true, false]>
1088
+ %0 = spirv.LogicalEqual %cv0 , %cv1 : vector <3 xi1 >
1089
+
1090
+ // CHECK: return %[[RET]]
1091
+ return %0 : vector <3 xi1 >
1092
+ }
1051
1093
1052
1094
// -----
1053
1095
@@ -1064,6 +1106,43 @@ func.func @convert_logical_not_equal_false(%arg: vector<4xi1>) -> vector<4xi1> {
1064
1106
spirv.ReturnValue %0 : vector <4 xi1 >
1065
1107
}
1066
1108
1109
+ // CHECK-LABEL: @logical_not_equal_same
1110
+ func.func @logical_not_equal_same (%arg0 : i1 , %arg1 : vector <3 xi1 >) -> (i1 , vector <3 xi1 >) {
1111
+ // CHECK-DAG: %[[CFALSE:.*]] = spirv.Constant false
1112
+ // CHECK-DAG: %[[CVFALSE:.*]] = spirv.Constant dense<false>
1113
+ %0 = spirv.LogicalNotEqual %arg0 , %arg0 : i1
1114
+ %1 = spirv.LogicalNotEqual %arg1 , %arg1 : vector <3 xi1 >
1115
+
1116
+ // CHECK: return %[[CFALSE]], %[[CVFALSE]]
1117
+ return %0 , %1 : i1 , vector <3 xi1 >
1118
+ }
1119
+
1120
+ // CHECK-LABEL: @const_fold_scalar_logical_not_equal
1121
+ func.func @const_fold_scalar_logical_not_equal () -> (i1 , i1 ) {
1122
+ %true = spirv.Constant true
1123
+ %false = spirv.Constant false
1124
+
1125
+ // CHECK-DAG: %[[CTRUE:.*]] = spirv.Constant true
1126
+ // CHECK-DAG: %[[CFALSE:.*]] = spirv.Constant false
1127
+ %0 = spirv.LogicalNotEqual %true , %false : i1
1128
+ %1 = spirv.LogicalNotEqual %false , %false : i1
1129
+
1130
+ // CHECK: return %[[CTRUE]], %[[CFALSE]]
1131
+ return %0 , %1 : i1 , i1
1132
+ }
1133
+
1134
+ // CHECK-LABEL: @const_fold_vector_logical_not_equal
1135
+ func.func @const_fold_vector_logical_not_equal () -> vector <3 xi1 > {
1136
+ %cv0 = spirv.Constant dense <[true , false , true ]> : vector <3 xi1 >
1137
+ %cv1 = spirv.Constant dense <[true , false , false ]> : vector <3 xi1 >
1138
+
1139
+ // CHECK: %[[RET:.*]] = spirv.Constant dense<[false, false, true]>
1140
+ %0 = spirv.LogicalNotEqual %cv0 , %cv1 : vector <3 xi1 >
1141
+
1142
+ // CHECK: return %[[RET]]
1143
+ return %0 : vector <3 xi1 >
1144
+ }
1145
+
1067
1146
// -----
1068
1147
1069
1148
func.func @convert_logical_not_to_equal (%arg0: vector <3 xi64 >, %arg1: vector <3 xi64 >) -> vector <3 xi1 > {
@@ -1139,6 +1218,92 @@ func.func @convert_logical_or_true_false_vector(%arg: vector<3xi1>) -> (vector<3
1139
1218
1140
1219
// -----
1141
1220
1221
+ //===----------------------------------------------------------------------===//
1222
+ // spirv.IEqual
1223
+ //===----------------------------------------------------------------------===//
1224
+
1225
+ // CHECK-LABEL: @iequal_same
1226
+ func.func @iequal_same (%arg0 : i32 , %arg1 : vector <3 xi32 >) -> (i1 , vector <3 xi1 >) {
1227
+ // CHECK-DAG: %[[CTRUE:.*]] = spirv.Constant true
1228
+ // CHECK-DAG: %[[CVTRUE:.*]] = spirv.Constant dense<true>
1229
+ %0 = spirv.IEqual %arg0 , %arg0 : i32
1230
+ %1 = spirv.IEqual %arg1 , %arg1 : vector <3 xi32 >
1231
+
1232
+ // CHECK: return %[[CTRUE]], %[[CVTRUE]]
1233
+ return %0 , %1 : i1 , vector <3 xi1 >
1234
+ }
1235
+
1236
+ // CHECK-LABEL: @const_fold_scalar_iequal
1237
+ func.func @const_fold_scalar_iequal () -> (i1 , i1 ) {
1238
+ %c5 = spirv.Constant 5 : i32
1239
+ %c6 = spirv.Constant 6 : i32
1240
+
1241
+ // CHECK-DAG: %[[CTRUE:.*]] = spirv.Constant true
1242
+ // CHECK-DAG: %[[CFALSE:.*]] = spirv.Constant false
1243
+ %0 = spirv.IEqual %c5 , %c6 : i32
1244
+ %1 = spirv.IEqual %c5 , %c5 : i32
1245
+
1246
+ // CHECK: return %[[CFALSE]], %[[CTRUE]]
1247
+ return %0 , %1 : i1 , i1
1248
+ }
1249
+
1250
+ // CHECK-LABEL: @const_fold_vector_iequal
1251
+ func.func @const_fold_vector_iequal () -> vector <3 xi1 > {
1252
+ %cv0 = spirv.Constant dense <[-1 , -4 , 2 ]> : vector <3 xi32 >
1253
+ %cv1 = spirv.Constant dense <[-1 , -3 , 2 ]> : vector <3 xi32 >
1254
+
1255
+ // CHECK: %[[RET:.*]] = spirv.Constant dense<[true, false, true]>
1256
+ %0 = spirv.IEqual %cv0 , %cv1 : vector <3 xi32 >
1257
+
1258
+ // CHECK: return %[[RET]]
1259
+ return %0 : vector <3 xi1 >
1260
+ }
1261
+
1262
+ // -----
1263
+
1264
+ //===----------------------------------------------------------------------===//
1265
+ // spirv.INotEqual
1266
+ //===----------------------------------------------------------------------===//
1267
+
1268
+ // CHECK-LABEL: @inotequal_same
1269
+ func.func @inotequal_same (%arg0 : i32 , %arg1 : vector <3 xi32 >) -> (i1 , vector <3 xi1 >) {
1270
+ // CHECK-DAG: %[[CFALSE:.*]] = spirv.Constant false
1271
+ // CHECK-DAG: %[[CVFALSE:.*]] = spirv.Constant dense<false>
1272
+ %0 = spirv.INotEqual %arg0 , %arg0 : i32
1273
+ %1 = spirv.INotEqual %arg1 , %arg1 : vector <3 xi32 >
1274
+
1275
+ // CHECK: return %[[CFALSE]], %[[CVFALSE]]
1276
+ return %0 , %1 : i1 , vector <3 xi1 >
1277
+ }
1278
+
1279
+ // CHECK-LABEL: @const_fold_scalar_inotequal
1280
+ func.func @const_fold_scalar_inotequal () -> (i1 , i1 ) {
1281
+ %c5 = spirv.Constant 5 : i32
1282
+ %c6 = spirv.Constant 6 : i32
1283
+
1284
+ // CHECK-DAG: %[[CTRUE:.*]] = spirv.Constant true
1285
+ // CHECK-DAG: %[[CFALSE:.*]] = spirv.Constant false
1286
+ %0 = spirv.INotEqual %c5 , %c6 : i32
1287
+ %1 = spirv.INotEqual %c5 , %c5 : i32
1288
+
1289
+ // CHECK: return %[[CTRUE]], %[[CFALSE]]
1290
+ return %0 , %1 : i1 , i1
1291
+ }
1292
+
1293
+ // CHECK-LABEL: @const_fold_vector_inotequal
1294
+ func.func @const_fold_vector_inotequal () -> vector <3 xi1 > {
1295
+ %cv0 = spirv.Constant dense <[-1 , -4 , 2 ]> : vector <3 xi32 >
1296
+ %cv1 = spirv.Constant dense <[-1 , -3 , 2 ]> : vector <3 xi32 >
1297
+
1298
+ // CHECK: %[[RET:.*]] = spirv.Constant dense<[false, true, false]>
1299
+ %0 = spirv.INotEqual %cv0 , %cv1 : vector <3 xi32 >
1300
+
1301
+ // CHECK: return %[[RET]]
1302
+ return %0 : vector <3 xi1 >
1303
+ }
1304
+
1305
+ // -----
1306
+
1142
1307
//===----------------------------------------------------------------------===//
1143
1308
// spirv.LeftShiftLogical
1144
1309
//===----------------------------------------------------------------------===//
0 commit comments