Skip to content

Commit 76c586c

Browse files
authored
Remove plier::GlobalIdOp and related code (#174)
This op and it spirv lowering was upstreamed.
1 parent 1cf97b8 commit 76c586c

File tree

3 files changed

+45
-109
lines changed

3 files changed

+45
-109
lines changed

mlir/include/mlir-extensions/dialect/plier_util/PlierUtilOps.td

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
include "mlir/IR/OpBase.td"
1919
include "mlir/Dialect/GPU/GPUBase.td"
20-
include "mlir/IR/EnumAttr.td"
2120
include "mlir/Interfaces/ControlFlowInterfaces.td"
2221
include "mlir/Interfaces/InferTypeOpInterface.td"
2322
include "mlir/Interfaces/LoopLikeInterface.td"
@@ -275,26 +274,4 @@ def ReleaseContextOp : PlierUtil_Op<"release_context"> {
275274
let arguments = (ins PlierUtil_OpaqueType:$context);
276275
}
277276

278-
def GPUEx_Dimension : I32EnumAttr<"GpuDimension",
279-
"a dimension, either 'x', 'y', or 'z'",
280-
[
281-
I32EnumAttrCase<"x", 0>,
282-
I32EnumAttrCase<"y", 1>,
283-
I32EnumAttrCase<"z", 2>
284-
]>{
285-
let genSpecializedAttr = 0;
286-
let cppNamespace = "::plier";
287-
}
288-
def GPUEx_DimensionAttr : EnumAttr<PlierUtil_Dialect, GPUEx_Dimension, "dim">;
289-
290-
class GPU_IndexOp<string mnemonic, list<Trait> traits = []> :
291-
PlierUtil_Op<mnemonic, !listconcat(traits, [NoSideEffect])>,
292-
Arguments<(ins GPUEx_DimensionAttr:$dimension)>, Results<(outs Index)> {
293-
let assemblyFormat = "$dimension attr-dict";
294-
}
295-
296-
def GPU_GlobalIdOp : GPU_IndexOp<"gpu_global_id"> {
297-
let hasCanonicalizer = 1;
298-
}
299-
300277
#endif // PLIER_UTIL_OPS

mlir/lib/dialect/plier_util/dialect.cpp

Lines changed: 45 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -226,13 +226,57 @@ struct SpirvInputCSE : public mlir::OpRewritePattern<mlir::spirv::LoadOp> {
226226
return mlir::success();
227227
}
228228
};
229+
230+
// TODO: move to separate pass
231+
struct GenGlobalId : public mlir::OpRewritePattern<mlir::arith::AddIOp> {
232+
using OpRewritePattern::OpRewritePattern;
233+
234+
mlir::LogicalResult
235+
matchAndRewrite(mlir::arith::AddIOp op,
236+
mlir::PatternRewriter &rewriter) const override {
237+
238+
auto getArg = [](auto op, bool rev) -> mlir::Value {
239+
return rev ? op.getLhs() : op.getRhs();
240+
};
241+
242+
mlir::gpu::Dimension dim;
243+
mlir::arith::MulIOp other;
244+
for (auto rev : {false, true}) {
245+
auto arg1 = getArg(op, rev);
246+
auto arg2 = getArg(op, !rev);
247+
if (auto tid = arg1.getDefiningOp<mlir::gpu::ThreadIdOp>()) {
248+
dim = tid.dimension();
249+
other = arg2.getDefiningOp<mlir::arith::MulIOp>();
250+
break;
251+
}
252+
}
253+
254+
if (!other)
255+
return mlir::failure();
256+
257+
for (auto rev : {false, true}) {
258+
auto arg1 = getArg(other, rev).getDefiningOp<mlir::gpu::BlockIdOp>();
259+
auto arg2 = getArg(other, !rev).getDefiningOp<mlir::gpu::BlockDimOp>();
260+
if (arg1 && arg2) {
261+
if (arg1.dimension() != dim || arg2.dimension() != dim)
262+
return mlir::failure();
263+
264+
rewriter.replaceOpWithNewOp<mlir::gpu::GlobalIdOp>(op, dim);
265+
return mlir::success();
266+
}
267+
}
268+
269+
return mlir::failure();
270+
}
271+
};
229272
} // namespace
230273

231274
void PlierUtilDialect::getCanonicalizationPatterns(
232275
mlir::RewritePatternSet &results) const {
233276
results.add<DimExpandShape<mlir::tensor::DimOp, mlir::tensor::ExpandShapeOp>,
234277
DimExpandShape<mlir::memref::DimOp, mlir::memref::ExpandShapeOp>,
235-
DimInsertSlice, FillExtractSlice, SpirvInputCSE>(getContext());
278+
DimInsertSlice, FillExtractSlice, SpirvInputCSE, GenGlobalId>(
279+
getContext());
236280
}
237281

238282
OpaqueType OpaqueType::get(mlir::MLIRContext *context) {
@@ -1512,56 +1556,6 @@ void TakeContextOp::build(mlir::OpBuilder &b, mlir::OperationState &result,
15121556
build(b, result, allTypes, initFunc, releaseFunc);
15131557
}
15141558

1515-
namespace {
1516-
struct GenGlobalId : public mlir::OpRewritePattern<mlir::arith::AddIOp> {
1517-
using OpRewritePattern::OpRewritePattern;
1518-
1519-
mlir::LogicalResult
1520-
matchAndRewrite(mlir::arith::AddIOp op,
1521-
mlir::PatternRewriter &rewriter) const override {
1522-
1523-
auto getArg = [](auto op, bool rev) -> mlir::Value {
1524-
return rev ? op.getLhs() : op.getRhs();
1525-
};
1526-
1527-
mlir::gpu::Dimension dim;
1528-
mlir::arith::MulIOp other;
1529-
for (auto rev : {false, true}) {
1530-
auto arg1 = getArg(op, rev);
1531-
auto arg2 = getArg(op, !rev);
1532-
if (auto tid = arg1.getDefiningOp<mlir::gpu::ThreadIdOp>()) {
1533-
dim = tid.dimension();
1534-
other = arg2.getDefiningOp<mlir::arith::MulIOp>();
1535-
break;
1536-
}
1537-
}
1538-
1539-
if (!other)
1540-
return mlir::failure();
1541-
1542-
for (auto rev : {false, true}) {
1543-
auto arg1 = getArg(other, rev).getDefiningOp<mlir::gpu::BlockIdOp>();
1544-
auto arg2 = getArg(other, !rev).getDefiningOp<mlir::gpu::BlockDimOp>();
1545-
if (arg1 && arg2) {
1546-
if (arg1.dimension() != dim || arg2.dimension() != dim)
1547-
return mlir::failure();
1548-
1549-
rewriter.replaceOpWithNewOp<plier::GlobalIdOp>(
1550-
op, static_cast<plier::GpuDimension>(dim));
1551-
return mlir::success();
1552-
}
1553-
}
1554-
1555-
return mlir::failure();
1556-
}
1557-
};
1558-
} // namespace
1559-
1560-
void GlobalIdOp::getCanonicalizationPatterns(::mlir::RewritePatternSet &results,
1561-
::mlir::MLIRContext *context) {
1562-
results.insert<GenGlobalId>(context);
1563-
}
1564-
15651559
} // namespace plier
15661560

15671561
#include "mlir-extensions/dialect/plier_util/PlierUtilOpsDialect.cpp.inc"

numba_dpcomp/numba_dpcomp/mlir_compiler/lib/pipelines/lower_to_gpu.cpp

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,37 +1208,6 @@ class ConvertFunc : public mlir::OpConversionPattern<mlir::FuncOp> {
12081208
}
12091209
};
12101210

1211-
template <typename SourceOp, mlir::spirv::BuiltIn builtin>
1212-
class LaunchConfigConversion : public mlir::OpConversionPattern<SourceOp> {
1213-
public:
1214-
LaunchConfigConversion(mlir::TypeConverter &typeConverter,
1215-
mlir::MLIRContext *context)
1216-
: mlir::OpConversionPattern<SourceOp>(typeConverter, context,
1217-
/*benefit*/ 100) {}
1218-
// using mlir::OpConversionPattern<SourceOp>::OpConversionPattern;
1219-
1220-
mlir::LogicalResult
1221-
matchAndRewrite(SourceOp op, typename SourceOp::Adaptor adaptor,
1222-
mlir::ConversionPatternRewriter &rewriter) const override;
1223-
};
1224-
1225-
template <typename SourceOp, mlir::spirv::BuiltIn builtin>
1226-
mlir::LogicalResult LaunchConfigConversion<SourceOp, builtin>::matchAndRewrite(
1227-
SourceOp op, typename SourceOp::Adaptor adaptor,
1228-
mlir::ConversionPatternRewriter &rewriter) const {
1229-
auto *typeConverter =
1230-
this->template getTypeConverter<mlir::SPIRVTypeConverter>();
1231-
auto indexType = typeConverter->getIndexType();
1232-
1233-
// SPIR-V invocation builtin variables are a vector of type <3xi32>
1234-
auto spirvBuiltin =
1235-
mlir::spirv::getBuiltinVariableValue(op, builtin, indexType, rewriter);
1236-
rewriter.replaceOpWithNewOp<mlir::spirv::CompositeExtractOp>(
1237-
op, indexType, spirvBuiltin,
1238-
rewriter.getI32ArrayAttr({static_cast<int32_t>(op.dimension())}));
1239-
return mlir::success();
1240-
}
1241-
12421211
struct GPUToSpirvPass
12431212
: public mlir::PassWrapper<GPUToSpirvPass,
12441213
mlir::OperationPass<mlir::ModuleOp>> {
@@ -1293,10 +1262,6 @@ struct GPUToSpirvPass
12931262
ConvertStoreOp, ConvertAtomicOps, ConvertFunc>(typeConverter,
12941263
context);
12951264

1296-
patterns.insert<LaunchConfigConversion<
1297-
plier::GlobalIdOp, mlir::spirv::BuiltIn::GlobalInvocationId>>(
1298-
typeConverter, context);
1299-
13001265
if (failed(
13011266
applyFullConversion(kernelModules, *target, std::move(patterns))))
13021267
return signalPassFailure();

0 commit comments

Comments
 (0)