Skip to content

Commit 1120d8e

Browse files
authored
[clang][CodeGen] Add AS for Globals to SPIR & SPIRV datalayouts (#88455)
Currently neither the SPIR nor the SPIRV targets specify the AS for globals in their datalayout strings. This is problematic because CodeGen/LLVM will default to AS0 in this case, which produces Globals that end up in the private address space for e.g. OCL, HIPSPV or SYCL. This patch addresses it by completing the datalayout string.
1 parent c09384e commit 1120d8e

File tree

5 files changed

+40
-12
lines changed

5 files changed

+40
-12
lines changed

clang/lib/Basic/Targets/SPIR.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ class LLVM_LIBRARY_VISIBILITY SPIR32TargetInfo : public SPIRTargetInfo {
259259
SizeType = TargetInfo::UnsignedInt;
260260
PtrDiffType = IntPtrType = TargetInfo::SignedInt;
261261
resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
262-
"v96:128-v192:256-v256:256-v512:512-v1024:1024");
262+
"v96:128-v192:256-v256:256-v512:512-v1024:1024-G1");
263263
}
264264

265265
void getTargetDefines(const LangOptions &Opts,
@@ -276,7 +276,7 @@ class LLVM_LIBRARY_VISIBILITY SPIR64TargetInfo : public SPIRTargetInfo {
276276
SizeType = TargetInfo::UnsignedLong;
277277
PtrDiffType = IntPtrType = TargetInfo::SignedLong;
278278
resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
279-
"v96:128-v192:256-v256:256-v512:512-v1024:1024");
279+
"v96:128-v192:256-v256:256-v512:512-v1024:1024-G1");
280280
}
281281

282282
void getTargetDefines(const LangOptions &Opts,
@@ -336,7 +336,7 @@ class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public BaseSPIRVTargetInfo {
336336
SizeType = TargetInfo::UnsignedInt;
337337
PtrDiffType = IntPtrType = TargetInfo::SignedInt;
338338
resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
339-
"v96:128-v192:256-v256:256-v512:512-v1024:1024");
339+
"v96:128-v192:256-v256:256-v512:512-v1024:1024-G1");
340340
}
341341

342342
void getTargetDefines(const LangOptions &Opts,
@@ -357,7 +357,7 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public BaseSPIRVTargetInfo {
357357
SizeType = TargetInfo::UnsignedLong;
358358
PtrDiffType = IntPtrType = TargetInfo::SignedLong;
359359
resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
360-
"v96:128-v192:256-v256:256-v512:512-v1024:1024");
360+
"v96:128-v192:256-v256:256-v512:512-v1024:1024-G1");
361361
}
362362

363363
void getTargetDefines(const LangOptions &Opts,

clang/test/CodeGen/target-data.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,11 +251,11 @@
251251

252252
// RUN: %clang_cc1 -triple spir-unknown -o - -emit-llvm %s | \
253253
// RUN: FileCheck %s -check-prefix=SPIR
254-
// SPIR: target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
254+
// SPIR: target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"
255255

256256
// RUN: %clang_cc1 -triple spir64-unknown -o - -emit-llvm %s | \
257257
// RUN: FileCheck %s -check-prefix=SPIR64
258-
// SPIR64: target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
258+
// SPIR64: target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"
259259

260260
// RUN: %clang_cc1 -triple bpfel -o - -emit-llvm %s | \
261261
// RUN: FileCheck %s -check-prefix=BPFEL

llvm/lib/IR/AutoUpgrade.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5341,10 +5341,11 @@ MDNode *llvm::upgradeInstructionLoopAttachment(MDNode &N) {
53415341

53425342
std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
53435343
Triple T(TT);
5344-
// The only data layout upgrades needed for pre-GCN are setting the address
5345-
// space of globals to 1.
5346-
if (T.isAMDGPU() && !T.isAMDGCN() && !DL.contains("-G") &&
5347-
!DL.starts_with("G")) {
5344+
// The only data layout upgrades needed for pre-GCN, SPIR or SPIRV are setting
5345+
// the address space of globals to 1. This does not apply to SPIRV Logical.
5346+
if (((T.isAMDGPU() && !T.isAMDGCN()) ||
5347+
(T.isSPIR() || (T.isSPIRV() && !T.isSPIRVLogical()))) &&
5348+
!DL.contains("-G") && !DL.starts_with("G")) {
53485349
return DL.empty() ? std::string("G1") : (DL + "-G1").str();
53495350
}
53505351

llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ static std::string computeDataLayout(const Triple &TT) {
5555
// mean anything.
5656
if (Arch == Triple::spirv32)
5757
return "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
58-
"v96:128-v192:256-v256:256-v512:512-v1024:1024";
58+
"v96:128-v192:256-v256:256-v512:512-v1024:1024-G1";
5959
return "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
60-
"v96:128-v192:256-v256:256-v512:512-v1024:1024";
60+
"v96:128-v192:256-v256:256-v512:512-v1024:1024-G1";
6161
}
6262

6363
static Reloc::Model getEffectiveRelocModel(std::optional<Reloc::Model> RM) {

llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ TEST(DataLayoutUpgradeTest, ValidDataLayoutUpgrade) {
5959
EXPECT_EQ(UpgradeDataLayoutString("e-m:e-p:64:64-i64:64-i128:128-n64-S128",
6060
"riscv64"),
6161
"e-m:e-p:64:64-i64:64-i128:128-n32:64-S128");
62+
63+
// Check that SPIR && SPIRV targets add -G1 if it's not present.
64+
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spir"), "e-p:32:32-G1");
65+
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spir64"), "e-p:32:32-G1");
66+
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spirv32"), "e-p:32:32-G1");
67+
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spirv64"), "e-p:32:32-G1");
68+
// but that SPIRV Logical does not.
69+
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spirv"), "e-p:32:32");
6270
}
6371

6472
TEST(DataLayoutUpgradeTest, NoDataLayoutUpgrade) {
@@ -100,6 +108,17 @@ TEST(DataLayoutUpgradeTest, NoDataLayoutUpgrade) {
100108
"p7:64:64-G2-e-p:64:64-ni:7:8:9-p8:128:128-p9:192:256:256:32");
101109
EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-p7:64:64-G1", "amdgcn"),
102110
"e-p:64:64-p7:64:64-G1-ni:7:8:9-p8:128:128-p9:192:256:256:32");
111+
112+
// Check that SPIR & SPIRV targets don't add -G1 if there is already a -G
113+
// flag.
114+
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "spir"), "e-p:32:32-G2");
115+
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "spir64"), "e-p:32:32-G2");
116+
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "spirv32"), "e-p:32:32-G2");
117+
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "spirv64"), "e-p:32:32-G2");
118+
EXPECT_EQ(UpgradeDataLayoutString("G2", "spir"), "G2");
119+
EXPECT_EQ(UpgradeDataLayoutString("G2", "spir64"), "G2");
120+
EXPECT_EQ(UpgradeDataLayoutString("G2", "spirv32"), "G2");
121+
EXPECT_EQ(UpgradeDataLayoutString("G2", "spirv64"), "G2");
103122
}
104123

105124
TEST(DataLayoutUpgradeTest, EmptyDataLayout) {
@@ -113,6 +132,14 @@ TEST(DataLayoutUpgradeTest, EmptyDataLayout) {
113132
EXPECT_EQ(UpgradeDataLayoutString("", "r600"), "G1");
114133
EXPECT_EQ(UpgradeDataLayoutString("", "amdgcn"),
115134
"G1-ni:7:8:9-p7:160:256:256:32-p8:128:128-p9:192:256:256:32");
135+
136+
// Check that SPIR & SPIRV targets add G1 if it's not present.
137+
EXPECT_EQ(UpgradeDataLayoutString("", "spir"), "G1");
138+
EXPECT_EQ(UpgradeDataLayoutString("", "spir64"), "G1");
139+
EXPECT_EQ(UpgradeDataLayoutString("", "spirv32"), "G1");
140+
EXPECT_EQ(UpgradeDataLayoutString("", "spirv64"), "G1");
141+
// but SPIRV Logical does not.
142+
EXPECT_EQ(UpgradeDataLayoutString("", "spirv"), "");
116143
}
117144

118145
} // end namespace

0 commit comments

Comments
 (0)