| ; RUN: opt -passes=inline -inline-threshold=225 -inlinehint-threshold=360 -S < %s | FileCheck %s | |
| @data = common global ptr null, align 8 | |
| define i32 @fct1(i32 %a) nounwind uwtable ssp { | |
| entry: | |
| %a.addr = alloca i32, align 4 | |
| %res = alloca i32, align 4 | |
| %i = alloca i32, align 4 | |
| store i32 %a, ptr %a.addr, align 4 | |
| %tmp = load i32, ptr %a.addr, align 4 | |
| %idxprom = sext i32 %tmp to i64 | |
| %tmp1 = load ptr, ptr @data, align 8 | |
| %arrayidx = getelementptr inbounds i32, ptr %tmp1, i64 %idxprom | |
| %tmp2 = load i32, ptr %arrayidx, align 4 | |
| %tmp3 = load i32, ptr %a.addr, align 4 | |
| %add = add nsw i32 %tmp3, 1 | |
| %idxprom1 = sext i32 %add to i64 | |
| %tmp4 = load ptr, ptr @data, align 8 | |
| %arrayidx2 = getelementptr inbounds i32, ptr %tmp4, i64 %idxprom1 | |
| %tmp5 = load i32, ptr %arrayidx2, align 4 | |
| %mul = mul nsw i32 %tmp2, %tmp5 | |
| store i32 %mul, ptr %res, align 4 | |
| store i32 0, ptr %i, align 4 | |
| store i32 0, ptr %i, align 4 | |
| br label %for.cond | |
| for.cond: ; preds = %for.inc, %entry | |
| %tmp6 = load i32, ptr %i, align 4 | |
| %tmp7 = load i32, ptr %res, align 4 | |
| %cmp = icmp slt i32 %tmp6, %tmp7 | |
| br i1 %cmp, label %for.body, label %for.end | |
| for.body: ; preds = %for.cond | |
| %tmp8 = load i32, ptr %i, align 4 | |
| %idxprom3 = sext i32 %tmp8 to i64 | |
| %tmp9 = load ptr, ptr @data, align 8 | |
| %arrayidx4 = getelementptr inbounds i32, ptr %tmp9, i64 %idxprom3 | |
| call void @fct0(ptr %arrayidx4) | |
| br label %for.inc | |
| for.inc: ; preds = %for.body | |
| %tmp10 = load i32, ptr %i, align 4 | |
| %inc = add nsw i32 %tmp10, 1 | |
| store i32 %inc, ptr %i, align 4 | |
| br label %for.cond | |
| for.end: ; preds = %for.cond | |
| store i32 0, ptr %i, align 4 | |
| br label %for.cond5 | |
| for.cond5: ; preds = %for.inc10, %for.end | |
| %tmp11 = load i32, ptr %i, align 4 | |
| %tmp12 = load i32, ptr %res, align 4 | |
| %cmp6 = icmp slt i32 %tmp11, %tmp12 | |
| br i1 %cmp6, label %for.body7, label %for.end12 | |
| for.body7: ; preds = %for.cond5 | |
| %tmp13 = load i32, ptr %i, align 4 | |
| %idxprom8 = sext i32 %tmp13 to i64 | |
| %tmp14 = load ptr, ptr @data, align 8 | |
| %arrayidx9 = getelementptr inbounds i32, ptr %tmp14, i64 %idxprom8 | |
| call void @fct0(ptr %arrayidx9) | |
| br label %for.inc10 | |
| for.inc10: ; preds = %for.body7 | |
| %tmp15 = load i32, ptr %i, align 4 | |
| %inc11 = add nsw i32 %tmp15, 1 | |
| store i32 %inc11, ptr %i, align 4 | |
| br label %for.cond5 | |
| for.end12: ; preds = %for.cond5 | |
| store i32 0, ptr %i, align 4 | |
| br label %for.cond13 | |
| for.cond13: ; preds = %for.inc18, %for.end12 | |
| %tmp16 = load i32, ptr %i, align 4 | |
| %tmp17 = load i32, ptr %res, align 4 | |
| %cmp14 = icmp slt i32 %tmp16, %tmp17 | |
| br i1 %cmp14, label %for.body15, label %for.end20 | |
| for.body15: ; preds = %for.cond13 | |
| %tmp18 = load i32, ptr %i, align 4 | |
| %idxprom16 = sext i32 %tmp18 to i64 | |
| %tmp19 = load ptr, ptr @data, align 8 | |
| %arrayidx17 = getelementptr inbounds i32, ptr %tmp19, i64 %idxprom16 | |
| call void @fct0(ptr %arrayidx17) | |
| br label %for.inc18 | |
| for.inc18: ; preds = %for.body15 | |
| %tmp20 = load i32, ptr %i, align 4 | |
| %inc19 = add nsw i32 %tmp20, 1 | |
| store i32 %inc19, ptr %i, align 4 | |
| br label %for.cond13 | |
| for.end20: ; preds = %for.cond13 | |
| %tmp21 = load i32, ptr %res, align 4 | |
| ret i32 %tmp21 | |
| } | |
| declare void @fct0(ptr) | |
| define i32 @fct2(i32 %a) nounwind uwtable inlinehint ssp { | |
| entry: | |
| %a.addr = alloca i32, align 4 | |
| %res = alloca i32, align 4 | |
| %i = alloca i32, align 4 | |
| store i32 %a, ptr %a.addr, align 4 | |
| %tmp = load i32, ptr %a.addr, align 4 | |
| %shl = shl i32 %tmp, 1 | |
| %idxprom = sext i32 %shl to i64 | |
| %tmp1 = load ptr, ptr @data, align 8 | |
| %arrayidx = getelementptr inbounds i32, ptr %tmp1, i64 %idxprom | |
| %tmp2 = load i32, ptr %arrayidx, align 4 | |
| %tmp3 = load i32, ptr %a.addr, align 4 | |
| %shl1 = shl i32 %tmp3, 1 | |
| %add = add nsw i32 %shl1, 13 | |
| %idxprom2 = sext i32 %add to i64 | |
| %tmp4 = load ptr, ptr @data, align 8 | |
| %arrayidx3 = getelementptr inbounds i32, ptr %tmp4, i64 %idxprom2 | |
| %tmp5 = load i32, ptr %arrayidx3, align 4 | |
| %mul = mul nsw i32 %tmp2, %tmp5 | |
| store i32 %mul, ptr %res, align 4 | |
| store i32 0, ptr %i, align 4 | |
| store i32 0, ptr %i, align 4 | |
| br label %for.cond | |
| for.cond: ; preds = %for.inc, %entry | |
| %tmp6 = load i32, ptr %i, align 4 | |
| %tmp7 = load i32, ptr %res, align 4 | |
| %cmp = icmp slt i32 %tmp6, %tmp7 | |
| br i1 %cmp, label %for.body, label %for.end | |
| for.body: ; preds = %for.cond | |
| %tmp8 = load i32, ptr %i, align 4 | |
| %idxprom4 = sext i32 %tmp8 to i64 | |
| %tmp9 = load ptr, ptr @data, align 8 | |
| %arrayidx5 = getelementptr inbounds i32, ptr %tmp9, i64 %idxprom4 | |
| call void @fct0(ptr %arrayidx5) | |
| br label %for.inc | |
| for.inc: ; preds = %for.body | |
| %tmp10 = load i32, ptr %i, align 4 | |
| %inc = add nsw i32 %tmp10, 1 | |
| store i32 %inc, ptr %i, align 4 | |
| br label %for.cond | |
| for.end: ; preds = %for.cond | |
| store i32 0, ptr %i, align 4 | |
| br label %for.cond6 | |
| for.cond6: ; preds = %for.inc11, %for.end | |
| %tmp11 = load i32, ptr %i, align 4 | |
| %tmp12 = load i32, ptr %res, align 4 | |
| %cmp7 = icmp slt i32 %tmp11, %tmp12 | |
| br i1 %cmp7, label %for.body8, label %for.end13 | |
| for.body8: ; preds = %for.cond6 | |
| %tmp13 = load i32, ptr %i, align 4 | |
| %idxprom9 = sext i32 %tmp13 to i64 | |
| %tmp14 = load ptr, ptr @data, align 8 | |
| %arrayidx10 = getelementptr inbounds i32, ptr %tmp14, i64 %idxprom9 | |
| call void @fct0(ptr %arrayidx10) | |
| br label %for.inc11 | |
| for.inc11: ; preds = %for.body8 | |
| %tmp15 = load i32, ptr %i, align 4 | |
| %inc12 = add nsw i32 %tmp15, 1 | |
| store i32 %inc12, ptr %i, align 4 | |
| br label %for.cond6 | |
| for.end13: ; preds = %for.cond6 | |
| store i32 0, ptr %i, align 4 | |
| br label %for.cond14 | |
| for.cond14: ; preds = %for.inc19, %for.end13 | |
| %tmp16 = load i32, ptr %i, align 4 | |
| %tmp17 = load i32, ptr %res, align 4 | |
| %cmp15 = icmp slt i32 %tmp16, %tmp17 | |
| br i1 %cmp15, label %for.body16, label %for.end21 | |
| for.body16: ; preds = %for.cond14 | |
| %tmp18 = load i32, ptr %i, align 4 | |
| %idxprom17 = sext i32 %tmp18 to i64 | |
| %tmp19 = load ptr, ptr @data, align 8 | |
| %arrayidx18 = getelementptr inbounds i32, ptr %tmp19, i64 %idxprom17 | |
| call void @fct0(ptr %arrayidx18) | |
| br label %for.inc19 | |
| for.inc19: ; preds = %for.body16 | |
| %tmp20 = load i32, ptr %i, align 4 | |
| %inc20 = add nsw i32 %tmp20, 1 | |
| store i32 %inc20, ptr %i, align 4 | |
| br label %for.cond14 | |
| for.end21: ; preds = %for.cond14 | |
| %tmp21 = load i32, ptr %res, align 4 | |
| ret i32 %tmp21 | |
| } | |
| define i32 @fct3(i32 %c) nounwind uwtable ssp { | |
| entry: | |
| ;CHECK-LABEL: @fct3( | |
| ;CHECK: call i32 @fct1 | |
| ; The inline keyword gives a sufficient benefits to inline fct2 | |
| ;CHECK-NOT: call i32 @fct2 | |
| %c.addr = alloca i32, align 4 | |
| store i32 %c, ptr %c.addr, align 4 | |
| %tmp = load i32, ptr %c.addr, align 4 | |
| %call = call i32 @fct1(i32 %tmp) | |
| %tmp1 = load i32, ptr %c.addr, align 4 | |
| %call1 = call i32 @fct2(i32 %tmp1) | |
| %add = add nsw i32 %call, %call1 | |
| ret i32 %add | |
| } | |
| define i32 @fct4(i32 %c) minsize nounwind uwtable ssp { | |
| entry: | |
| ;CHECK-LABEL: @fct4( | |
| ;CHECK: call i32 @fct1 | |
| ; With Oz (minsize attribute), the benefit of inlining fct2 | |
| ; is the same as fct1, thus no inlining for fct2 | |
| ;CHECK: call i32 @fct2 | |
| %c.addr = alloca i32, align 4 | |
| store i32 %c, ptr %c.addr, align 4 | |
| %tmp = load i32, ptr %c.addr, align 4 | |
| %call = call i32 @fct1(i32 %tmp) | |
| %tmp1 = load i32, ptr %c.addr, align 4 | |
| %call1 = call i32 @fct2(i32 %tmp1) | |
| %add = add nsw i32 %call, %call1 | |
| ret i32 %add | |
| } |