mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-24 15:12:36 +00:00

When calculating the cost of a call instruction we were applying a heuristic penalty as well as the cost of the instruction itself. However, when calculating the benefit from inlining we weren't discounting the equivalent penalty for the call instruction that would be removed! This caused skew in the calculation and meant we wouldn't inline in the following, trivial case: int g() { h(); } int f() { g(); } git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286814 91177308-0d34-0410-b5e6-96231b3b80d8
47 lines
1.3 KiB
LLVM
47 lines
1.3 KiB
LLVM
; RUN: opt -S -Oz < %s | FileCheck %s -check-prefix=OZ
|
|
; RUN: opt -S -O2 < %s | FileCheck %s -check-prefix=O2
|
|
; RUN: opt -S -Os < %s | FileCheck %s -check-prefix=OS
|
|
|
|
; The inline threshold for a function with the optsize attribute is currently
|
|
; the same as the global inline threshold for -Os. Check that the optsize
|
|
; function attribute doesn't alter the function-specific inline threshold if the
|
|
; global inline threshold is lower (as for -Oz).
|
|
|
|
@a = global i32 4
|
|
|
|
; 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
|
|
%x2 = add i32 %x1, %a2
|
|
%a3 = load volatile i32, i32* @a
|
|
%x3 = add i32 %x2, %a3
|
|
%a4 = load volatile i32, i32* @a
|
|
%x4 = add i32 %x3, %a4
|
|
%a5 = load volatile i32, i32* @a
|
|
%x5 = add i32 %x3, %a5
|
|
ret i32 %x5
|
|
}
|
|
|
|
; @inner() should be inlined for -O2 and -Os but not for -Oz.
|
|
; OZ: call
|
|
; O2-NOT: call
|
|
; OS-NOT: call
|
|
define i32 @outer() optsize {
|
|
%r = call i32 @inner()
|
|
ret i32 %r
|
|
}
|
|
|
|
; @inner() should not be inlined for -O2, -Os and -Oz.
|
|
; OZ: call
|
|
; O2: call
|
|
; OS: call
|
|
define i32 @outer2() minsize {
|
|
%r = call i32 @inner()
|
|
ret i32 %r
|
|
}
|
|
|
|
declare void @extern() |