136 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes=ipsccp --funcspec-min-function-size=1 -S < %s | FileCheck %s3 4define i32 @caller() {5; CHECK-LABEL: define i32 @caller() {6; CHECK-NEXT: [[ENTRY:.*:]]7; CHECK-NEXT: [[CALL1:%.*]] = call i32 @callee.specialized.1(i32 1)8; CHECK-NEXT: [[CALL2:%.*]] = call i32 @callee.specialized.2(i32 0)9; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 undef, 010; CHECK-NEXT: br i1 [[COND]], label %[[COMMON_RET:.*]], label %[[IF_THEN:.*]]11; CHECK: [[COMMON_RET]]:12; CHECK-NEXT: ret i32 013; CHECK: [[IF_THEN]]:14; CHECK-NEXT: ret i32 015;16entry:17 %call1 = call i32 @callee(i32 1)18 %call2 = call i32 @callee(i32 0)19 %cond = icmp eq i32 %call2, 020 br i1 %cond, label %common.ret, label %if.then21 22common.ret: ; preds = %entry23 ret i32 024 25if.then: ; preds = %entry26 %unreachable_call = call i32 @callee(i32 2)27 ret i32 %unreachable_call28}29 30define internal i32 @callee(i32 %arg) {31entry:32 br label %loop33 34loop: ; preds = %ai, %entry35 %add = or i32 0, 036 %cond = icmp eq i32 %arg, 137 br i1 %cond, label %exit, label %loop38 39exit: ; preds = %ai40 ret i32 041}42 43declare void @other_user(ptr)44 45define i32 @caller2() {46; CHECK-LABEL: define i32 @caller2() {47; CHECK-NEXT: [[ENTRY:.*:]]48; CHECK-NEXT: call void @other_user(ptr @callee2)49; CHECK-NEXT: [[CALL1:%.*]] = call i32 @callee2.specialized.3(i32 1)50; CHECK-NEXT: [[CALL2:%.*]] = call i32 @callee2.specialized.4(i32 0)51; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 undef, 052; CHECK-NEXT: br i1 [[COND]], label %[[COMMON_RET:.*]], label %[[IF_THEN:.*]]53; CHECK: [[COMMON_RET]]:54; CHECK-NEXT: ret i32 055; CHECK: [[IF_THEN]]:56; CHECK-NEXT: [[UNREACHABLE_CALL:%.*]] = call i32 @callee2.specialized.7(i32 2)57; CHECK-NEXT: ret i32 undef58;59entry:60 call void @other_user(ptr @callee2)61 %call1 = call i32 @callee2(i32 1)62 %call2 = call i32 @callee2(i32 0)63 %cond = icmp eq i32 %call2, 064 br i1 %cond, label %common.ret, label %if.then65 66common.ret: ; preds = %entry67 ret i32 068 69if.then: ; preds = %entry70 %unreachable_call = call i32 @callee2(i32 2)71 ret i32 %unreachable_call72}73 74define internal i32 @callee2(i32 %arg) {75; CHECK-LABEL: define internal i32 @callee2(76; CHECK-SAME: i32 [[ARG:%.*]]) {77; CHECK-NEXT: [[ENTRY:.*:]]78; CHECK-NEXT: br label %[[LOOP:.*]]79; CHECK: [[LOOP]]:80; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[ARG]], 181; CHECK-NEXT: br i1 [[COND]], label %[[EXIT:.*]], label %[[LOOP]]82; CHECK: [[EXIT]]:83; CHECK-NEXT: ret i32 084;85entry:86 br label %loop87 88loop: ; preds = %ai, %entry89 %add = or i32 0, 090 %cond = icmp eq i32 %arg, 191 br i1 %cond, label %exit, label %loop92 93exit: ; preds = %ai94 ret i32 095}96 97define i32 @caller3(i32 %arg) {98; CHECK-LABEL: define range(i32 2, 1) i32 @caller3(99; CHECK-SAME: i32 [[ARG:%.*]]) {100; CHECK-NEXT: [[ENTRY:.*:]]101; CHECK-NEXT: [[CALL1:%.*]] = call i32 @callee3.specialized.5(i32 0)102; CHECK-NEXT: [[CALL2:%.*]] = call i32 @callee3.specialized.6(i32 1)103; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 undef, 0104; CHECK-NEXT: br i1 [[COND]], label %[[COMMON_RET:.*]], label %[[IF_THEN:.*]]105; CHECK: [[COMMON_RET]]:106; CHECK-NEXT: ret i32 0107; CHECK: [[IF_THEN]]:108; CHECK-NEXT: ret i32 poison109;110entry:111 %call1 = call i32 @callee3(i32 0)112 %call2 = call i32 @callee3(i32 1)113 %cond = icmp eq i32 %call2, 0114 br i1 %cond, label %common.ret, label %if.then115 116common.ret: ; preds = %entry117 ret i32 0118 119if.then: ; preds = %entry120 %unreachable_call = call i32 @callee3(i32 %arg)121 ret i32 %unreachable_call122}123 124define internal i32 @callee3(i32 %arg) {125entry:126 br label %loop127 128loop: ; preds = %ai, %entry129 %add = or i32 0, 0130 %cond = icmp ne i32 %arg, 1131 br i1 %cond, label %exit, label %loop132 133exit: ; preds = %ai134 ret i32 %arg135}136