189 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -S -passes=inline %s | FileCheck %s3; RUN: opt -S -passes='cgscc(inline)' %s | FileCheck %s4; RUN: opt -S -passes='module-inline' %s | FileCheck %s5 6declare void @foo()7declare void @bar()8 9define void @callee(ptr %arg) {10; CHECK-LABEL: define void @callee11; CHECK-SAME: (ptr [[ARG:%.*]]) {12; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[ARG]], null13; CHECK-NEXT: br i1 [[CMP]], label [[EXPENSIVE:%.*]], label [[DONE:%.*]]14; CHECK: expensive:15; CHECK-NEXT: call void @foo()16; CHECK-NEXT: call void @foo()17; CHECK-NEXT: call void @foo()18; CHECK-NEXT: call void @foo()19; CHECK-NEXT: call void @foo()20; CHECK-NEXT: call void @foo()21; CHECK-NEXT: call void @foo()22; CHECK-NEXT: call void @foo()23; CHECK-NEXT: call void @foo()24; CHECK-NEXT: call void @foo()25; CHECK-NEXT: ret void26; CHECK: done:27; CHECK-NEXT: call void @bar()28; CHECK-NEXT: ret void29;30 %cmp = icmp eq ptr %arg, null31 br i1 %cmp, label %expensive, label %done32 33; This block is designed to be too expensive to inline. We can only inline34; callee if this block is known to be dead.35expensive:36 call void @foo()37 call void @foo()38 call void @foo()39 call void @foo()40 call void @foo()41 call void @foo()42 call void @foo()43 call void @foo()44 call void @foo()45 call void @foo()46 ret void47 48done:49 call void @bar()50 ret void51}52 53; Positive test - arg is known non null54define void @caller(ptr nonnull %arg) {55; CHECK-LABEL: define void @caller56; CHECK-SAME: (ptr nonnull [[ARG:%.*]]) {57; CHECK-NEXT: call void @bar()58; CHECK-NEXT: ret void59;60 call void @callee(ptr nonnull %arg)61 ret void62}63 64; Negative test - arg is not known to be non null65define void @caller2(ptr %arg) {66; CHECK-LABEL: define void @caller267; CHECK-SAME: (ptr [[ARG:%.*]]) {68; CHECK-NEXT: call void @callee(ptr [[ARG]])69; CHECK-NEXT: ret void70;71 call void @callee(ptr %arg)72 ret void73}74 75define void @caller3(ptr %arg) {76; CHECK-LABEL: define void @caller377; CHECK-SAME: (ptr [[ARG:%.*]]) {78; CHECK-NEXT: [[CMP_I:%.*]] = icmp eq ptr [[ARG]], null79; CHECK-NEXT: br i1 [[CMP_I]], label [[EXPENSIVE_I:%.*]], label [[DONE_I:%.*]]80; CHECK: expensive.i:81; CHECK-NEXT: call void @foo()82; CHECK-NEXT: call void @foo()83; CHECK-NEXT: call void @foo()84; CHECK-NEXT: call void @foo()85; CHECK-NEXT: call void @foo()86; CHECK-NEXT: call void @foo()87; CHECK-NEXT: call void @foo()88; CHECK-NEXT: call void @foo()89; CHECK-NEXT: call void @foo()90; CHECK-NEXT: call void @foo()91; CHECK-NEXT: br label [[CALLEE_EXIT:%.*]]92; CHECK: done.i:93; CHECK-NEXT: call void @bar()94; CHECK-NEXT: br label [[CALLEE_EXIT]]95; CHECK: callee.exit:96; CHECK-NEXT: ret void97;98 call void @callee(ptr nonnull %arg)99 ret void100}101 102define void @caller4(ptr dereferenceable(8) %arg) {103; CHECK-LABEL: define void @caller4104; CHECK-SAME: (ptr dereferenceable(8) [[ARG:%.*]]) {105; CHECK-NEXT: call void @callee(ptr dereferenceable(8) [[ARG]])106; CHECK-NEXT: ret void107;108 call void @callee(ptr dereferenceable(8) %arg)109 ret void110}111 112define void @caller5(ptr dereferenceable(8) %arg) {113; CHECK-LABEL: define void @caller5114; CHECK-SAME: (ptr dereferenceable(8) [[ARG:%.*]]) {115; CHECK-NEXT: call void @callee(ptr [[ARG]])116; CHECK-NEXT: ret void117;118 call void @callee(ptr %arg)119 ret void120}121 122define void @caller6(ptr %arg) {123; CHECK-LABEL: define void @caller6124; CHECK-SAME: (ptr [[ARG:%.*]]) {125; CHECK-NEXT: call void @callee(ptr dereferenceable(8) [[ARG]])126; CHECK-NEXT: ret void127;128 call void @callee(ptr dereferenceable(8) %arg)129 ret void130}131 132declare ptr @buz()133define nonnull ptr @callee7() {134; CHECK-LABEL: define nonnull ptr @callee7() {135; CHECK-NEXT: [[R:%.*]] = call ptr @buz() #[[ATTR0:[0-9]+]]136; CHECK-NEXT: ret ptr [[R]]137;138 %r = call ptr @buz() willreturn nounwind139 ret ptr %r140}141 142define ptr @caller7() {143; CHECK-LABEL: define ptr @caller7() {144; CHECK-NEXT: [[R_I:%.*]] = call nonnull ptr @buz() #[[ATTR0]]145; CHECK-NEXT: ret ptr [[R_I]]146;147 %r = call ptr @callee7()148 ret ptr %r149}150 151define nonnull ptr @callee8() {152; CHECK-LABEL: define nonnull ptr @callee8() {153; CHECK-NEXT: [[R:%.*]] = call ptr @buz()154; CHECK-NEXT: ret ptr [[R]]155;156 %r = call ptr @buz()157 ret ptr %r158}159 160define ptr @caller8() {161; CHECK-LABEL: define ptr @caller8() {162; CHECK-NEXT: [[R_I:%.*]] = call nonnull ptr @buz()163; CHECK-NEXT: ret ptr [[R_I]]164;165 %r = call nonnull ptr @callee8()166 ret ptr %r167}168 169define ptr @callee9() {170; CHECK-LABEL: define ptr @callee9() {171; CHECK-NEXT: [[R:%.*]] = call ptr @buz()172; CHECK-NEXT: call void @foo() #[[ATTR1:[0-9]+]]173; CHECK-NEXT: ret ptr [[R]]174;175 %r = call ptr @buz()176 call void @foo() nounwind177 ret ptr %r178}179 180define ptr @caller9() {181; CHECK-LABEL: define ptr @caller9() {182; CHECK-NEXT: [[R_I:%.*]] = call ptr @buz()183; CHECK-NEXT: call void @foo() #[[ATTR1]]184; CHECK-NEXT: ret ptr [[R_I]]185;186 %r = call nonnull ptr @callee9()187 ret ptr %r188}189