233 lines · plain
1; RUN: opt -passes=inline -inline-threshold=225 -inlinehint-threshold=360 -S < %s | FileCheck %s2 3@data = common global ptr null, align 84 5define i32 @fct1(i32 %a) nounwind uwtable ssp {6entry:7 %a.addr = alloca i32, align 48 %res = alloca i32, align 49 %i = alloca i32, align 410 store i32 %a, ptr %a.addr, align 411 %tmp = load i32, ptr %a.addr, align 412 %idxprom = sext i32 %tmp to i6413 %tmp1 = load ptr, ptr @data, align 814 %arrayidx = getelementptr inbounds i32, ptr %tmp1, i64 %idxprom15 %tmp2 = load i32, ptr %arrayidx, align 416 %tmp3 = load i32, ptr %a.addr, align 417 %add = add nsw i32 %tmp3, 118 %idxprom1 = sext i32 %add to i6419 %tmp4 = load ptr, ptr @data, align 820 %arrayidx2 = getelementptr inbounds i32, ptr %tmp4, i64 %idxprom121 %tmp5 = load i32, ptr %arrayidx2, align 422 %mul = mul nsw i32 %tmp2, %tmp523 store i32 %mul, ptr %res, align 424 store i32 0, ptr %i, align 425 store i32 0, ptr %i, align 426 br label %for.cond27 28for.cond: ; preds = %for.inc, %entry29 %tmp6 = load i32, ptr %i, align 430 %tmp7 = load i32, ptr %res, align 431 %cmp = icmp slt i32 %tmp6, %tmp732 br i1 %cmp, label %for.body, label %for.end33 34for.body: ; preds = %for.cond35 %tmp8 = load i32, ptr %i, align 436 %idxprom3 = sext i32 %tmp8 to i6437 %tmp9 = load ptr, ptr @data, align 838 %arrayidx4 = getelementptr inbounds i32, ptr %tmp9, i64 %idxprom339 call void @fct0(ptr %arrayidx4)40 br label %for.inc41 42for.inc: ; preds = %for.body43 %tmp10 = load i32, ptr %i, align 444 %inc = add nsw i32 %tmp10, 145 store i32 %inc, ptr %i, align 446 br label %for.cond47 48for.end: ; preds = %for.cond49 store i32 0, ptr %i, align 450 br label %for.cond551 52for.cond5: ; preds = %for.inc10, %for.end53 %tmp11 = load i32, ptr %i, align 454 %tmp12 = load i32, ptr %res, align 455 %cmp6 = icmp slt i32 %tmp11, %tmp1256 br i1 %cmp6, label %for.body7, label %for.end1257 58for.body7: ; preds = %for.cond559 %tmp13 = load i32, ptr %i, align 460 %idxprom8 = sext i32 %tmp13 to i6461 %tmp14 = load ptr, ptr @data, align 862 %arrayidx9 = getelementptr inbounds i32, ptr %tmp14, i64 %idxprom863 call void @fct0(ptr %arrayidx9)64 br label %for.inc1065 66for.inc10: ; preds = %for.body767 %tmp15 = load i32, ptr %i, align 468 %inc11 = add nsw i32 %tmp15, 169 store i32 %inc11, ptr %i, align 470 br label %for.cond571 72for.end12: ; preds = %for.cond573 store i32 0, ptr %i, align 474 br label %for.cond1375 76for.cond13: ; preds = %for.inc18, %for.end1277 %tmp16 = load i32, ptr %i, align 478 %tmp17 = load i32, ptr %res, align 479 %cmp14 = icmp slt i32 %tmp16, %tmp1780 br i1 %cmp14, label %for.body15, label %for.end2081 82for.body15: ; preds = %for.cond1383 %tmp18 = load i32, ptr %i, align 484 %idxprom16 = sext i32 %tmp18 to i6485 %tmp19 = load ptr, ptr @data, align 886 %arrayidx17 = getelementptr inbounds i32, ptr %tmp19, i64 %idxprom1687 call void @fct0(ptr %arrayidx17)88 br label %for.inc1889 90for.inc18: ; preds = %for.body1591 %tmp20 = load i32, ptr %i, align 492 %inc19 = add nsw i32 %tmp20, 193 store i32 %inc19, ptr %i, align 494 br label %for.cond1395 96for.end20: ; preds = %for.cond1397 %tmp21 = load i32, ptr %res, align 498 ret i32 %tmp2199}100 101declare void @fct0(ptr)102 103define i32 @fct2(i32 %a) nounwind uwtable inlinehint ssp {104entry:105 %a.addr = alloca i32, align 4106 %res = alloca i32, align 4107 %i = alloca i32, align 4108 store i32 %a, ptr %a.addr, align 4109 %tmp = load i32, ptr %a.addr, align 4110 %shl = shl i32 %tmp, 1111 %idxprom = sext i32 %shl to i64112 %tmp1 = load ptr, ptr @data, align 8113 %arrayidx = getelementptr inbounds i32, ptr %tmp1, i64 %idxprom114 %tmp2 = load i32, ptr %arrayidx, align 4115 %tmp3 = load i32, ptr %a.addr, align 4116 %shl1 = shl i32 %tmp3, 1117 %add = add nsw i32 %shl1, 13118 %idxprom2 = sext i32 %add to i64119 %tmp4 = load ptr, ptr @data, align 8120 %arrayidx3 = getelementptr inbounds i32, ptr %tmp4, i64 %idxprom2121 %tmp5 = load i32, ptr %arrayidx3, align 4122 %mul = mul nsw i32 %tmp2, %tmp5123 store i32 %mul, ptr %res, align 4124 store i32 0, ptr %i, align 4125 store i32 0, ptr %i, align 4126 br label %for.cond127 128for.cond: ; preds = %for.inc, %entry129 %tmp6 = load i32, ptr %i, align 4130 %tmp7 = load i32, ptr %res, align 4131 %cmp = icmp slt i32 %tmp6, %tmp7132 br i1 %cmp, label %for.body, label %for.end133 134for.body: ; preds = %for.cond135 %tmp8 = load i32, ptr %i, align 4136 %idxprom4 = sext i32 %tmp8 to i64137 %tmp9 = load ptr, ptr @data, align 8138 %arrayidx5 = getelementptr inbounds i32, ptr %tmp9, i64 %idxprom4139 call void @fct0(ptr %arrayidx5)140 br label %for.inc141 142for.inc: ; preds = %for.body143 %tmp10 = load i32, ptr %i, align 4144 %inc = add nsw i32 %tmp10, 1145 store i32 %inc, ptr %i, align 4146 br label %for.cond147 148for.end: ; preds = %for.cond149 store i32 0, ptr %i, align 4150 br label %for.cond6151 152for.cond6: ; preds = %for.inc11, %for.end153 %tmp11 = load i32, ptr %i, align 4154 %tmp12 = load i32, ptr %res, align 4155 %cmp7 = icmp slt i32 %tmp11, %tmp12156 br i1 %cmp7, label %for.body8, label %for.end13157 158for.body8: ; preds = %for.cond6159 %tmp13 = load i32, ptr %i, align 4160 %idxprom9 = sext i32 %tmp13 to i64161 %tmp14 = load ptr, ptr @data, align 8162 %arrayidx10 = getelementptr inbounds i32, ptr %tmp14, i64 %idxprom9163 call void @fct0(ptr %arrayidx10)164 br label %for.inc11165 166for.inc11: ; preds = %for.body8167 %tmp15 = load i32, ptr %i, align 4168 %inc12 = add nsw i32 %tmp15, 1169 store i32 %inc12, ptr %i, align 4170 br label %for.cond6171 172for.end13: ; preds = %for.cond6173 store i32 0, ptr %i, align 4174 br label %for.cond14175 176for.cond14: ; preds = %for.inc19, %for.end13177 %tmp16 = load i32, ptr %i, align 4178 %tmp17 = load i32, ptr %res, align 4179 %cmp15 = icmp slt i32 %tmp16, %tmp17180 br i1 %cmp15, label %for.body16, label %for.end21181 182for.body16: ; preds = %for.cond14183 %tmp18 = load i32, ptr %i, align 4184 %idxprom17 = sext i32 %tmp18 to i64185 %tmp19 = load ptr, ptr @data, align 8186 %arrayidx18 = getelementptr inbounds i32, ptr %tmp19, i64 %idxprom17187 call void @fct0(ptr %arrayidx18)188 br label %for.inc19189 190for.inc19: ; preds = %for.body16191 %tmp20 = load i32, ptr %i, align 4192 %inc20 = add nsw i32 %tmp20, 1193 store i32 %inc20, ptr %i, align 4194 br label %for.cond14195 196for.end21: ; preds = %for.cond14197 %tmp21 = load i32, ptr %res, align 4198 ret i32 %tmp21199}200 201define i32 @fct3(i32 %c) nounwind uwtable ssp {202entry:203 ;CHECK-LABEL: @fct3(204 ;CHECK: call i32 @fct1205 ; The inline keyword gives a sufficient benefits to inline fct2206 ;CHECK-NOT: call i32 @fct2207 %c.addr = alloca i32, align 4208 store i32 %c, ptr %c.addr, align 4209 %tmp = load i32, ptr %c.addr, align 4210 %call = call i32 @fct1(i32 %tmp)211 %tmp1 = load i32, ptr %c.addr, align 4212 %call1 = call i32 @fct2(i32 %tmp1)213 %add = add nsw i32 %call, %call1214 ret i32 %add215}216 217define i32 @fct4(i32 %c) minsize nounwind uwtable ssp {218entry:219 ;CHECK-LABEL: @fct4(220 ;CHECK: call i32 @fct1221 ; With Oz (minsize attribute), the benefit of inlining fct2222 ; is the same as fct1, thus no inlining for fct2223 ;CHECK: call i32 @fct2224 %c.addr = alloca i32, align 4225 store i32 %c, ptr %c.addr, align 4226 %tmp = load i32, ptr %c.addr, align 4227 %call = call i32 @fct1(i32 %tmp)228 %tmp1 = load i32, ptr %c.addr, align 4229 %call1 = call i32 @fct2(i32 %tmp1)230 %add = add nsw i32 %call, %call1231 ret i32 %add232}233