@@ -1283,8 +1283,7 @@ define i1 @shl_nsw_x8_slt_x7(i8 %start, i8 %high) {
1283
1283
; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[START_SHL_3]], [[HIGH]]
1284
1284
; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
1285
1285
; CHECK-NEXT: [[START_MUL_7:%.*]] = mul nsw i8 [[START]], 7
1286
- ; CHECK-NEXT: [[T_1:%.*]] = icmp slt i8 [[START_MUL_7]], [[HIGH]]
1287
- ; CHECK-NEXT: ret i1 [[T_1]]
1286
+ ; CHECK-NEXT: ret i1 true
1288
1287
;
1289
1288
%c.0 = icmp sge i8 %high , 0
1290
1289
call void @llvm.assume (i1 %c.0 )
@@ -1327,11 +1326,9 @@ define i1 @shl_nsw_sign_implication(i8 %x) {
1327
1326
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[X]], 0
1328
1327
; CHECK-NEXT: br i1 [[CMP1]], label [[IF:%.*]], label [[ELSE:%.*]]
1329
1328
; CHECK: if:
1330
- ; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i8 [[SHL]], 0
1331
- ; CHECK-NEXT: ret i1 [[CMP2]]
1329
+ ; CHECK-NEXT: ret i1 true
1332
1330
; CHECK: else:
1333
- ; CHECK-NEXT: [[CMP3:%.*]] = icmp sge i8 [[SHL]], 0
1334
- ; CHECK-NEXT: ret i1 [[CMP3]]
1331
+ ; CHECK-NEXT: ret i1 true
1335
1332
;
1336
1333
%shl = shl nsw i8 %x , 2
1337
1334
%cmp1 = icmp slt i8 %x , 0
@@ -1361,3 +1358,37 @@ define i1 @shl_nsw_by_bw_minus_1(i64 %x) {
1361
1358
%t.1 = icmp slt i64 %x , 0
1362
1359
ret i1 %t.1
1363
1360
}
1361
+
1362
+ ; Shift returns poison in this case, just make sure we don't crash.
1363
+ define i1 @shl_nsw_by_bw (i64 %x ) {
1364
+ ; CHECK-LABEL: @shl_nsw_by_bw(
1365
+ ; CHECK-NEXT: [[X_SHL:%.*]] = shl nsw i64 [[X:%.*]], 64
1366
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp slt i64 [[X_SHL]], 0
1367
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
1368
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp slt i64 [[X]], 0
1369
+ ; CHECK-NEXT: ret i1 [[T_1]]
1370
+ ;
1371
+ %x.shl = shl nsw i64 %x , 64
1372
+ %c.1 = icmp slt i64 %x.shl , 0
1373
+ call void @llvm.assume (i1 %c.1 )
1374
+
1375
+ %t.1 = icmp slt i64 %x , 0
1376
+ ret i1 %t.1
1377
+ }
1378
+
1379
+ ; Shift returns poison in this case, just make sure we don't crash.
1380
+ define i1 @shl_nsw_by_bw_plus_1 (i64 %x ) {
1381
+ ; CHECK-LABEL: @shl_nsw_by_bw_plus_1(
1382
+ ; CHECK-NEXT: [[X_SHL:%.*]] = shl nsw i64 [[X:%.*]], 65
1383
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp slt i64 [[X_SHL]], 0
1384
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
1385
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp slt i64 [[X]], 0
1386
+ ; CHECK-NEXT: ret i1 [[T_1]]
1387
+ ;
1388
+ %x.shl = shl nsw i64 %x , 65
1389
+ %c.1 = icmp slt i64 %x.shl , 0
1390
+ call void @llvm.assume (i1 %c.1 )
1391
+
1392
+ %t.1 = icmp slt i64 %x , 0
1393
+ ret i1 %t.1
1394
+ }
0 commit comments