136 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=ipsccp -S | FileCheck %s3 4; x = [10, 21), y = [100, 201)5; x + y = [110, 221)6define internal i1 @f.add(i32 %x, i32 %y) {7; CHECK-LABEL: @f.add(8; CHECK-NEXT: [[A_1:%.*]] = add nuw nsw i32 [[X:%.*]], [[Y:%.*]]9; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i32 [[A_1]], 21910; CHECK-NEXT: [[C_4:%.*]] = icmp slt i32 [[A_1]], 11111; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[A_1]], 15012; CHECK-NEXT: [[C_6:%.*]] = icmp slt i32 [[A_1]], 15013; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]14; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false15; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]]16; CHECK-NEXT: [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]]17; CHECK-NEXT: [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]]18; CHECK-NEXT: ret i1 [[RES_5]]19;20 %a.1 = add i32 %x, %y21 %c.1 = icmp sgt i32 %a.1, 22022 %c.2 = icmp sgt i32 %a.1, 21923 %c.3 = icmp slt i32 %a.1, 11024 %c.4 = icmp slt i32 %a.1, 11125 %c.5 = icmp eq i32 %a.1, 15026 %c.6 = icmp slt i32 %a.1, 15027 %res.1 = add i1 %c.1, %c.228 %res.2 = add i1 %res.1, %c.329 %res.3 = add i1 %res.2, %c.430 %res.4 = add i1 %res.3, %c.531 %res.5 = add i1 %res.4, %c.632 ret i1 %res.533}34 35define i1 @caller.add() {36; CHECK-LABEL: @caller.add(37; CHECK-NEXT: [[CALL_1:%.*]] = tail call i1 @f.add(i32 10, i32 100)38; CHECK-NEXT: [[CALL_2:%.*]] = tail call i1 @f.add(i32 20, i32 200)39; CHECK-NEXT: [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]]40; CHECK-NEXT: ret i1 [[RES]]41;42 %call.1 = tail call i1 @f.add(i32 10, i32 100)43 %call.2 = tail call i1 @f.add(i32 20, i32 200)44 %res = and i1 %call.1, %call.245 ret i1 %res46}47 48 49; x = [10, 21), y = [100, 201)50; x - y = [-190, -79)51define internal i1 @f.sub(i32 %x, i32 %y) {52; CHECK-LABEL: @f.sub(53; CHECK-NEXT: [[A_1:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]54; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i32 [[A_1]], -8155; CHECK-NEXT: [[C_4:%.*]] = icmp slt i32 [[A_1]], -18956; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[A_1]], -15057; CHECK-NEXT: [[C_6:%.*]] = icmp slt i32 [[A_1]], -15058; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]59; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false60; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]]61; CHECK-NEXT: [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]]62; CHECK-NEXT: [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]]63; CHECK-NEXT: ret i1 [[RES_5]]64;65 %a.1 = sub i32 %x, %y66 %c.1 = icmp sgt i32 %a.1, -8067 %c.2 = icmp sgt i32 %a.1, -8168 %c.3 = icmp slt i32 %a.1, -19069 %c.4 = icmp slt i32 %a.1, -18970 %c.5 = icmp eq i32 %a.1, -15071 %c.6 = icmp slt i32 %a.1, -15072 %res.1 = add i1 %c.1, %c.273 %res.2 = add i1 %res.1, %c.374 %res.3 = add i1 %res.2, %c.475 %res.4 = add i1 %res.3, %c.576 %res.5 = add i1 %res.4, %c.677 ret i1 %res.578}79 80define i1 @caller.sub() {81; CHECK-LABEL: @caller.sub(82; CHECK-NEXT: [[CALL_1:%.*]] = tail call i1 @f.sub(i32 10, i32 100)83; CHECK-NEXT: [[CALL_2:%.*]] = tail call i1 @f.sub(i32 20, i32 200)84; CHECK-NEXT: [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]]85; CHECK-NEXT: ret i1 [[RES]]86;87 %call.1 = tail call i1 @f.sub(i32 10, i32 100)88 %call.2 = tail call i1 @f.sub(i32 20, i32 200)89 %res = and i1 %call.1, %call.290 ret i1 %res91}92 93; x = [10, 21), y = [100, 201)94; x * y = [1000, 4001)95define internal i1 @f.mul(i32 %x, i32 %y) {96; CHECK-LABEL: @f.mul(97; CHECK-NEXT: [[A_1:%.*]] = mul nuw nsw i32 [[X:%.*]], [[Y:%.*]]98; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i32 [[A_1]], 399999; CHECK-NEXT: [[C_4:%.*]] = icmp slt i32 [[A_1]], 1001100; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[A_1]], 1500101; CHECK-NEXT: [[C_6:%.*]] = icmp slt i32 [[A_1]], 1500102; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]103; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false104; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]]105; CHECK-NEXT: [[RES_4:%.*]] = add i1 [[RES_3]], [[C_5]]106; CHECK-NEXT: [[RES_5:%.*]] = add i1 [[RES_4]], [[C_6]]107; CHECK-NEXT: ret i1 [[RES_5]]108;109 %a.1 = mul i32 %x, %y110 %c.1 = icmp sgt i32 %a.1, 4000111 %c.2 = icmp sgt i32 %a.1, 3999112 %c.3 = icmp slt i32 %a.1, 1000113 %c.4 = icmp slt i32 %a.1, 1001114 %c.5 = icmp eq i32 %a.1, 1500115 %c.6 = icmp slt i32 %a.1, 1500116 %res.1 = add i1 %c.1, %c.2117 %res.2 = add i1 %res.1, %c.3118 %res.3 = add i1 %res.2, %c.4119 %res.4 = add i1 %res.3, %c.5120 %res.5 = add i1 %res.4, %c.6121 ret i1 %res.5122}123 124define i1 @caller.mul() {125; CHECK-LABEL: @caller.mul(126; CHECK-NEXT: [[CALL_1:%.*]] = tail call i1 @f.mul(i32 10, i32 100)127; CHECK-NEXT: [[CALL_2:%.*]] = tail call i1 @f.mul(i32 20, i32 200)128; CHECK-NEXT: [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]]129; CHECK-NEXT: ret i1 [[RES]]130;131 %call.1 = tail call i1 @f.mul(i32 10, i32 100)132 %call.2 = tail call i1 @f.mul(i32 20, i32 200)133 %res = and i1 %call.1, %call.2134 ret i1 %res135}136