1602e1cbcSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 28ebb3eacSBjorn Pettersson; RUN: opt < %s -passes=ipsccp -S | FileCheck %s 38a36594aSFlorian Hahn 48a36594aSFlorian Hahn; x = [10, 21), y = [100, 201) 58a36594aSFlorian Hahn; x + y = [110, 221) 68a36594aSFlorian Hahndefine internal i1 @f.add(i32 %x, i32 %y) { 7602e1cbcSFlorian Hahn; CHECK-LABEL: @f.add( 872121a20SFlorian Hahn; CHECK-NEXT: [[A_1:%.*]] = add nuw nsw i32 [[X:%.*]], [[Y:%.*]] 9602e1cbcSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i32 [[A_1]], 219 10602e1cbcSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i32 [[A_1]], 111 11602e1cbcSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[A_1]], 150 12602e1cbcSFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i32 [[A_1]], 150 1372121a20SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]] 1472121a20SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false 15602e1cbcSFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]] 16602e1cbcSFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]] 17602e1cbcSFlorian Hahn; CHECK-NEXT: [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]] 18602e1cbcSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_5]] 198a36594aSFlorian Hahn; 208a36594aSFlorian Hahn %a.1 = add i32 %x, %y 218a36594aSFlorian Hahn %c.1 = icmp sgt i32 %a.1, 220 228a36594aSFlorian Hahn %c.2 = icmp sgt i32 %a.1, 219 238a36594aSFlorian Hahn %c.3 = icmp slt i32 %a.1, 110 248a36594aSFlorian Hahn %c.4 = icmp slt i32 %a.1, 111 258a36594aSFlorian Hahn %c.5 = icmp eq i32 %a.1, 150 268a36594aSFlorian Hahn %c.6 = icmp slt i32 %a.1, 150 278a36594aSFlorian Hahn %res.1 = add i1 %c.1, %c.2 288a36594aSFlorian Hahn %res.2 = add i1 %res.1, %c.3 298a36594aSFlorian Hahn %res.3 = add i1 %res.2, %c.4 308a36594aSFlorian Hahn %res.4 = add i1 %res.3, %c.5 318a36594aSFlorian Hahn %res.5 = add i1 %res.4, %c.6 328a36594aSFlorian Hahn ret i1 %res.5 338a36594aSFlorian Hahn} 348a36594aSFlorian Hahn 358a36594aSFlorian Hahndefine i1 @caller.add() { 36602e1cbcSFlorian Hahn; CHECK-LABEL: @caller.add( 37602e1cbcSFlorian Hahn; CHECK-NEXT: [[CALL_1:%.*]] = tail call i1 @f.add(i32 10, i32 100) 38602e1cbcSFlorian Hahn; CHECK-NEXT: [[CALL_2:%.*]] = tail call i1 @f.add(i32 20, i32 200) 39602e1cbcSFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]] 40602e1cbcSFlorian Hahn; CHECK-NEXT: ret i1 [[RES]] 418a36594aSFlorian Hahn; 428a36594aSFlorian Hahn %call.1 = tail call i1 @f.add(i32 10, i32 100) 438a36594aSFlorian Hahn %call.2 = tail call i1 @f.add(i32 20, i32 200) 448a36594aSFlorian Hahn %res = and i1 %call.1, %call.2 458a36594aSFlorian Hahn ret i1 %res 468a36594aSFlorian Hahn} 478a36594aSFlorian Hahn 488a36594aSFlorian Hahn 498a36594aSFlorian Hahn; x = [10, 21), y = [100, 201) 508a36594aSFlorian Hahn; x - y = [-190, -79) 518a36594aSFlorian Hahndefine internal i1 @f.sub(i32 %x, i32 %y) { 52602e1cbcSFlorian Hahn; CHECK-LABEL: @f.sub( 53*7d102133SFlorian Hahn; CHECK-NEXT: [[A_1:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]] 54602e1cbcSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i32 [[A_1]], -81 55602e1cbcSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i32 [[A_1]], -189 56602e1cbcSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[A_1]], -150 57602e1cbcSFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i32 [[A_1]], -150 5872121a20SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]] 5972121a20SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false 60602e1cbcSFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]] 61602e1cbcSFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]] 62602e1cbcSFlorian Hahn; CHECK-NEXT: [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]] 63602e1cbcSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_5]] 648a36594aSFlorian Hahn; 658a36594aSFlorian Hahn %a.1 = sub i32 %x, %y 668a36594aSFlorian Hahn %c.1 = icmp sgt i32 %a.1, -80 678a36594aSFlorian Hahn %c.2 = icmp sgt i32 %a.1, -81 688a36594aSFlorian Hahn %c.3 = icmp slt i32 %a.1, -190 698a36594aSFlorian Hahn %c.4 = icmp slt i32 %a.1, -189 708a36594aSFlorian Hahn %c.5 = icmp eq i32 %a.1, -150 718a36594aSFlorian Hahn %c.6 = icmp slt i32 %a.1, -150 728a36594aSFlorian Hahn %res.1 = add i1 %c.1, %c.2 738a36594aSFlorian Hahn %res.2 = add i1 %res.1, %c.3 748a36594aSFlorian Hahn %res.3 = add i1 %res.2, %c.4 758a36594aSFlorian Hahn %res.4 = add i1 %res.3, %c.5 768a36594aSFlorian Hahn %res.5 = add i1 %res.4, %c.6 778a36594aSFlorian Hahn ret i1 %res.5 788a36594aSFlorian Hahn} 798a36594aSFlorian Hahn 808a36594aSFlorian Hahndefine i1 @caller.sub() { 81602e1cbcSFlorian Hahn; CHECK-LABEL: @caller.sub( 82602e1cbcSFlorian Hahn; CHECK-NEXT: [[CALL_1:%.*]] = tail call i1 @f.sub(i32 10, i32 100) 83602e1cbcSFlorian Hahn; CHECK-NEXT: [[CALL_2:%.*]] = tail call i1 @f.sub(i32 20, i32 200) 84602e1cbcSFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]] 85602e1cbcSFlorian Hahn; CHECK-NEXT: ret i1 [[RES]] 868a36594aSFlorian Hahn; 878a36594aSFlorian Hahn %call.1 = tail call i1 @f.sub(i32 10, i32 100) 888a36594aSFlorian Hahn %call.2 = tail call i1 @f.sub(i32 20, i32 200) 898a36594aSFlorian Hahn %res = and i1 %call.1, %call.2 908a36594aSFlorian Hahn ret i1 %res 918a36594aSFlorian Hahn} 928a36594aSFlorian Hahn 938a36594aSFlorian Hahn; x = [10, 21), y = [100, 201) 948a36594aSFlorian Hahn; x * y = [1000, 4001) 958a36594aSFlorian Hahndefine internal i1 @f.mul(i32 %x, i32 %y) { 96602e1cbcSFlorian Hahn; CHECK-LABEL: @f.mul( 97*7d102133SFlorian Hahn; CHECK-NEXT: [[A_1:%.*]] = mul nuw nsw i32 [[X:%.*]], [[Y:%.*]] 98602e1cbcSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i32 [[A_1]], 3999 99602e1cbcSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i32 [[A_1]], 1001 100602e1cbcSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[A_1]], 1500 101602e1cbcSFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i32 [[A_1]], 1500 10272121a20SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]] 10372121a20SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false 104602e1cbcSFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]] 105602e1cbcSFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]] 106602e1cbcSFlorian Hahn; CHECK-NEXT: [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]] 107602e1cbcSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_5]] 1088a36594aSFlorian Hahn; 1098a36594aSFlorian Hahn %a.1 = mul i32 %x, %y 1108a36594aSFlorian Hahn %c.1 = icmp sgt i32 %a.1, 4000 1118a36594aSFlorian Hahn %c.2 = icmp sgt i32 %a.1, 3999 1128a36594aSFlorian Hahn %c.3 = icmp slt i32 %a.1, 1000 1138a36594aSFlorian Hahn %c.4 = icmp slt i32 %a.1, 1001 1148a36594aSFlorian Hahn %c.5 = icmp eq i32 %a.1, 1500 1158a36594aSFlorian Hahn %c.6 = icmp slt i32 %a.1, 1500 1168a36594aSFlorian Hahn %res.1 = add i1 %c.1, %c.2 1178a36594aSFlorian Hahn %res.2 = add i1 %res.1, %c.3 1188a36594aSFlorian Hahn %res.3 = add i1 %res.2, %c.4 1198a36594aSFlorian Hahn %res.4 = add i1 %res.3, %c.5 1208a36594aSFlorian Hahn %res.5 = add i1 %res.4, %c.6 1218a36594aSFlorian Hahn ret i1 %res.5 1228a36594aSFlorian Hahn} 1238a36594aSFlorian Hahn 1248a36594aSFlorian Hahndefine i1 @caller.mul() { 125602e1cbcSFlorian Hahn; CHECK-LABEL: @caller.mul( 126602e1cbcSFlorian Hahn; CHECK-NEXT: [[CALL_1:%.*]] = tail call i1 @f.mul(i32 10, i32 100) 127602e1cbcSFlorian Hahn; CHECK-NEXT: [[CALL_2:%.*]] = tail call i1 @f.mul(i32 20, i32 200) 128602e1cbcSFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]] 129602e1cbcSFlorian Hahn; CHECK-NEXT: ret i1 [[RES]] 1308a36594aSFlorian Hahn; 1318a36594aSFlorian Hahn %call.1 = tail call i1 @f.mul(i32 10, i32 100) 1328a36594aSFlorian Hahn %call.2 = tail call i1 @f.mul(i32 20, i32 200) 1338a36594aSFlorian Hahn %res = and i1 %call.1, %call.2 1348a36594aSFlorian Hahn ret i1 %res 1358a36594aSFlorian Hahn} 136