| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- ; RUN: opt -O2 -S < %s | FileCheck %s
- @data = common global i32* 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, i32* %a.addr, align 4
- %tmp = load i32, i32* %a.addr, align 4
- %idxprom = sext i32 %tmp to i64
- %tmp1 = load i32*, i32** @data, align 8
- %arrayidx = getelementptr inbounds i32, i32* %tmp1, i64 %idxprom
- %tmp2 = load i32, i32* %arrayidx, align 4
- %tmp3 = load i32, i32* %a.addr, align 4
- %add = add nsw i32 %tmp3, 1
- %idxprom1 = sext i32 %add to i64
- %tmp4 = load i32*, i32** @data, align 8
- %arrayidx2 = getelementptr inbounds i32, i32* %tmp4, i64 %idxprom1
- %tmp5 = load i32, i32* %arrayidx2, align 4
- %mul = mul nsw i32 %tmp2, %tmp5
- store i32 %mul, i32* %res, align 4
- store i32 0, i32* %i, align 4
- store i32 0, i32* %i, align 4
- br label %for.cond
- for.cond: ; preds = %for.inc, %entry
- %tmp6 = load i32, i32* %i, align 4
- %tmp7 = load i32, i32* %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, i32* %i, align 4
- %idxprom3 = sext i32 %tmp8 to i64
- %tmp9 = load i32*, i32** @data, align 8
- %arrayidx4 = getelementptr inbounds i32, i32* %tmp9, i64 %idxprom3
- call void @fct0(i32* %arrayidx4)
- br label %for.inc
- for.inc: ; preds = %for.body
- %tmp10 = load i32, i32* %i, align 4
- %inc = add nsw i32 %tmp10, 1
- store i32 %inc, i32* %i, align 4
- br label %for.cond
- for.end: ; preds = %for.cond
- store i32 0, i32* %i, align 4
- br label %for.cond5
- for.cond5: ; preds = %for.inc10, %for.end
- %tmp11 = load i32, i32* %i, align 4
- %tmp12 = load i32, i32* %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, i32* %i, align 4
- %idxprom8 = sext i32 %tmp13 to i64
- %tmp14 = load i32*, i32** @data, align 8
- %arrayidx9 = getelementptr inbounds i32, i32* %tmp14, i64 %idxprom8
- call void @fct0(i32* %arrayidx9)
- br label %for.inc10
- for.inc10: ; preds = %for.body7
- %tmp15 = load i32, i32* %i, align 4
- %inc11 = add nsw i32 %tmp15, 1
- store i32 %inc11, i32* %i, align 4
- br label %for.cond5
- for.end12: ; preds = %for.cond5
- store i32 0, i32* %i, align 4
- br label %for.cond13
- for.cond13: ; preds = %for.inc18, %for.end12
- %tmp16 = load i32, i32* %i, align 4
- %tmp17 = load i32, i32* %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, i32* %i, align 4
- %idxprom16 = sext i32 %tmp18 to i64
- %tmp19 = load i32*, i32** @data, align 8
- %arrayidx17 = getelementptr inbounds i32, i32* %tmp19, i64 %idxprom16
- call void @fct0(i32* %arrayidx17)
- br label %for.inc18
- for.inc18: ; preds = %for.body15
- %tmp20 = load i32, i32* %i, align 4
- %inc19 = add nsw i32 %tmp20, 1
- store i32 %inc19, i32* %i, align 4
- br label %for.cond13
- for.end20: ; preds = %for.cond13
- %tmp21 = load i32, i32* %res, align 4
- ret i32 %tmp21
- }
- declare void @fct0(i32*)
- 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, i32* %a.addr, align 4
- %tmp = load i32, i32* %a.addr, align 4
- %shl = shl i32 %tmp, 1
- %idxprom = sext i32 %shl to i64
- %tmp1 = load i32*, i32** @data, align 8
- %arrayidx = getelementptr inbounds i32, i32* %tmp1, i64 %idxprom
- %tmp2 = load i32, i32* %arrayidx, align 4
- %tmp3 = load i32, i32* %a.addr, align 4
- %shl1 = shl i32 %tmp3, 1
- %add = add nsw i32 %shl1, 13
- %idxprom2 = sext i32 %add to i64
- %tmp4 = load i32*, i32** @data, align 8
- %arrayidx3 = getelementptr inbounds i32, i32* %tmp4, i64 %idxprom2
- %tmp5 = load i32, i32* %arrayidx3, align 4
- %mul = mul nsw i32 %tmp2, %tmp5
- store i32 %mul, i32* %res, align 4
- store i32 0, i32* %i, align 4
- store i32 0, i32* %i, align 4
- br label %for.cond
- for.cond: ; preds = %for.inc, %entry
- %tmp6 = load i32, i32* %i, align 4
- %tmp7 = load i32, i32* %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, i32* %i, align 4
- %idxprom4 = sext i32 %tmp8 to i64
- %tmp9 = load i32*, i32** @data, align 8
- %arrayidx5 = getelementptr inbounds i32, i32* %tmp9, i64 %idxprom4
- call void @fct0(i32* %arrayidx5)
- br label %for.inc
- for.inc: ; preds = %for.body
- %tmp10 = load i32, i32* %i, align 4
- %inc = add nsw i32 %tmp10, 1
- store i32 %inc, i32* %i, align 4
- br label %for.cond
- for.end: ; preds = %for.cond
- store i32 0, i32* %i, align 4
- br label %for.cond6
- for.cond6: ; preds = %for.inc11, %for.end
- %tmp11 = load i32, i32* %i, align 4
- %tmp12 = load i32, i32* %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, i32* %i, align 4
- %idxprom9 = sext i32 %tmp13 to i64
- %tmp14 = load i32*, i32** @data, align 8
- %arrayidx10 = getelementptr inbounds i32, i32* %tmp14, i64 %idxprom9
- call void @fct0(i32* %arrayidx10)
- br label %for.inc11
- for.inc11: ; preds = %for.body8
- %tmp15 = load i32, i32* %i, align 4
- %inc12 = add nsw i32 %tmp15, 1
- store i32 %inc12, i32* %i, align 4
- br label %for.cond6
- for.end13: ; preds = %for.cond6
- store i32 0, i32* %i, align 4
- br label %for.cond14
- for.cond14: ; preds = %for.inc19, %for.end13
- %tmp16 = load i32, i32* %i, align 4
- %tmp17 = load i32, i32* %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, i32* %i, align 4
- %idxprom17 = sext i32 %tmp18 to i64
- %tmp19 = load i32*, i32** @data, align 8
- %arrayidx18 = getelementptr inbounds i32, i32* %tmp19, i64 %idxprom17
- call void @fct0(i32* %arrayidx18)
- br label %for.inc19
- for.inc19: ; preds = %for.body16
- %tmp20 = load i32, i32* %i, align 4
- %inc20 = add nsw i32 %tmp20, 1
- store i32 %inc20, i32* %i, align 4
- br label %for.cond14
- for.end21: ; preds = %for.cond14
- %tmp21 = load i32, i32* %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, i32* %c.addr, align 4
- %tmp = load i32, i32* %c.addr, align 4
- %call = call i32 @fct1(i32 %tmp)
- %tmp1 = load i32, i32* %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, i32* %c.addr, align 4
- %tmp = load i32, i32* %c.addr, align 4
- %call = call i32 @fct1(i32 %tmp)
- %tmp1 = load i32, i32* %c.addr, align 4
- %call1 = call i32 @fct2(i32 %tmp1)
- %add = add nsw i32 %call, %call1
- ret i32 %add
- }
|