
This commit introduces support for outlining functions across modules using codegen data generated from previous codegen. The codegen data currently manages the outlined hash tree, which records outlining instances that occurred locally in the past. The machine outliner now operates in one of three modes: 1. CGDataMode::None: This is the default outliner mode that uses the suffix tree to identify (local) outlining candidates within a module. This mode is also used by (full)LTO to maintain optimal behavior with the combined module. 2. CGDataMode::Write (`-codegen-data-generate`): This mode is identical to the default mode, but it also publishes the stable hash sequences of instructions in the outlined functions into a local outlined hash tree. It then encodes this into the `__llvm_outline` section, which will be dead-stripped at link time. 3. CGDataMode::Read (`-codegen-data-use-path={.cgdata}`): This mode reads a codegen data file (.cgdata) and initializes a global outlined hash tree. This tree is used to generate global outlining candidates. Note that the codegen data file has been post-processed with the raw `__llvm_outline` sections from all native objects using the `llvm-cgdata` tool (or a linker, `LLD`, or a new ThinLTO pipeline later). This depends on https://github.com/llvm/llvm-project/pull/105398. After this PR, LLD (https://github.com/llvm/llvm-project/pull/90166) and Clang (https://github.com/llvm/llvm-project/pull/90304) will follow for each client side support. This is a patch for https://discourse.llvm.org/t/rfc-enhanced-machine-outliner-part-2-thinlto-nolto/78753.
42 lines
2.0 KiB
LLVM
42 lines
2.0 KiB
LLVM
; This test verifies the globally outlined function name has the content hash.
|
|
|
|
; RUN: split-file %s %t
|
|
|
|
; Check if the outlined function name has the content hash depending the flag.
|
|
; RUN: llc -mtriple=arm64-apple-darwin -enable-machine-outliner -codegen-data-generate=true -append-content-hash-outlined-name=false -filetype=obj %t/local-two.ll -o %t_write_base
|
|
; RUN: llvm-objdump -d %t_write_base | FileCheck %s --check-prefix=BASE
|
|
; RUN: llc -mtriple=arm64-apple-darwin -enable-machine-outliner -codegen-data-generate=true -append-content-hash-outlined-name=true -filetype=obj %t/local-two.ll -o %t_write_suffix
|
|
; RUN: llvm-objdump -d %t_write_suffix | FileCheck %s --check-prefix=SUFFIX
|
|
; BASE-NOT: _OUTLINED_FUNCTION_{{.*}}.content.{{[0-9]+}}
|
|
; SUFFIX: _OUTLINED_FUNCTION_{{.*}}.content.{{[0-9]+}}
|
|
|
|
; Generate the cgdata file from each case and show they are identical.
|
|
; RUN: llvm-cgdata --merge %t_write_base -o %t_cgdata_base
|
|
; RUN: llvm-cgdata --merge %t_write_suffix -o %t_cgdata_suffix
|
|
; RUN: diff %t_cgdata_base %t_cgdata_suffix
|
|
|
|
; Read the cgdata in the machine outliner for optimistically outlining in local-one.ll.
|
|
; Check if the outlined function has the content hash depending the flag.
|
|
; RUN: llc -mtriple=arm64-apple-darwin -enable-machine-outliner -codegen-data-use-path=%t_cgdata_base -append-content-hash-outlined-name=false -filetype=obj %t/local-one.ll -o %t_read_base
|
|
; RUN: llvm-objdump -d %t_read_base | FileCheck %s --check-prefix=BASE
|
|
; RUN: llc -mtriple=arm64-apple-darwin -enable-machine-outliner -codegen-data-use-path=%t_cgdata_suffix -append-content-hash-outlined-name=true -filetype=obj %t/local-one.ll -o %t_read_suffix
|
|
; RUN: llvm-objdump -d %t_read_suffix | FileCheck %s --check-prefix=SUFFIX
|
|
|
|
;--- local-two.ll
|
|
declare i32 @g(i32, i32, i32)
|
|
define i32 @f1() minsize {
|
|
%1 = call i32 @g(i32 10, i32 1, i32 2);
|
|
ret i32 %1
|
|
}
|
|
define i32 @f2() minsize {
|
|
%1 = call i32 @g(i32 20, i32 1, i32 2);
|
|
ret i32 %1
|
|
}
|
|
|
|
;--- local-one.ll
|
|
declare i32 @g(i32, i32, i32)
|
|
define i32 @f3() minsize {
|
|
%1 = call i32 @g(i32 30, i32 1, i32 2);
|
|
ret i32 %1
|
|
}
|