When two interposable functions are merged, we cannot replace uses and have to emit calls to a common internal function. However, writeThunk() will not actually emit a thunk if the function is too small. This leaves us in a broken state where mergeTwoFunctions already rewired the functions, but writeThunk doesn't do anything. This patch changes the implementation so that: * writeThunk() does just that. * The direct replacement of calls is moved into mergeTwoFunctions() into the non-interposable case only. * isThunkProfitable() is extracted and will be called for the non-iterposable case always, and in the interposable case only if uses are still left after replacement. This issue has been introduced in https://reviews.llvm.org/D34806, where the code for checking thunk profitability has been moved. Differential Revision: https://reviews.llvm.org/D46804 Reviewed By: whitequark llvm-svn: 332342
17 lines
341 B
LLVM
17 lines
341 B
LLVM
; RUN: opt -mergefunc -S < %s | FileCheck %s
|
|
|
|
; Weak functions too small for merging to be profitable
|
|
|
|
; CHECK: define weak i32 @foo(i8*, i32)
|
|
; CHECK-NEXT: ret i32 %1
|
|
; CHECK: define weak i32 @bar(i8*, i32)
|
|
; CHECK-NEXT: ret i32 %1
|
|
|
|
define weak i32 @foo(i8*, i32) #0 {
|
|
ret i32 %1
|
|
}
|
|
|
|
define weak i32 @bar(i8*, i32) #0 {
|
|
ret i32 %1
|
|
}
|