[IR] Add "Large Data Threshold" module metadata (#66797)

This allows us to not have to pass -mllvm flags to set the large data
threshold for (in-LLD/not-distributed) ThinLTO.

Follows https://reviews.llvm.org/D52322, which did the same for the code
model.

Since the large data threshold is tied to the code model and we disallow
mixing different code models, do the same for the large data threshold.
This commit is contained in:
Arthur Eubanks 2023-09-19 16:36:30 -07:00 committed by GitHub
parent 96ea48ff5d
commit 64573da4bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 104 additions and 0 deletions

View File

@ -922,6 +922,17 @@ public:
void setCodeModel(CodeModel::Model CL);
/// @}
/// @}
/// @name Utility function for querying and setting the large data threshold
/// @{
/// Returns the code model (tiny, small, kernel, medium or large model)
std::optional<uint64_t> getLargeDataThreshold() const;
/// Set the code model (tiny, small, kernel, medium or large)
void setLargeDataThreshold(uint64_t Threshold);
/// @}
/// @name Utility functions for querying and setting PGO summary
/// @{

View File

@ -631,6 +631,23 @@ void Module::setCodeModel(CodeModel::Model CL) {
addModuleFlag(ModFlagBehavior::Error, "Code Model", CL);
}
std::optional<uint64_t> Module::getLargeDataThreshold() const {
auto *Val =
cast_or_null<ConstantAsMetadata>(getModuleFlag("Large Data Threshold"));
if (!Val)
return std::nullopt;
return cast<ConstantInt>(Val->getValue())->getZExtValue();
}
void Module::setLargeDataThreshold(uint64_t Threshold) {
// Since the large data threshold goes along with the code model, the merge
// behavior is the same.
addModuleFlag(ModFlagBehavior::Error, "Large Data Threshold",
ConstantInt::get(Type::getInt64Ty(Context), Threshold));
}
void Module::setProfileSummary(Metadata *M, ProfileSummary::Kind Kind) {
if (Kind == ProfileSummary::PSK_CSInstr)
setModuleFlag(ModFlagBehavior::Error, "CSProfileSummary", M);

View File

@ -225,7 +225,12 @@ createTargetMachine(const Config &Conf, const Target *TheTarget, Module &M) {
std::unique_ptr<TargetMachine> TM(TheTarget->createTargetMachine(
TheTriple, Conf.CPU, Features.getString(), Conf.Options, RelocModel,
CodeModel, Conf.CGOptLevel));
assert(TM && "Failed to create target machine");
if (std::optional<uint64_t> LargeDataThreshold = M.getLargeDataThreshold())
TM->setLargeDataThreshold(*LargeDataThreshold);
return TM;
}

View File

@ -0,0 +1,10 @@
target triple = "x86_64-unknown-linux-gnu"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
define void @bar() {
ret void
}
!llvm.module.flags = !{!0, !1}
!0 = !{i32 1, !"Code Model", i32 3}
!1 = !{i32 1, !"Large Data Threshold", i32 101}

View File

@ -0,0 +1,21 @@
; RUN: llvm-as %s -o %t.o
; RUN: llvm-lto2 run -r %t.o,_start,px %t.o -o %t.s
; RUN: llvm-objdump -d %t.s.0 | FileCheck %s
target triple = "x86_64-unknown-linux-gnu"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
@data = internal constant [20 x i8] zeroinitializer
define ptr @_start() {
entry:
; CHECK-LABEL: <_start>:
; CHECK: leaq (%rip), %rax
; CHECK-NOT: movabsq
ret ptr @data
}
!llvm.module.flags = !{!0, !1}
!0 = !{i32 1, !"Code Model", i32 3}
!1 = !{i32 1, !"Large Data Threshold", i32 100}

View File

@ -0,0 +1,20 @@
; RUN: llvm-as %s -o %t.o
; RUN: llvm-lto2 run -r %t.o,_start,px %t.o -o %t.s
; RUN: llvm-objdump -d %t.s.0 | FileCheck %s
target triple = "x86_64-unknown-linux-gnu"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
@data = internal constant [20 x i8] zeroinitializer
define ptr @_start() {
entry:
; CHECK-LABEL: <_start>:
; CHECK: movabsq $0x0, %rax
ret ptr @data
}
!llvm.module.flags = !{!0, !1}
!0 = !{i32 1, !"Code Model", i32 3}
!1 = !{i32 1, !"Large Data Threshold", i32 10}

View File

@ -0,0 +1,20 @@
; RUN: llvm-as %s -o %t0.o
; RUN: llvm-as < %p/Inputs/largedatathreshold.ll > %t1.o
; RUN: not llvm-lto2 run -r %t0.o,_start,px -r %t1.o,bar,px %t0.o %t1.o -o %t2.s 2>&1 | FileCheck %s
; CHECK: 'Large Data Threshold': IDs have conflicting values
target triple = "x86_64-unknown-linux-gnu"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
@data = internal constant [20 x i8] zeroinitializer
define ptr @_start() {
entry:
ret ptr @data
}
!llvm.module.flags = !{!0, !1}
!0 = !{i32 1, !"Code Model", i32 3}
!1 = !{i32 1, !"Large Data Threshold", i32 100}