@@ -1140,3 +1140,267 @@ define <2 x i1> @heterogeneous_constvector(<2 x i8> %x) {
1140
1140
%c = icmp ult <2 x i8 > %x , <i8 undef , i8 poison>
1141
1141
ret <2 x i1 > %c
1142
1142
}
1143
+
1144
+ define i1 @icmp_eq_non_zero_range_attr (i8 range(i8 1 , 0 ) %i ) {
1145
+ ; CHECK-LABEL: @icmp_eq_non_zero_range_attr(
1146
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I:%.*]], 0
1147
+ ; CHECK-NEXT: ret i1 [[CMP]]
1148
+ ;
1149
+ %cmp = icmp eq i8 %i , 0
1150
+ ret i1 %cmp
1151
+ }
1152
+
1153
+ define i1 @neg_icmp_eq_non_zero_range_attr (i8 range(i8 -1 , 1 ) %i ) {
1154
+ ; CHECK-LABEL: @neg_icmp_eq_non_zero_range_attr(
1155
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I:%.*]], 0
1156
+ ; CHECK-NEXT: ret i1 [[CMP]]
1157
+ ;
1158
+ %cmp = icmp eq i8 %i , 0
1159
+ ret i1 %cmp
1160
+ }
1161
+
1162
+ declare range(i8 1 , 0 ) i8 @returns_non_zero_range_helper ()
1163
+ declare range(i8 -1 , 1 ) i8 @returns_contain_zero_range_helper ()
1164
+
1165
+ define i1 @icmp_eq_non_zero_range_return () {
1166
+ ; CHECK-LABEL: @icmp_eq_non_zero_range_return(
1167
+ ; CHECK-NEXT: [[I:%.*]] = call i8 @returns_non_zero_range_helper()
1168
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 0
1169
+ ; CHECK-NEXT: ret i1 [[CMP]]
1170
+ ;
1171
+ %i = call i8 @returns_non_zero_range_helper ()
1172
+ %cmp = icmp eq i8 %i , 0
1173
+ ret i1 %cmp
1174
+ }
1175
+
1176
+ define i1 @neg_icmp_eq_non_zero_range_return () {
1177
+ ; CHECK-LABEL: @neg_icmp_eq_non_zero_range_return(
1178
+ ; CHECK-NEXT: [[I:%.*]] = call i8 @returns_contain_zero_range_helper()
1179
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 0
1180
+ ; CHECK-NEXT: ret i1 [[CMP]]
1181
+ ;
1182
+ %i = call i8 @returns_contain_zero_range_helper ()
1183
+ %cmp = icmp eq i8 %i , 0
1184
+ ret i1 %cmp
1185
+ }
1186
+
1187
+ declare i8 @returns_i8_helper ()
1188
+
1189
+ define i1 @icmp_eq_non_zero_range_call () {
1190
+ ; CHECK-LABEL: @icmp_eq_non_zero_range_call(
1191
+ ; CHECK-NEXT: [[I:%.*]] = call range(i8 1, 0) i8 @returns_i8_helper()
1192
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 0
1193
+ ; CHECK-NEXT: ret i1 [[CMP]]
1194
+ ;
1195
+ %i = call range(i8 1 , 0 ) i8 @returns_i8_helper ()
1196
+ %cmp = icmp eq i8 %i , 0
1197
+ ret i1 %cmp
1198
+ }
1199
+
1200
+ define i1 @neg_icmp_eq_non_zero_range_call () {
1201
+ ; CHECK-LABEL: @neg_icmp_eq_non_zero_range_call(
1202
+ ; CHECK-NEXT: [[I:%.*]] = call range(i8 -1, 1) i8 @returns_i8_helper()
1203
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 0
1204
+ ; CHECK-NEXT: ret i1 [[CMP]]
1205
+ ;
1206
+ %i = call range(i8 -1 , 1 ) i8 @returns_i8_helper ()
1207
+ %cmp = icmp eq i8 %i , 0
1208
+ ret i1 %cmp
1209
+ }
1210
+
1211
+ define <2 x i1 > @icmp_eq_non_zero_range_attr_vec (<2 x i8 > range(i8 1 , 0 ) %i ) {
1212
+ ; CHECK-LABEL: @icmp_eq_non_zero_range_attr_vec(
1213
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I:%.*]], zeroinitializer
1214
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1215
+ ;
1216
+ %cmp = icmp eq <2 x i8 > %i , <i8 0 , i8 0 >
1217
+ ret <2 x i1 > %cmp
1218
+ }
1219
+
1220
+ define <2 x i1 > @neg_icmp_eq_non_zero_range_attr_vec (<2 x i8 > range(i8 -1 , 1 ) %i ) {
1221
+ ; CHECK-LABEL: @neg_icmp_eq_non_zero_range_attr_vec(
1222
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I:%.*]], zeroinitializer
1223
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1224
+ ;
1225
+ %cmp = icmp eq <2 x i8 > %i , <i8 0 , i8 0 >
1226
+ ret <2 x i1 > %cmp
1227
+ }
1228
+
1229
+ declare range(i8 1 , 0 ) <2 x i8 > @returns_non_zero_range_helper_vec ()
1230
+ declare range(i8 -1 , 1 ) <2 x i8 > @returns_contain_zero_range_helper_vec ()
1231
+
1232
+ define <2 x i1 > @icmp_eq_non_zero_range_return_vec () {
1233
+ ; CHECK-LABEL: @icmp_eq_non_zero_range_return_vec(
1234
+ ; CHECK-NEXT: [[I:%.*]] = call <2 x i8> @returns_non_zero_range_helper_vec()
1235
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], zeroinitializer
1236
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1237
+ ;
1238
+ %i = call <2 x i8 > @returns_non_zero_range_helper_vec ()
1239
+ %cmp = icmp eq <2 x i8 > %i , <i8 0 , i8 0 >
1240
+ ret <2 x i1 > %cmp
1241
+ }
1242
+
1243
+ define <2 x i1 > @neg_icmp_eq_non_zero_range_return_vec () {
1244
+ ; CHECK-LABEL: @neg_icmp_eq_non_zero_range_return_vec(
1245
+ ; CHECK-NEXT: [[I:%.*]] = call <2 x i8> @returns_contain_zero_range_helper_vec()
1246
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], zeroinitializer
1247
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1248
+ ;
1249
+ %i = call <2 x i8 > @returns_contain_zero_range_helper_vec ()
1250
+ %cmp = icmp eq <2 x i8 > %i , <i8 0 , i8 0 >
1251
+ ret <2 x i1 > %cmp
1252
+ }
1253
+
1254
+ declare <2 x i8 > @returns_i8_helper_vec ()
1255
+
1256
+ define <2 x i1 > @icmp_eq_non_zero_range_call_vec () {
1257
+ ; CHECK-LABEL: @icmp_eq_non_zero_range_call_vec(
1258
+ ; CHECK-NEXT: [[I:%.*]] = call range(i8 1, 0) <2 x i8> @returns_i8_helper_vec()
1259
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], zeroinitializer
1260
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1261
+ ;
1262
+ %i = call range(i8 1 , 0 ) <2 x i8 > @returns_i8_helper_vec ()
1263
+ %cmp = icmp eq <2 x i8 > %i , <i8 0 , i8 0 >
1264
+ ret <2 x i1 > %cmp
1265
+ }
1266
+
1267
+ define <2 x i1 > @neg_icmp_eq_non_zero_range_call_vec () {
1268
+ ; CHECK-LABEL: @neg_icmp_eq_non_zero_range_call_vec(
1269
+ ; CHECK-NEXT: [[I:%.*]] = call range(i8 -1, 1) <2 x i8> @returns_i8_helper_vec()
1270
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], zeroinitializer
1271
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1272
+ ;
1273
+ %i = call range(i8 -1 , 1 ) <2 x i8 > @returns_i8_helper_vec ()
1274
+ %cmp = icmp eq <2 x i8 > %i , <i8 0 , i8 0 >
1275
+ ret <2 x i1 > %cmp
1276
+ }
1277
+
1278
+ define i1 @icmp_eq_constant_range_attr (i8 range(i8 0 , 10 ) %i ) {
1279
+ ; CHECK-LABEL: @icmp_eq_constant_range_attr(
1280
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I:%.*]], 10
1281
+ ; CHECK-NEXT: ret i1 [[CMP]]
1282
+ ;
1283
+ %cmp = icmp eq i8 %i , 10
1284
+ ret i1 %cmp
1285
+ }
1286
+
1287
+ define i1 @neg_icmp_eq_constant_range_attr (i8 range(i8 0 , 11 ) %i ) {
1288
+ ; CHECK-LABEL: @neg_icmp_eq_constant_range_attr(
1289
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I:%.*]], 10
1290
+ ; CHECK-NEXT: ret i1 [[CMP]]
1291
+ ;
1292
+ %cmp = icmp eq i8 %i , 10
1293
+ ret i1 %cmp
1294
+ }
1295
+
1296
+ declare range(i8 1 , 0 ) i8 @returns_non_ten_range_helper ()
1297
+ declare range(i8 -1 , 1 ) i8 @returns_contain_ten_range_helper ()
1298
+
1299
+ define i1 @icmp_eq_constant_range_return () {
1300
+ ; CHECK-LABEL: @icmp_eq_constant_range_return(
1301
+ ; CHECK-NEXT: [[I:%.*]] = call i8 @returns_non_ten_range_helper()
1302
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 10
1303
+ ; CHECK-NEXT: ret i1 [[CMP]]
1304
+ ;
1305
+ %i = call i8 @returns_non_ten_range_helper ()
1306
+ %cmp = icmp eq i8 %i , 10
1307
+ ret i1 %cmp
1308
+ }
1309
+
1310
+ define i1 @neg_icmp_eq_constant_range_return () {
1311
+ ; CHECK-LABEL: @neg_icmp_eq_constant_range_return(
1312
+ ; CHECK-NEXT: [[I:%.*]] = call i8 @returns_contain_ten_range_helper()
1313
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 10
1314
+ ; CHECK-NEXT: ret i1 [[CMP]]
1315
+ ;
1316
+ %i = call i8 @returns_contain_ten_range_helper ()
1317
+ %cmp = icmp eq i8 %i , 10
1318
+ ret i1 %cmp
1319
+ }
1320
+
1321
+ define i1 @icmp_eq_constant_range_call () {
1322
+ ; CHECK-LABEL: @icmp_eq_constant_range_call(
1323
+ ; CHECK-NEXT: [[I:%.*]] = call range(i8 0, 10) i8 @returns_i8_helper()
1324
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 10
1325
+ ; CHECK-NEXT: ret i1 [[CMP]]
1326
+ ;
1327
+ %i = call range(i8 0 , 10 ) i8 @returns_i8_helper ()
1328
+ %cmp = icmp eq i8 %i , 10
1329
+ ret i1 %cmp
1330
+ }
1331
+
1332
+ define i1 @neg_icmp_eq_constant_range_call () {
1333
+ ; CHECK-LABEL: @neg_icmp_eq_constant_range_call(
1334
+ ; CHECK-NEXT: [[I:%.*]] = call range(i8 0, 11) i8 @returns_i8_helper()
1335
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 10
1336
+ ; CHECK-NEXT: ret i1 [[CMP]]
1337
+ ;
1338
+ %i = call range(i8 0 , 11 ) i8 @returns_i8_helper ()
1339
+ %cmp = icmp eq i8 %i , 10
1340
+ ret i1 %cmp
1341
+ }
1342
+
1343
+ define <2 x i1 > @icmp_eq_constant_range_attr_vec (<2 x i8 > range(i8 0 , 10 ) %i ) {
1344
+ ; CHECK-LABEL: @icmp_eq_constant_range_attr_vec(
1345
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I:%.*]], <i8 10, i8 10>
1346
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1347
+ ;
1348
+ %cmp = icmp eq <2 x i8 > %i , <i8 10 , i8 10 >
1349
+ ret <2 x i1 > %cmp
1350
+ }
1351
+
1352
+ define <2 x i1 > @neg_icmp_eq_constant_range_attr_vec (<2 x i8 > range(i8 0 , 11 ) %i ) {
1353
+ ; CHECK-LABEL: @neg_icmp_eq_constant_range_attr_vec(
1354
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I:%.*]], <i8 10, i8 10>
1355
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1356
+ ;
1357
+ %cmp = icmp eq <2 x i8 > %i , <i8 10 , i8 10 >
1358
+ ret <2 x i1 > %cmp
1359
+ }
1360
+
1361
+ declare range(i8 0 , 10 ) <2 x i8 > @returns_non_ten_range_helper_vec ()
1362
+ declare range(i8 0 , 11 ) <2 x i8 > @returns_contain_ten_range_helper_vec ()
1363
+
1364
+ define <2 x i1 > @icmp_eq_constant_range_return_vec () {
1365
+ ; CHECK-LABEL: @icmp_eq_constant_range_return_vec(
1366
+ ; CHECK-NEXT: [[I:%.*]] = call <2 x i8> @returns_non_ten_range_helper_vec()
1367
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], <i8 10, i8 10>
1368
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1369
+ ;
1370
+ %i = call <2 x i8 > @returns_non_ten_range_helper_vec ()
1371
+ %cmp = icmp eq <2 x i8 > %i , <i8 10 , i8 10 >
1372
+ ret <2 x i1 > %cmp
1373
+ }
1374
+
1375
+ define <2 x i1 > @neg_icmp_eq_constant_range_return_vec () {
1376
+ ; CHECK-LABEL: @neg_icmp_eq_constant_range_return_vec(
1377
+ ; CHECK-NEXT: [[I:%.*]] = call <2 x i8> @returns_contain_ten_range_helper_vec()
1378
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], <i8 10, i8 10>
1379
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1380
+ ;
1381
+ %i = call <2 x i8 > @returns_contain_ten_range_helper_vec ()
1382
+ %cmp = icmp eq <2 x i8 > %i , <i8 10 , i8 10 >
1383
+ ret <2 x i1 > %cmp
1384
+ }
1385
+
1386
+ define <2 x i1 > @icmp_eq_constant_range_call_vec () {
1387
+ ; CHECK-LABEL: @icmp_eq_constant_range_call_vec(
1388
+ ; CHECK-NEXT: [[I:%.*]] = call range(i8 0, 10) <2 x i8> @returns_i8_helper_vec()
1389
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], <i8 10, i8 10>
1390
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1391
+ ;
1392
+ %i = call range(i8 0 , 10 ) <2 x i8 > @returns_i8_helper_vec ()
1393
+ %cmp = icmp eq <2 x i8 > %i , <i8 10 , i8 10 >
1394
+ ret <2 x i1 > %cmp
1395
+ }
1396
+
1397
+ define <2 x i1 > @neg_icmp_eq_constant_range_call_vec () {
1398
+ ; CHECK-LABEL: @neg_icmp_eq_constant_range_call_vec(
1399
+ ; CHECK-NEXT: [[I:%.*]] = call range(i8 0, 11) <2 x i8> @returns_i8_helper_vec()
1400
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], <i8 10, i8 10>
1401
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1402
+ ;
1403
+ %i = call range(i8 0 , 11 ) <2 x i8 > @returns_i8_helper_vec ()
1404
+ %cmp = icmp eq <2 x i8 > %i , <i8 10 , i8 10 >
1405
+ ret <2 x i1 > %cmp
1406
+ }
0 commit comments