Skip to content

Commit ae02f96

Browse files
seven-milesmeenai
authored andcommitted
[CIR][Dialect] Add address space attribute to global op (llvm#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 28c2c55 commit ae02f96

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
@@ -183,6 +183,11 @@ bool isFPOrFPVectorTy(mlir::Type);
183183
} // namespace cir
184184
} // namespace mlir
185185

186+
mlir::ParseResult parseAddrSpaceAttribute(mlir::AsmParser &p,
187+
mlir::Attribute &addrSpaceAttr);
188+
void printAddrSpaceAttribute(mlir::AsmPrinter &p,
189+
mlir::Attribute addrSpaceAttr);
190+
186191
//===----------------------------------------------------------------------===//
187192
// CIR Dialect Tablegen'd Types
188193
//===----------------------------------------------------------------------===//

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
@@ -945,8 +945,8 @@ PointerType::verify(llvm::function_ref<mlir::InFlightDiagnostic()> emitError,
945945
return mlir::success();
946946
}
947947

948-
mlir::ParseResult parsePointerAddrSpace(mlir::AsmParser &p,
949-
mlir::Attribute &addrSpaceAttr) {
948+
mlir::ParseResult parseAddrSpaceAttribute(mlir::AsmParser &p,
949+
mlir::Attribute &addrSpaceAttr) {
950950
using mlir::cir::AddressSpaceAttr;
951951
auto attrLoc = p.getCurrentLocation();
952952

@@ -978,8 +978,8 @@ mlir::ParseResult parsePointerAddrSpace(mlir::AsmParser &p,
978978
return mlir::success();
979979
}
980980

981-
void printPointerAddrSpace(mlir::AsmPrinter &p,
982-
mlir::Attribute rawAddrSpaceAttr) {
981+
void printAddrSpaceAttribute(mlir::AsmPrinter &p,
982+
mlir::Attribute rawAddrSpaceAttr) {
983983
using mlir::cir::AddressSpaceAttr;
984984
auto addrSpaceAttr = mlir::cast<AddressSpaceAttr>(rawAddrSpaceAttr);
985985
if (addrSpaceAttr.isTarget()) {
@@ -990,6 +990,16 @@ void printPointerAddrSpace(mlir::AsmPrinter &p,
990990
}
991991
}
992992

993+
mlir::ParseResult parsePointerAddrSpace(mlir::AsmParser &p,
994+
mlir::Attribute &addrSpaceAttr) {
995+
return parseAddrSpaceAttribute(p, addrSpaceAttr);
996+
}
997+
998+
void printPointerAddrSpace(mlir::AsmPrinter &p,
999+
mlir::Attribute rawAddrSpaceAttr) {
1000+
printAddrSpaceAttribute(p, rawAddrSpaceAttr);
1001+
}
1002+
9931003
//===----------------------------------------------------------------------===//
9941004
// CIR Dialect
9951005
//===----------------------------------------------------------------------===//

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)