[XLA:CPU] Always set the unnamed_addr bit on constants
This allows LLVM (and the linker) to merge or pool the constants. In many cases LLVM can derive unnamed_addr by itself, but not if it's a constant being passed to a runtime function. PiperOrigin-RevId: 236298140
This commit is contained in:
parent
29d87c6c77
commit
a9b3864070
@ -189,6 +189,7 @@ llvm::Constant* IrEmitter::EmitGlobalForLiteral(const Literal& literal) {
|
||||
/*Initializer=*/initializer,
|
||||
/*Name=*/"");
|
||||
result_global->setAlignment(MinimumAlignmentForShape(literal.shape()));
|
||||
result_global->setUnnamedAddr(llvm::GlobalVariable::UnnamedAddr::Global);
|
||||
return llvm::ConstantExpr::getBitCast(
|
||||
result_global, IrShapeType(literal.shape())->getPointerTo());
|
||||
}
|
||||
|
@ -56,8 +56,8 @@ class CpuExternalConstantsTest : public CpuCodegenTest {
|
||||
|
||||
TEST_F(CpuExternalConstantsTest, Basic) {
|
||||
TestWithArray(/*rows=*/1024, /*cols=*/1024, R"(
|
||||
CHECK-NOT: @constant_global_0 = external constant [1024 x [1024 x float]], align 16
|
||||
CHECK: @0 = private constant [4194304 x i8] {{.*}}, align 16
|
||||
CHECK-NOT: @constant_global_0 = external unnamed_addr constant [1024 x [1024 x float]], align 16
|
||||
CHECK: @0 = private unnamed_addr constant [4194304 x i8] {{.*}}, align 16
|
||||
)");
|
||||
}
|
||||
|
||||
@ -65,8 +65,8 @@ TEST_F(CpuExternalConstantsTest, BasicNegative) {
|
||||
// The constant array in this test case is small enough that there is no need
|
||||
// to externalize it.
|
||||
TestWithArray(/*rows=*/4, /*cols=*/4, R"(
|
||||
CHECK-NOT: @constant_global_0 = external constant [16 x float], align 8
|
||||
CHECK: @0 = private constant [64 x i8] {{.*}}, align 8
|
||||
CHECK-NOT: @constant_global_0 = external unnamed_addr constant [16 x float], align 8
|
||||
CHECK: @0 = private unnamed_addr constant [64 x i8] {{.*}}, align 8
|
||||
)");
|
||||
}
|
||||
} // namespace
|
||||
|
@ -56,8 +56,8 @@ ENTRY main {
|
||||
)";
|
||||
|
||||
string filecheck_pattern = R"(
|
||||
CHECK: private constant [48 x i8]
|
||||
CHECK-NOT: private constant [48 x i8]
|
||||
CHECK: private unnamed_addr constant [48 x i8]
|
||||
CHECK-NOT: private unnamed_addr constant [48 x i8]
|
||||
)";
|
||||
|
||||
TF_ASSERT_OK_AND_ASSIGN(std::unique_ptr<HloModule> module,
|
||||
@ -102,10 +102,10 @@ ENTRY main {
|
||||
)";
|
||||
|
||||
string filecheck_pattern = R"(
|
||||
CHECK-DAG: private constant [4 x i8]
|
||||
CHECK-DAG: private constant [8 x i8]
|
||||
CHECK-NOT: private constant [4 x i8]
|
||||
CHECK-NOT: private constant [8 x i8]
|
||||
CHECK-DAG: private unnamed_addr constant [4 x i8]
|
||||
CHECK-DAG: private unnamed_addr constant [8 x i8]
|
||||
CHECK-NOT: private unnamed_addr constant [4 x i8]
|
||||
CHECK-NOT: private unnamed_addr constant [8 x i8]
|
||||
)";
|
||||
|
||||
TF_ASSERT_OK_AND_ASSIGN(std::unique_ptr<HloModule> module,
|
||||
|
@ -38,7 +38,7 @@ ENTRY main {
|
||||
)";
|
||||
|
||||
string filecheck_pattern = R"(
|
||||
CHECK: private constant [48 x i8]
|
||||
CHECK: private unnamed_addr constant [48 x i8]
|
||||
)";
|
||||
|
||||
TF_ASSERT_OK_AND_ASSIGN(std::unique_ptr<HloModule> module,
|
||||
|
@ -82,6 +82,7 @@ Status FusedIrEmitter::HandleConstant(HloInstruction* constant) {
|
||||
/*Linkage=*/llvm::GlobalValue::PrivateLinkage,
|
||||
/*Initializer=*/initializer,
|
||||
/*Name=*/"");
|
||||
global->setUnnamedAddr(llvm::GlobalVariable::UnnamedAddr::Global);
|
||||
llvm::Constant* shape_constant = llvm::ConstantExpr::getBitCast(
|
||||
global,
|
||||
llvm_ir::ShapeToIrType(literal.shape(), module_)->getPointerTo());
|
||||
|
Loading…
Reference in New Issue
Block a user