Skip to content

Commit 5af48b1

Browse files
seven-milelanza
authored andcommitted
[CIR][Dialect] Add address space attribute to global op (#779)
This PR adds the CIR address space attribute to GlobalOp and starts to resolve the missing feature flag `addressSpaceInGlobalVar`. The same asm format in pointer type is used: ``` cir.global external addrspace(offload_global) @addrspace1 = #cir.int<1> : !s32i ``` The parsing and printing helper is extracted into a common function to be reused by both `GlobalOp` and `PointerType` with two custom format proxy to it. That's because the signature of ODS generated method differs from the one for PointerType. Lowering to LLVM IR and CIRGen will come sequentially.
1 parent e56e6b9 commit 5af48b1

File tree

6 files changed

+53
-9
lines changed

6 files changed

+53
-9
lines changed

clang/include/clang/CIR/Dialect/IR/CIROps.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2157,6 +2157,7 @@ def GlobalOp : CIR_Op<"global",
21572157
OptionalAttr<StrAttr>:$sym_visibility,
21582158
TypeAttr:$sym_type,
21592159
Arg<GlobalLinkageKind, "linkage type">:$linkage,
2160+
OptionalAttr<AddressSpaceAttr>:$addr_space,
21602161
OptionalAttr<TLSModel>:$tls_model,
21612162
// Note this can also be a FlatSymbolRefAttr
21622163
OptionalAttr<AnyAttr>:$initial_value,
@@ -2175,6 +2176,7 @@ def GlobalOp : CIR_Op<"global",
21752176
(`comdat` $comdat^)?
21762177
($tls_model^)?
21772178
(`dsolocal` $dsolocal^)?
2179+
(`addrspace` `(` custom<GlobalOpAddrSpace>($addr_space)^ `)`)?
21782180
$sym_name
21792181
custom<GlobalOpTypeAndInitialValue>($sym_type, $initial_value, $ctorRegion, $dtorRegion)
21802182
attr-dict
@@ -2202,6 +2204,7 @@ def GlobalOp : CIR_Op<"global",
22022204
// CIR defaults to external linkage.
22032205
CArg<"cir::GlobalLinkageKind",
22042206
"cir::GlobalLinkageKind::ExternalLinkage">:$linkage,
2207+
CArg<"cir::AddressSpaceAttr", "{}">:$addrSpace,
22052208
CArg<"function_ref<void(OpBuilder &, Location)>",
22062209
"nullptr">:$ctorBuilder,
22072210
CArg<"function_ref<void(OpBuilder &, Location)>",

clang/include/clang/CIR/Dialect/IR/CIRTypes.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,11 @@ bool isFPOrFPVectorTy(mlir::Type);
181181
} // namespace cir
182182
} // namespace mlir
183183

184+
mlir::ParseResult parseAddrSpaceAttribute(mlir::AsmParser &p,
185+
mlir::Attribute &addrSpaceAttr);
186+
void printAddrSpaceAttribute(mlir::AsmPrinter &p,
187+
mlir::Attribute addrSpaceAttr);
188+
184189
//===----------------------------------------------------------------------===//
185190
// CIR Dialect Tablegen'd Types
186191
//===----------------------------------------------------------------------===//

clang/lib/CIR/CodeGen/CIRGenBuilder.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -655,10 +655,12 @@ class CIRGenBuilderTy : public CIRBaseBuilderTy {
655655
[[nodiscard]] mlir::cir::GlobalOp
656656
createGlobal(mlir::ModuleOp module, mlir::Location loc, mlir::StringRef name,
657657
mlir::Type type, bool isConst,
658-
mlir::cir::GlobalLinkageKind linkage) {
658+
mlir::cir::GlobalLinkageKind linkage,
659+
mlir::cir::AddressSpaceAttr addrSpace = {}) {
659660
mlir::OpBuilder::InsertionGuard guard(*this);
660661
setInsertionPointToStart(module.getBody());
661-
return create<mlir::cir::GlobalOp>(loc, name, type, isConst, linkage);
662+
return create<mlir::cir::GlobalOp>(loc, name, type, isConst, linkage,
663+
addrSpace);
662664
}
663665

664666
/// Creates a versioned global variable. If the symbol is already taken, an ID
@@ -667,15 +669,17 @@ class CIRGenBuilderTy : public CIRBaseBuilderTy {
667669
[[nodiscard]] mlir::cir::GlobalOp
668670
createVersionedGlobal(mlir::ModuleOp module, mlir::Location loc,
669671
mlir::StringRef name, mlir::Type type, bool isConst,
670-
mlir::cir::GlobalLinkageKind linkage) {
672+
mlir::cir::GlobalLinkageKind linkage,
673+
mlir::cir::AddressSpaceAttr addrSpace = {}) {
671674
// Create a unique name if the given name is already taken.
672675
std::string uniqueName;
673676
if (unsigned version = GlobalsVersioning[name.str()]++)
674677
uniqueName = name.str() + "." + std::to_string(version);
675678
else
676679
uniqueName = name.str();
677680

678-
return createGlobal(module, loc, uniqueName, type, isConst, linkage);
681+
return createGlobal(module, loc, uniqueName, type, isConst, linkage,
682+
addrSpace);
679683
}
680684

681685
mlir::Value createGetGlobal(mlir::cir::GlobalOp global,

clang/lib/CIR/Dialect/IR/CIRDialect.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1781,6 +1781,16 @@ static void printConstant(OpAsmPrinter &p, Attribute value) {
17811781
p.printAttribute(value);
17821782
}
17831783

1784+
static ParseResult parseGlobalOpAddrSpace(OpAsmParser &p,
1785+
AddressSpaceAttr &addrSpaceAttr) {
1786+
return parseAddrSpaceAttribute(p, addrSpaceAttr);
1787+
}
1788+
1789+
static void printGlobalOpAddrSpace(OpAsmPrinter &p, GlobalOp op,
1790+
AddressSpaceAttr addrSpaceAttr) {
1791+
printAddrSpaceAttribute(p, addrSpaceAttr);
1792+
}
1793+
17841794
static void printGlobalOpTypeAndInitialValue(OpAsmPrinter &p, GlobalOp op,
17851795
TypeAttr type, Attribute initAttr,
17861796
mlir::Region &ctorRegion,
@@ -1954,6 +1964,7 @@ LogicalResult GlobalOp::verify() {
19541964
void GlobalOp::build(OpBuilder &odsBuilder, OperationState &odsState,
19551965
StringRef sym_name, Type sym_type, bool isConstant,
19561966
cir::GlobalLinkageKind linkage,
1967+
cir::AddressSpaceAttr addrSpace,
19571968
function_ref<void(OpBuilder &, Location)> ctorBuilder,
19581969
function_ref<void(OpBuilder &, Location)> dtorBuilder) {
19591970
odsState.addAttribute(getSymNameAttrName(odsState.name),
@@ -1968,6 +1979,9 @@ void GlobalOp::build(OpBuilder &odsBuilder, OperationState &odsState,
19681979
cir::GlobalLinkageKindAttr::get(odsBuilder.getContext(), linkage);
19691980
odsState.addAttribute(getLinkageAttrName(odsState.name), linkageAttr);
19701981

1982+
if (addrSpace)
1983+
odsState.addAttribute(getAddrSpaceAttrName(odsState.name), addrSpace);
1984+
19711985
Region *ctorRegion = odsState.addRegion();
19721986
if (ctorBuilder) {
19731987
odsBuilder.createBlock(ctorRegion);

clang/lib/CIR/Dialect/IR/CIRTypes.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -851,8 +851,8 @@ PointerType::verify(llvm::function_ref<mlir::InFlightDiagnostic()> emitError,
851851
return mlir::success();
852852
}
853853

854-
mlir::ParseResult parsePointerAddrSpace(mlir::AsmParser &p,
855-
mlir::Attribute &addrSpaceAttr) {
854+
mlir::ParseResult parseAddrSpaceAttribute(mlir::AsmParser &p,
855+
mlir::Attribute &addrSpaceAttr) {
856856
using mlir::cir::AddressSpaceAttr;
857857
auto attrLoc = p.getCurrentLocation();
858858

@@ -884,8 +884,8 @@ mlir::ParseResult parsePointerAddrSpace(mlir::AsmParser &p,
884884
return mlir::success();
885885
}
886886

887-
void printPointerAddrSpace(mlir::AsmPrinter &p,
888-
mlir::Attribute rawAddrSpaceAttr) {
887+
void printAddrSpaceAttribute(mlir::AsmPrinter &p,
888+
mlir::Attribute rawAddrSpaceAttr) {
889889
using mlir::cir::AddressSpaceAttr;
890890
auto addrSpaceAttr = mlir::cast<AddressSpaceAttr>(rawAddrSpaceAttr);
891891
if (addrSpaceAttr.isTarget()) {
@@ -896,6 +896,16 @@ void printPointerAddrSpace(mlir::AsmPrinter &p,
896896
}
897897
}
898898

899+
mlir::ParseResult parsePointerAddrSpace(mlir::AsmParser &p,
900+
mlir::Attribute &addrSpaceAttr) {
901+
return parseAddrSpaceAttribute(p, addrSpaceAttr);
902+
}
903+
904+
void printPointerAddrSpace(mlir::AsmPrinter &p,
905+
mlir::Attribute rawAddrSpaceAttr) {
906+
printAddrSpaceAttribute(p, rawAddrSpaceAttr);
907+
}
908+
899909
//===----------------------------------------------------------------------===//
900910
// CIR Dialect
901911
//===----------------------------------------------------------------------===//

clang/test/CIR/IR/global.cir

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ module {
6969
%0 = cir.get_global thread_local @batata : !cir.ptr<!s32i>
7070
cir.return
7171
}
72+
73+
cir.global external addrspace(offload_global) @addrspace1 = #cir.int<1> : !s32i
74+
cir.global "private" internal addrspace(offload_local) @addrspace2 : !s32i
75+
cir.global external addrspace(target<1>) @addrspace3 = #cir.int<3> : !s32i
7276
}
7377

7478
// CHECK: cir.global external @a = #cir.int<3> : !s32i
@@ -103,4 +107,8 @@ module {
103107
// CHECK: cir.func @f35() {
104108
// CHECK: %0 = cir.get_global thread_local @batata : !cir.ptr<!s32i>
105109
// CHECK: cir.return
106-
// CHECK: }
110+
// CHECK: }
111+
112+
// CHECK: cir.global external addrspace(offload_global) @addrspace1 = #cir.int<1> : !s32i
113+
// CHECK: cir.global "private" internal addrspace(offload_local) @addrspace2 : !s32i
114+
// CHECK: cir.global external addrspace(target<1>) @addrspace3 = #cir.int<3> : !s32i

0 commit comments

Comments
 (0)