Skip to content

Commit

Permalink
LLVM::GlobalOp: take address space as builder argument
Browse files Browse the repository at this point in the history
Accept the address space of the global as a builder argument when constructing
an LLVM::GlobalOp instance. This decreases the reliance of LLVM::GlobalOp users
on the internal name of the attribute used for this purpose. Update several
uses of the address space in GPU to NVVM conversion.

PiperOrigin-RevId: 284233254
  • Loading branch information
ftynse authored and tensorflower-gardener committed Dec 6, 2019
1 parent ccc767d commit be3ed14
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 9 deletions.
3 changes: 2 additions & 1 deletion mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
Expand Up @@ -553,7 +553,8 @@ def LLVM_GlobalOp
let builders = [
OpBuilder<"Builder *builder, OperationState &result, LLVMType type, "
"bool isConstant, Linkage linkage, StringRef name, "
"Attribute value, ArrayRef<NamedAttribute> attrs = {}">
"Attribute value, unsigned addrSpace = 0, "
"ArrayRef<NamedAttribute> attrs = {}">
];

let extraClassDeclaration = [{
Expand Down
9 changes: 2 additions & 7 deletions mlir/lib/Conversion/GPUToNVVM/LowerGpuOpsToNVVMOps.cpp
Expand Up @@ -385,12 +385,10 @@ struct GPUAllReduceOpLowering : public LLVMOpLowering {

auto arrayType = LLVM::LLVMType::getArrayTy(elementType, numElements);
StringRef name = "reduce_buffer";
auto addrSpace =
builder.getNamedAttr("addr_space", builder.getI32IntegerAttr(3));
auto globalOp = builder.create<LLVM::GlobalOp>(
loc, arrayType.cast<LLVM::LLVMType>(),
/*isConstant=*/false, LLVM::Linkage::Internal, name,
/*value=*/Attribute(), llvm::makeArrayRef(addrSpace));
/*value=*/Attribute(), gpu::GPUDialect::getWorkgroupAddressSpace());

return rewriter.create<LLVM::AddressOfOp>(loc, globalOp);
}
Expand Down Expand Up @@ -481,15 +479,12 @@ struct FuncOpLowering : LLVMOpLowering {
auto elementType =
lowering.convertType(type.getElementType()).cast<LLVM::LLVMType>();
auto arrayType = LLVM::LLVMType::getArrayTy(elementType, numElements);
auto addSpaceAttr = rewriter.getNamedAttr(
"addr_space", rewriter.getI32IntegerAttr(
gpu::GPUDialect::getWorkgroupAddressSpace()));
std::string name =
llvm::formatv("__wg_{0}_{1}", gpuFuncOp.getName(), en.index());
auto globalOp = rewriter.create<LLVM::GlobalOp>(
gpuFuncOp.getLoc(), arrayType, /*isConstant=*/false,
LLVM::Linkage::Internal, name, /*value=*/Attribute(),
llvm::makeArrayRef(addSpaceAttr));
gpu::GPUDialect::getWorkgroupAddressSpace());
workgroupBuffers.push_back(globalOp);
}

Expand Down
5 changes: 4 additions & 1 deletion mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
Expand Up @@ -869,7 +869,8 @@ static StringRef getLinkageAttrName() { return "linkage"; }

void GlobalOp::build(Builder *builder, OperationState &result, LLVMType type,
bool isConstant, Linkage linkage, StringRef name,
Attribute value, ArrayRef<NamedAttribute> attrs) {
Attribute value, unsigned addrSpace,
ArrayRef<NamedAttribute> attrs) {
result.addAttribute(SymbolTable::getSymbolAttrName(),
builder->getStringAttr(name));
result.addAttribute("type", TypeAttr::get(type));
Expand All @@ -879,6 +880,8 @@ void GlobalOp::build(Builder *builder, OperationState &result, LLVMType type,
result.addAttribute("value", value);
result.addAttribute(getLinkageAttrName(), builder->getI64IntegerAttr(
static_cast<int64_t>(linkage)));
if (addrSpace != 0)
result.addAttribute("addr_space", builder->getI32IntegerAttr(addrSpace));
result.attributes.append(attrs.begin(), attrs.end());
result.addRegion();
}
Expand Down

0 comments on commit be3ed14

Please sign in to comment.