Cost -= InlineConstants::InstrCost;
}
}
-
+ // The call instruction also disappears after inlining.
+ Cost -= InlineConstants::InstrCost + InlineConstants::CallPenalty;
+
// If there is only one call of the function, and it has internal linkage,
// the cost of inlining it drops dramatically.
bool OnlyOneCallAndLocalLinkage =
%E = bitcast i32* %ptr to i8*
%F = select i1 false, i32* %ptr, i32* @glbl
call void @llvm.lifetime.start(i64 0, i8* %E)
+ call void @extern()
ret void
}
%E = bitcast i32* %ptr to i8*
%F = select i1 false, i32* %ptr, i32* @glbl
call void @llvm.lifetime.start(i64 0, i8* %E)
+ call void @extern()
ret void
}
define void @inner3(i32 *%ptr, i1 %x) {
%A = icmp eq i32* %ptr, null
%B = and i1 %x, %A
+ call void @extern()
br i1 %A, label %bb.true, label %bb.false
bb.true:
; This block musn't be counted in the inline cost.
define void @inner4(i32 *%ptr, i32 %A) {
%B = getelementptr inbounds i32, i32* %ptr, i32 %A
%C = icmp eq i32* %ptr, null
+ call void @extern()
br i1 %C, label %bb.true, label %bb.false
bb.true:
; This block musn't be counted in the inline cost.
define void @inner5(i1 %flag, i32 *%ptr) {
%A = load i32, i32* %ptr
store i32 0, i32* %ptr
+ call void @extern()
%C = getelementptr inbounds i32, i32* %ptr, i32 0
br i1 %flag, label %if.then, label %exit
ret void
}
+declare void @extern()
%x1 = add i32 %x, 1
%x2 = add i32 %x1, 1
%x3 = add i32 %x2, 1
-
+ call void @extern()
ret i32 %x3
}
%x1 = add i32 %x, 1
%x2 = add i32 %x1, 1
%x3 = add i32 %x2, 1
-
+ call void @extern()
ret i32 %x3
}
ret i32 %y3
}
+declare void @extern()
+
!llvm.module.flags = !{!1}
!21 = !{!"function_entry_count", i64 100}
!22 = !{!"function_entry_count", i64 1}
; Function Attrs: nounwind readnone uwtable
define i32 @simpleFunction(i32 %a) #0 {
entry:
+ call void @extern()
%a1 = load volatile i32, i32* @a
%x1 = add i32 %a1, %a1
%a2 = load volatile i32, i32* @a
; DEFAULT-LABEL: @ColdFunction
; DEFAULT: ret
entry:
+ call void @extern()
%a1 = load volatile i32, i32* @a
%x1 = add i32 %a1, %a1
%a2 = load volatile i32, i32* @a
; DEFAULT-LABEL: @ColdFunction2
; DEFAULT: ret
entry:
+ call void @extern()
%a1 = load volatile i32, i32* @a
%x1 = add i32 %a1, %a1
%a2 = load volatile i32, i32* @a
ret i32 %add
}
+declare void @extern()
attributes #0 = { nounwind readnone uwtable }
attributes #1 = { nounwind cold readnone uwtable }
%x1 = add i32 %x, 1
%x2 = add i32 %x1, 1
%x3 = add i32 %x2, 1
-
+ call void @extern()
ret i32 %x3
}
%x1 = add i32 %x, 1
%x2 = add i32 %x1, 1
%x3 = add i32 %x2, 1
-
+ call void @extern()
ret i32 %x3
}
ret i32 %y3
}
+declare void @extern()
+
!llvm.module.flags = !{!1}
!21 = !{!"function_entry_count", i64 300}
!22 = !{!"function_entry_count", i64 1}
%x1 = add i32 %x, 1
%x2 = add i32 %x1, 1
%x3 = add i32 %x2, 1
-
+ call void @extern()
ret i32 %x3
}
%x1 = add i32 %x, 1
%x2 = add i32 %x1, 1
%x3 = add i32 %x2, 1
-
+ call void @extern()
ret i32 %x3
}
ret i32 %y3
}
+declare void @extern()
+
!llvm.module.flags = !{!1}
!21 = !{!"branch_weights", i64 300}
!22 = !{!"branch_weights", i64 1}
; This function should be larger than the inline threshold for -Oz (25), but
; smaller than the inline threshold for optsize (75).
define i32 @inner() {
+ call void @extern()
%a1 = load volatile i32, i32* @a
%x1 = add i32 %a1, %a1
%a2 = load volatile i32, i32* @a
%r = call i32 @inner()
ret i32 %r
}
+
+declare void @extern()
\ No newline at end of file
}
define void @callee(i32 %a, i1 %b) {
+ call void @extern()
call void asm sideeffect "", ""()
br i1 %b, label %bb1, label %bb2
bb1:
call void asm sideeffect "", ""()
ret void
}
+
+declare void @extern()
\ No newline at end of file
; 4 return foo();
; 5 }
-; CHECK: remark: /tmp/s.c:4:10: foo can be inlined into bar with cost={{[0-9]+}} (threshold={{[0-9]+}}) (hotness: 30)
+; CHECK: remark: /tmp/s.c:4:10: foo can be inlined into bar with cost={{[0-9\-]+}} (threshold={{[0-9]+}}) (hotness: 30)
; CHECK-NEXT: remark: /tmp/s.c:4:10: foo inlined into bar (hotness: 30)
; YAML: --- !Analysis
; YAML-NEXT: - Caller: bar
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 3, Column: 0 }
; YAML-NEXT: - String: ' with cost='
-; YAML-NEXT: - Cost: '{{[0-9]+}}'
+; YAML-NEXT: - Cost: '{{[0-9\-]+}}'
; YAML-NEXT: - String: ' (threshold='
; YAML-NEXT: - Threshold: '{{[0-9]+}}'
; YAML-NEXT: - String: ')'
define i32 @outer1() {
; CHECK-LABEL: @outer1(
-; CHECK-NOT: call
+; CHECK-NOT: call i32
; CHECK: ret i32
%ptr = alloca i32
}
define i32 @inner1(i32* %begin, i32* %end) {
+ call void @extern()
%begin.i = ptrtoint i32* %begin to i32
%end.i = ptrtoint i32* %end to i32
%distance = sub i32 %end.i, %begin.i
}
define i32 @inner2(i32* %begin, i32* %end) {
+ call void @extern()
%begin.i = ptrtoint i32* %begin to i32
%end.i = ptrtoint i32* %end to i32
%distance = sub i32 %end.i, %begin.i
; The inttoptrs are free since it is a smaller integer to a larger
; pointer size
define i32 @inttoptr_free_cost(i32 %a, i32 %b, i32 %c) {
+ call void @extern()
%p1 = inttoptr i32 %a to i32 addrspace(1)*
%p2 = inttoptr i32 %b to i32 addrspace(1)*
%p3 = inttoptr i32 %c to i32 addrspace(1)*
define i32 @inttoptr_free_cost_user(i32 %begin, i32 %end) {
; CHECK-LABEL: @inttoptr_free_cost_user(
-; CHECK-NOT: call
+; CHECK-NOT: call i32
%x = call i32 @inttoptr_free_cost(i32 %begin, i32 %end, i32 9)
ret i32 %x
}
; The inttoptrs have a cost since it is a larger integer to a smaller
; pointer size
define i32 @inttoptr_cost_smaller_ptr(i32 %a, i32 %b, i32 %c) {
+ call void @extern()
%p1 = inttoptr i32 %a to i32 addrspace(2)*
%p2 = inttoptr i32 %b to i32 addrspace(2)*
%p3 = inttoptr i32 %c to i32 addrspace(2)*
define i32 @inttoptr_cost_smaller_ptr_user(i32 %begin, i32 %end) {
; CHECK-LABEL: @inttoptr_cost_smaller_ptr_user(
-; CHECK: call
+; CHECK: call i32
%x = call i32 @inttoptr_cost_smaller_ptr(i32 %begin, i32 %end, i32 9)
ret i32 %x
}
+declare void @extern()
\ No newline at end of file