(Reland of #190092 with verifier change to look through GlobalAliases) So that it's preserved across all inline invocations rather than just one inliner pass run. This prevents cases where devirtualization in the simplification pipeline uncovers inlining opportunities that should be discarded due to inline history, but we dropped the inline history between inliner pass runs, causing code size to blow up, sometimes exponentially. For compile time reasons, we want to limit this to only call sites that have the potential to inline through SCCs, potentially with the help of devirtualization. This means that the callee is in a non-trivial (Ref)SCC, or the call site was previously an indirect call, which can potentially be devirtualized to call any function. The CGSCCUpdater::InlinedInternalEdges logic still seems to be relevant even with this change, as monster_scc.ll blows up if I remove that code. http://llvm-compile-time-tracker.com/compare.php?from=e830d88e8ae5f44a97cc76136a0a4e83aa9157c0&to=ed535e732fc41b79ab8efda2417886cbd0812f7f&stat=instructions:u Fixes #186926.
62 lines
1.3 KiB
LLVM
62 lines
1.3 KiB
LLVM
; RUN: not opt -passes=verify < %s 2>&1 | FileCheck %s
|
|
|
|
@x = global i32 0
|
|
@alias = alias void (), ptr @f
|
|
|
|
define void @f() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: !inline_history should only exist on calls
|
|
define void @wrong_instr(ptr %x) {
|
|
load ptr, ptr %x, !inline_history !{ptr @wrong_instr}
|
|
ret void
|
|
}
|
|
|
|
; CHECK: !inline_history operands must be functions or null
|
|
define void @global_value_operand() {
|
|
call void @f(), !inline_history !{ptr @x}
|
|
ret void
|
|
}
|
|
|
|
; CHECK: !inline_history operands must be functions or null
|
|
define void @metadata_operand() {
|
|
call void @f(), !inline_history !{!0}
|
|
ret void
|
|
}
|
|
|
|
; CHECK: !inline_history operands must be functions or null
|
|
define void @nullptr_operand() {
|
|
call void @f(), !inline_history !{ptr null}
|
|
ret void
|
|
}
|
|
|
|
; CHECK-NOT: !inline_history operands must be functions or null
|
|
|
|
define void @empty_metadata() {
|
|
call void @f(), !inline_history !{}
|
|
ret void
|
|
}
|
|
|
|
define void @null_metadata() {
|
|
call void @f(), !inline_history !{null}
|
|
ret void
|
|
}
|
|
|
|
define void @function_metadata() {
|
|
call void @f(), !inline_history !{ptr @f}
|
|
ret void
|
|
}
|
|
|
|
define void @alias_metadata() {
|
|
call void @f(), !inline_history !{ptr @alias}
|
|
ret void
|
|
}
|
|
|
|
define void @mixed_metadata() {
|
|
call void @f(), !inline_history !{null, ptr @f, null, ptr @mixed_metadata}
|
|
ret void
|
|
}
|
|
|
|
!0 = !{}
|