Skip to content

Commit a2eb582

Browse files
Nuri AmariNuriAmari
authored andcommitted
[swift-vfe][swift-wme] Stop disabling function mergers for Swift VFE / WME
The Swift and LLVM function mergers were disabled when Swift VFE or WME are enabled because the function merger did not respect metadata on calls to `llvm.type.checked.load`. This is no longer the case, so we can turn these passes back on.
1 parent 7c6dacb commit a2eb582

File tree

2 files changed

+45
-10
lines changed

2 files changed

+45
-10
lines changed

lib/IRGen/IRGen.cpp

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -202,14 +202,6 @@ void swift::performLLVMOptimizations(const IRGenOptions &Opts,
202202

203203
PipelineTuningOptions PTO;
204204

205-
bool RunSwiftMergeFunctions = true;
206-
// LLVM MergeFunctions and SwiftMergeFunctions don't understand that the
207-
// string in the metadata on calls in @llvm.type.checked.load intrinsics is
208-
// semantically meaningful, and mis-compile (mis-merge) unrelated functions.
209-
if (Opts.VirtualFunctionElimination || Opts.WitnessMethodElimination) {
210-
RunSwiftMergeFunctions = false;
211-
}
212-
213205
bool RunSwiftSpecificLLVMOptzns =
214206
!Opts.DisableSwiftSpecificLLVMOptzns && !Opts.DisableLLVMOptzns;
215207

@@ -222,7 +214,7 @@ void swift::performLLVMOptimizations(const IRGenOptions &Opts,
222214
PTO.LoopInterleaving = true;
223215
PTO.LoopVectorization = true;
224216
PTO.SLPVectorization = true;
225-
PTO.MergeFunctions = RunSwiftMergeFunctions;
217+
PTO.MergeFunctions = true;
226218
level = llvm::OptimizationLevel::Os;
227219
} else {
228220
level = llvm::OptimizationLevel::O0;
@@ -310,7 +302,7 @@ void swift::performLLVMOptimizations(const IRGenOptions &Opts,
310302
allowlistFiles, ignorelistFiles));
311303
});
312304
}
313-
if (RunSwiftSpecificLLVMOptzns && RunSwiftMergeFunctions) {
305+
if (RunSwiftSpecificLLVMOptzns) {
314306
PB.registerOptimizerLastEPCallback(
315307
[&](ModulePassManager &MPM, OptimizationLevel Level) {
316308
if (Level != OptimizationLevel::O0) {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
; RUN: %swift-llvm-opt -passes='swift-merge-functions' -swiftmergefunc-threshold=2 %s | %FileCheck %s
2+
3+
@g1 = external global i1
4+
@g2 = external global i1
5+
@g3 = external global i1
6+
7+
declare { ptr, i1 } @llvm.type.checked.load(ptr, i32, metadata)
8+
9+
define i1 @merge_candidate_a(ptr %ptr, i32 %offset) {
10+
%1 = call { ptr, i1 } @llvm.type.checked.load(ptr %ptr, i32 %offset, metadata !"common_metadata")
11+
%2 = extractvalue { ptr, i1 } %1, 1
12+
%3 = load i1, i1* @g1
13+
%4 = and i1 %2, %3
14+
ret i1 %4
15+
}
16+
17+
; The function using common metadata should call into the merged function
18+
19+
define i1 @merge_candidate_b(ptr %ptr, i32 %offset) {
20+
%1 = call { ptr, i1 } @llvm.type.checked.load(ptr %ptr, i32 %offset, metadata !"common_metadata")
21+
%2 = extractvalue { ptr, i1 } %1, 1
22+
%3 = load i1, i1* @g2
23+
%4 = and i1 %2, %3
24+
ret i1 %4
25+
}
26+
; CHECK-LABEL: @merge_candidate_b
27+
; CHECK: call i1 @merge_candidate_aTm
28+
; CHECK: ret
29+
30+
; The function using different metadata should not
31+
32+
define i1 @merge_candidate_c(ptr %ptr, i32 %offset) {
33+
%1 = call { ptr, i1 } @llvm.type.checked.load(ptr %ptr, i32 %offset, metadata !"different_metadata")
34+
%2 = extractvalue { ptr, i1 } %1, 1
35+
%3 = load i1, i1* @g3
36+
%4 = and i1 %2, %3
37+
ret i1 %4
38+
}
39+
; CHECK-LABEL: @merge_candidate_c
40+
; CHECK-NOT: call i1 @merge_candidate_aTm
41+
; CHECK: @llvm.type.checked.load(ptr %ptr, i32 %offset, metadata !"different_metadata")
42+
; CHECK-NOT: call i1 @merge_candidate_aTm
43+
; CHECK: ret

0 commit comments

Comments
 (0)