musllvm

A pure LLVM/Clang cross compiler toolchain targeting musl C
git clone git://git.daat.foo/musllvm.git
Log | Files | Refs | README | LICENSE

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 +}