8f66fb784291c897a965a9ee4c280e314dc8cee4.patch (5349B)
1 From 8f66fb784291c897a965a9ee4c280e314dc8cee4 Mon Sep 17 00:00:00 2001 2 From: Nikita Popov <npopov@redhat.com> 3 Date: Tue, 18 Mar 2025 15:04:36 +0100 4 Subject: [PATCH] [GlobalMerge] Fix handling of const options 5 6 For the NewPM, the merge-const option was assigned to an unused 7 option field. Assign it to the correct one. The merge-const-aggressive 8 option was not supported -- and invalid options were silently ignored. 9 Accept it and error on invalid options. 10 11 For the LegacyPM, the corresponding cl::opt options were ignored when 12 called via opt rather than llc. 13 --- 14 llvm/include/llvm/CodeGen/GlobalMerge.h | 1 - 15 llvm/lib/CodeGen/GlobalMerge.cpp | 2 ++ 16 llvm/lib/Passes/PassBuilder.cpp | 8 ++++++- 17 llvm/lib/Passes/PassRegistry.def | 7 +++--- 18 llvm/test/Transforms/GlobalMerge/constants.ll | 22 +++++++++++++++++++ 19 5 files changed, 35 insertions(+), 5 deletions(-) 20 create mode 100644 llvm/test/Transforms/GlobalMerge/constants.ll 21 22 diff --git a/llvm/include/llvm/CodeGen/GlobalMerge.h b/llvm/include/llvm/CodeGen/GlobalMerge.h 23 index f1fb467fc7757..2220e5cfff5fb 100644 24 --- a/llvm/include/llvm/CodeGen/GlobalMerge.h 25 +++ b/llvm/include/llvm/CodeGen/GlobalMerge.h 26 @@ -25,7 +25,6 @@ struct GlobalMergeOptions { 27 unsigned MinSize = 0; 28 bool GroupByUse = true; 29 bool IgnoreSingleUse = true; 30 - bool MergeConst = false; 31 /// Whether we should merge global variables that have external linkage. 32 bool MergeExternal = true; 33 /// Whether we should merge constant global variables. 34 diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp 35 index 1aedc447935b7..d0918acbe48fa 100644 36 --- a/llvm/lib/CodeGen/GlobalMerge.cpp 37 +++ b/llvm/lib/CodeGen/GlobalMerge.cpp 38 @@ -198,6 +198,8 @@ class GlobalMerge : public FunctionPass { 39 40 explicit GlobalMerge() : FunctionPass(ID) { 41 Opt.MaxOffset = GlobalMergeMaxOffset; 42 + Opt.MergeConstantGlobals = EnableGlobalMergeOnConst; 43 + Opt.MergeConstAggressive = GlobalMergeAllConst; 44 initializeGlobalMergePass(*PassRegistry::getPassRegistry()); 45 } 46 47 diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp 48 index 7dfff2479d3cf..27c3335932633 100644 49 --- a/llvm/lib/Passes/PassBuilder.cpp 50 +++ b/llvm/lib/Passes/PassBuilder.cpp 51 @@ -1313,7 +1313,9 @@ Expected<GlobalMergeOptions> parseGlobalMergeOptions(StringRef Params) { 52 else if (ParamName == "ignore-single-use") 53 Result.IgnoreSingleUse = Enable; 54 else if (ParamName == "merge-const") 55 - Result.MergeConst = Enable; 56 + Result.MergeConstantGlobals = Enable; 57 + else if (ParamName == "merge-const-aggressive") 58 + Result.MergeConstAggressive = Enable; 59 else if (ParamName == "merge-external") 60 Result.MergeExternal = Enable; 61 else if (ParamName.consume_front("max-offset=")) { 62 @@ -1322,6 +1324,10 @@ Expected<GlobalMergeOptions> parseGlobalMergeOptions(StringRef Params) { 63 formatv("invalid GlobalMergePass parameter '{0}' ", ParamName) 64 .str(), 65 inconvertibleErrorCode()); 66 + } else { 67 + return make_error<StringError>( 68 + formatv("invalid global-merge pass parameter '{0}' ", Params).str(), 69 + inconvertibleErrorCode()); 70 } 71 } 72 return Result; 73 diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def 74 index 81f2ea52c2e84..60e3d01da5fec 100644 75 --- a/llvm/lib/Passes/PassRegistry.def 76 +++ b/llvm/lib/Passes/PassRegistry.def 77 @@ -178,9 +178,10 @@ MODULE_PASS_WITH_PARAMS( 78 "global-merge", "GlobalMergePass", 79 [TM = TM](GlobalMergeOptions Opts) { return GlobalMergePass(TM, Opts); }, 80 parseGlobalMergeOptions, 81 - "group-by-use;ignore-single-use;max-offset=N;merge-const;merge-external;" 82 - "no-group-by-use;no-ignore-single-use;no-merge-const;no-merge-external;" 83 - "size-only") 84 + "group-by-use;ignore-single-use;max-offset=N;merge-const;" 85 + "merge-const-aggressive;merge-external;no-group-by-use;" 86 + "no-ignore-single-use;no-merge-const;no-merge-const-aggressive;" 87 + "no-merge-external;size-only") 88 MODULE_PASS_WITH_PARAMS( 89 "embed-bitcode", "EmbedBitcodePass", 90 [](EmbedBitcodeOptions Opts) { return EmbedBitcodePass(Opts); }, 91 diff --git a/llvm/test/Transforms/GlobalMerge/constants.ll b/llvm/test/Transforms/GlobalMerge/constants.ll 92 new file mode 100644 93 index 0000000000000..d5c30da2533b0 94 --- /dev/null 95 +++ b/llvm/test/Transforms/GlobalMerge/constants.ll 96 @@ -0,0 +1,22 @@ 97 +; RUN: opt -global-merge -global-merge-max-offset=100 -global-merge-on-const -S < %s | FileCheck %s 98 +; RUN: opt -global-merge -global-merge-max-offset=100 -global-merge-on-const -global-merge-all-const -S < %s | FileCheck %s --check-prefix=AGGRESSIVE 99 +; RUN: opt -passes='global-merge<max-offset=100;merge-const>' -S < %s | FileCheck %s 100 +; RUN: opt -passes='global-merge<max-offset=100;merge-const;merge-const-aggressive>' -S < %s | FileCheck %s --check-prefix=AGGRESSIVE 101 + 102 +; CHECK: @_MergedGlobals = private constant <{ i32, i32 }> <{ i32 1, i32 2 }>, align 4 103 +; AGGRESSIVE: @_MergedGlobals = private constant <{ i32, i32, i32 }> <{ i32 1, i32 2, i32 3 }>, align 4 104 + 105 +@a = internal constant i32 1 106 +@b = internal constant i32 2 107 +@c = internal constant i32 3 108 + 109 +define void @use() { 110 + %a = load i32, ptr @a 111 + %b = load i32, ptr @b 112 + ret void 113 +} 114 + 115 +define void @use2() { 116 + %c = load i32, ptr @c 117 + ret void 118 +}