Index: lib/Analysis/InlineCost.cpp =================================================================== --- lib/Analysis/InlineCost.cpp +++ lib/Analysis/InlineCost.cpp @@ -1255,7 +1255,9 @@ 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 = Index: test/Transforms/Inline/alloca-bonus.ll =================================================================== --- test/Transforms/Inline/alloca-bonus.ll +++ test/Transforms/Inline/alloca-bonus.ll @@ -22,6 +22,7 @@ %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 } @@ -42,6 +43,7 @@ %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 } @@ -56,6 +58,7 @@ 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. @@ -97,6 +100,7 @@ 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. @@ -139,6 +143,7 @@ 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 @@ -153,3 +158,4 @@ ret void } +declare void @extern() Index: test/Transforms/Inline/inline-cold-callee.ll =================================================================== --- test/Transforms/Inline/inline-cold-callee.ll +++ test/Transforms/Inline/inline-cold-callee.ll @@ -9,7 +9,7 @@ %x1 = add i32 %x, 1 %x2 = add i32 %x1, 1 %x3 = add i32 %x2, 1 - + call void @extern() ret i32 %x3 } @@ -18,7 +18,7 @@ %x1 = add i32 %x, 1 %x2 = add i32 %x1, 1 %x3 = add i32 %x2, 1 - + call void @extern() ret i32 %x3 } @@ -32,6 +32,8 @@ ret i32 %y3 } +declare void @extern() + !llvm.module.flags = !{!1} !21 = !{!"function_entry_count", i64 100} !22 = !{!"function_entry_count", i64 1} Index: test/Transforms/Inline/inline-cold.ll =================================================================== --- test/Transforms/Inline/inline-cold.ll +++ test/Transforms/Inline/inline-cold.ll @@ -17,6 +17,7 @@ ; 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 @@ -54,6 +55,7 @@ ; 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 @@ -91,6 +93,7 @@ ; 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 @@ -196,5 +199,6 @@ ret i32 %add } +declare void @extern() attributes #0 = { nounwind readnone uwtable } attributes #1 = { nounwind cold readnone uwtable } Index: test/Transforms/Inline/inline-hot-callee.ll =================================================================== --- test/Transforms/Inline/inline-hot-callee.ll +++ test/Transforms/Inline/inline-hot-callee.ll @@ -9,7 +9,7 @@ %x1 = add i32 %x, 1 %x2 = add i32 %x1, 1 %x3 = add i32 %x2, 1 - + call void @extern() ret i32 %x3 } @@ -18,7 +18,7 @@ %x1 = add i32 %x, 1 %x2 = add i32 %x1, 1 %x3 = add i32 %x2, 1 - + call void @extern() ret i32 %x3 } @@ -32,6 +32,8 @@ ret i32 %y3 } +declare void @extern() + !llvm.module.flags = !{!1} !21 = !{!"function_entry_count", i64 300} !22 = !{!"function_entry_count", i64 1} Index: test/Transforms/Inline/inline-hot-callsite.ll =================================================================== --- test/Transforms/Inline/inline-hot-callsite.ll +++ test/Transforms/Inline/inline-hot-callsite.ll @@ -9,7 +9,7 @@ %x1 = add i32 %x, 1 %x2 = add i32 %x1, 1 %x3 = add i32 %x2, 1 - + call void @extern() ret i32 %x3 } @@ -18,7 +18,7 @@ %x1 = add i32 %x, 1 %x2 = add i32 %x1, 1 %x3 = add i32 %x2, 1 - + call void @extern() ret i32 %x3 } @@ -32,6 +32,8 @@ ret i32 %y3 } +declare void @extern() + !llvm.module.flags = !{!1} !21 = !{!"branch_weights", i64 300} !22 = !{!"branch_weights", i64 1} Index: test/Transforms/Inline/inline-optsize.ll =================================================================== --- test/Transforms/Inline/inline-optsize.ll +++ test/Transforms/Inline/inline-optsize.ll @@ -12,6 +12,7 @@ ; 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 @@ -42,3 +43,5 @@ %r = call i32 @inner() ret i32 %r } + +declare void @extern() \ No newline at end of file Index: test/Transforms/Inline/inline_unreachable-2.ll =================================================================== --- test/Transforms/Inline/inline_unreachable-2.ll +++ test/Transforms/Inline/inline_unreachable-2.ll @@ -8,6 +8,7 @@ } define void @callee(i32 %a, i1 %b) { + call void @extern() call void asm sideeffect "", ""() br i1 %b, label %bb1, label %bb2 bb1: @@ -17,3 +18,5 @@ call void asm sideeffect "", ""() ret void } + +declare void @extern() \ No newline at end of file Index: test/Transforms/Inline/optimization-remarks-passed-yaml.ll =================================================================== --- test/Transforms/Inline/optimization-remarks-passed-yaml.ll +++ test/Transforms/Inline/optimization-remarks-passed-yaml.ll @@ -12,7 +12,7 @@ ; 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 @@ -26,7 +26,7 @@ ; YAML-NEXT: - String: ' can be inlined into ' ; YAML-NEXT: - Caller: bar ; 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: ')' Index: test/Transforms/Inline/ptr-diff.ll =================================================================== --- test/Transforms/Inline/ptr-diff.ll +++ test/Transforms/Inline/ptr-diff.ll @@ -4,7 +4,7 @@ define i32 @outer1() { ; CHECK-LABEL: @outer1( -; CHECK-NOT: call +; CHECK-NOT: call i32 ; CHECK: ret i32 %ptr = alloca i32 @@ -15,6 +15,7 @@ } 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 @@ -43,6 +44,7 @@ } 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 @@ -60,6 +62,7 @@ ; 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)* @@ -73,7 +76,7 @@ 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 } @@ -81,6 +84,7 @@ ; 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)* @@ -94,8 +98,9 @@ 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