233 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			233 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; RUN: opt -inline -inline-threshold=225 -inlinehint-threshold=360 -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
 | 
						|
}
 |