1; RUN: opt < %s -mtriple=systemz-unknown -mcpu=z15 -passes='cgscc(inline)' -disable-output \ 2; RUN: -debug-only=inline,systemztti 2>&1 | FileCheck %s 3; REQUIRES: asserts 4 5; Check that the inlining threshold is incremented for a function using an 6; argument only as a memcpy source. 7; 8; CHECK: Inlining calls in: root_function 9; CHECK: Inlining {{.*}} Call: call void @leaf_function_A(ptr %Dst) 10; CHECK: ++ SZTTI Adding inlining bonus: 1000 11; CHECK: Inlining {{.*}} Call: call void @leaf_function_B(ptr %Dst, ptr %Src) 12 13define void @leaf_function_A(ptr %Dst) { 14entry: 15 call void @llvm.memcpy.p0.p0.i64(ptr %Dst, ptr undef, i64 16, i1 false) 16 ret void 17} 18 19define void @leaf_function_B(ptr %Dst, ptr %Src) { 20entry: 21 call void @llvm.memcpy.p0.p0.i64(ptr %Dst, ptr %Src, i64 16, i1 false) 22 ret void 23} 24 25define void @root_function(ptr %Dst, ptr %Src) { 26entry: 27 call void @leaf_function_A(ptr %Dst) 28 call void @leaf_function_B(ptr %Dst, ptr %Src) 29 ret void 30} 31 32declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) 33 34; Check that the inlining threshold is incremented in case of multiple 35; accesses of a global variable by both caller and callee (which is true here 36; after the first call is inlined). 37; 38; CHECK: Inlining calls in: Caller1 39; CHECK: ++ SZTTI Adding inlining bonus: 1000 40 41@GlobV = external global i32 42 43define i64 @Caller1(i1 %cond1, i32 %0) #0 { 44entry: 45 br i1 %cond1, label %sw.bb3437, label %fake_end 46 47common.ret: ; preds = %fake_end, %sw.bb3437 48 ret i64 0 49 50sw.bb3437: ; preds = %entry 51 %call34652 = call i32 @Callee1(ptr null, i32 %0) 52 br label %common.ret 53 54fake_end: ; preds = %entry 55 %call57981 = call i32 @Callee1(ptr null, i32 0) 56 br label %common.ret 57} 58 59define i32 @Callee1(ptr %rex, i32 %parenfloor) #0 { 60entry: 61 %cmp21 = icmp slt i32 %parenfloor, 0 62 br i1 %cmp21, label %for.body, label %for.end 63 64common.ret: ; preds = %for.end, %for.body 65 ret i32 0 66 67for.body: ; preds = %entry 68 %0 = load i32, ptr @GlobV, align 4 69 %inc = or i32 %0, 1 70 store i32 %inc, ptr @GlobV, align 4 71 store i64 0, ptr %rex, align 8 72 %1 = load i32, ptr @GlobV, align 4 73 %inc28 = or i32 %1, 1 74 store i32 %inc28, ptr @GlobV, align 4 75 store i64 0, ptr %rex, align 8 76 %2 = load i32, ptr @GlobV, align 4 77 %inc35 = or i32 %2, 1 78 store i32 %inc35, ptr @GlobV, align 4 79 store i32 0, ptr %rex, align 8 80 br label %common.ret 81 82for.end: ; preds = %entry 83 store i32 0, ptr @GlobV, align 4 84 store i32 0, ptr %rex, align 8 85 %3 = load i32, ptr @GlobV, align 4 86 %inc42 = or i32 %3, 1 87 store i32 %inc42, ptr @GlobV, align 4 88 store i32 0, ptr %rex, align 8 89 %4 = load i32, ptr @GlobV, align 4 90 %inc48 = or i32 %4, 1 91 store i32 %inc48, ptr @GlobV, align 4 92 br label %common.ret 93} 94 95; Check that the inlining threshold is incremented for a function that is 96; accessing an alloca of the caller multiple times. 97; 98; CHECK: Inlining calls in: Caller2 99; CHECK: ++ SZTTI Adding inlining bonus: 550 100 101define i1 @Caller2() { 102entry: 103 %A = alloca [80 x i64], align 8 104 call void @Callee2(ptr %A) 105 ret i1 false 106} 107 108define void @Callee2(ptr nocapture readonly %Arg) { 109entry: 110 %nonzero = getelementptr i8, ptr %Arg, i64 48 111 %0 = load i32, ptr %nonzero, align 8 112 %tobool1.not = icmp eq i32 %0, 0 113 br i1 %tobool1.not, label %if.else38, label %if.then2 114 115if.then2: ; preds = %entry 116 %1 = load i32, ptr %Arg, align 4 117 %tobool4.not = icmp eq i32 %1, 0 118 br i1 %tobool4.not, label %common.ret, label %if.then5 119 120if.then5: ; preds = %if.then2 121 %2 = load double, ptr %Arg, align 8 122 %slab_den = getelementptr i8, ptr %Arg, i64 24 123 %3 = load double, ptr %slab_den, align 8 124 %mul = fmul double %2, %3 125 %cmp = fcmp olt double %mul, 0.000000e+00 126 br i1 %cmp, label %common.ret, label %if.end55 127 128common.ret: ; preds = %if.end100, %if.else79, %if.end55, %if.else38, %if.then5, %if.then2 129 ret void 130 131if.else38: ; preds = %entry 132 %4 = load double, ptr %Arg, align 8 133 %cmp52 = fcmp ogt double %4, 0.000000e+00 134 br i1 %cmp52, label %common.ret, label %if.end55 135 136if.end55: ; preds = %if.else38, %if.then5 137 %arrayidx57 = getelementptr i8, ptr %Arg, i64 52 138 %5 = load i32, ptr %arrayidx57, align 4 139 %tobool58.not = icmp eq i32 %5, 0 140 br i1 %tobool58.not, label %common.ret, label %if.then59 141 142if.then59: ; preds = %if.end55 143 %arrayidx61 = getelementptr i8, ptr %Arg, i64 64 144 %6 = load i32, ptr %arrayidx61, align 4 145 %tobool62.not = icmp eq i32 %6, 0 146 br i1 %tobool62.not, label %if.else79, label %if.end100 147 148if.else79: ; preds = %if.then59 149 %arrayidx84 = getelementptr i8, ptr %Arg, i64 8 150 %7 = load double, ptr %arrayidx84, align 8 151 %arrayidx87 = getelementptr i8, ptr %Arg, i64 32 152 %8 = load double, ptr %arrayidx87, align 8 153 %mul88 = fmul double %7, %8 154 %9 = fcmp olt double %mul88, 0.000000e+00 155 br i1 %9, label %common.ret, label %if.end100 156 157if.end100: ; preds = %if.else79, %if.then59 158 %arrayidx151 = getelementptr i8, ptr %Arg, i64 16 159 %10 = load double, ptr %arrayidx151, align 8 160 %arrayidx154 = getelementptr i8, ptr %Arg, i64 40 161 %11 = load double, ptr %arrayidx154, align 8 162 %mul155 = fmul double %10, %11 163 %cmp181 = fcmp olt double %mul155, 0.000000e+00 164 br label %common.ret 165} 166