[PATCH] D73713: Fixed non-deterministic GPU intrisnic lowering.
Julian Gross via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 30 07:55:04 PST 2020
dfki-jugr created this revision.
Herald added subscribers: llvm-commits, liufengdb, herhut, lucyrfox, mgester, arpith-jacob, csigg, antiagainst, shauheen, burmako, jpienaar, rriddle, mehdi_amini, dmgreen, mgrang, jholewinski.
Herald added a reviewer: nicolasvasilache.
Herald added a reviewer: rriddle.
Herald added a project: LLVM.
The current implementation of the intrinsic lowering phases seemed to be
non-determinsitic accross platforms. Multiple patterns with the same
priority have been matched differently on different platforms (Windows/
Linux) (see https://reviews.llvm.org/D73471). This patch circumvents
this issue by using an adjusted pattern-rewriter benefit to avoid
clashes.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D73713
Files:
mlir/include/mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h
mlir/include/mlir/IR/PatternMatch.h
mlir/lib/Conversion/GPUCommon/OpToFuncCallLowering.h
mlir/lib/Conversion/GPUToNVVM/LowerGpuOpsToNVVMOps.cpp
mlir/lib/Conversion/GPUToROCDL/LowerGpuOpsToROCDLOps.cpp
mlir/lib/IR/PatternMatch.cpp
Index: mlir/lib/IR/PatternMatch.cpp
===================================================================
--- mlir/lib/IR/PatternMatch.cpp
+++ mlir/lib/IR/PatternMatch.cpp
@@ -24,6 +24,12 @@
return representation;
}
+PatternBenefit PatternBenefit::increase() const {
+ if (representation + 1 < ImpossibleToMatchSentinel)
+ return PatternBenefit(representation + 1);
+ return *this;
+}
+
//===----------------------------------------------------------------------===//
// Pattern implementation
//===----------------------------------------------------------------------===//
Index: mlir/lib/Conversion/GPUToROCDL/LowerGpuOpsToROCDLOps.cpp
===================================================================
--- mlir/lib/Conversion/GPUToROCDL/LowerGpuOpsToROCDLOps.cpp
+++ mlir/lib/Conversion/GPUToROCDL/LowerGpuOpsToROCDLOps.cpp
@@ -58,8 +58,9 @@
"__ocml_cos_f64");
patterns.insert<OpToFuncCallLowering<ExpOp>>(converter, "__ocml_exp_f32",
"__ocml_exp_f64");
- patterns.insert<OpToFuncCallLowering<TanhOp>>(converter, "__ocml_tanh_f32",
- "__ocml_tanh_f64");
+ patterns.insert<OpToFuncCallLowering<TanhOp>>(
+ converter, "__ocml_tanh_f32", "__ocml_tanh_f64",
+ LLVMOpLowering::getDefaultBenefit().increase());
ConversionTarget target(getContext());
target.addLegalDialect<LLVM::LLVMDialect, ROCDL::ROCDLDialect>();
Index: mlir/lib/Conversion/GPUToNVVM/LowerGpuOpsToNVVMOps.cpp
===================================================================
--- mlir/lib/Conversion/GPUToNVVM/LowerGpuOpsToNVVMOps.cpp
+++ mlir/lib/Conversion/GPUToNVVM/LowerGpuOpsToNVVMOps.cpp
@@ -746,8 +746,9 @@
"__nv_cos");
patterns.insert<OpToFuncCallLowering<ExpOp>>(converter, "__nv_expf",
"__nv_exp");
- patterns.insert<OpToFuncCallLowering<TanhOp>>(converter, "__nv_tanhf",
- "__nv_tanh");
+ patterns.insert<OpToFuncCallLowering<TanhOp>>(
+ converter, "__nv_tanhf", "__nv_tanh",
+ LLVMOpLowering::getDefaultBenefit().increase());
}
std::unique_ptr<OpPassBase<gpu::GPUModuleOp>>
Index: mlir/lib/Conversion/GPUCommon/OpToFuncCallLowering.h
===================================================================
--- mlir/lib/Conversion/GPUCommon/OpToFuncCallLowering.h
+++ mlir/lib/Conversion/GPUCommon/OpToFuncCallLowering.h
@@ -29,9 +29,10 @@
struct OpToFuncCallLowering : public LLVMOpLowering {
public:
explicit OpToFuncCallLowering(LLVMTypeConverter &lowering_, StringRef f32Func,
- StringRef f64Func)
+ StringRef f64Func,
+ PatternBenefit benefit = getDefaultBenefit())
: LLVMOpLowering(SourceOp::getOperationName(),
- lowering_.getDialect()->getContext(), lowering_),
+ lowering_.getDialect()->getContext(), lowering_, benefit),
f32Func(f32Func), f64Func(f64Func) {}
PatternMatchResult
Index: mlir/include/mlir/IR/PatternMatch.h
===================================================================
--- mlir/include/mlir/IR/PatternMatch.h
+++ mlir/include/mlir/IR/PatternMatch.h
@@ -41,6 +41,9 @@
// corresponding pattern isImpossibleToMatch() then this aborts.
unsigned short getBenefit() const;
+ /// Increases the current benefit by one (if possible).
+ PatternBenefit increase() const;
+
bool operator==(const PatternBenefit &rhs) const {
return representation == rhs.representation;
}
Index: mlir/include/mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h
===================================================================
--- mlir/include/mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h
+++ mlir/include/mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h
@@ -230,8 +230,12 @@
/// purpose of type conversions.
class LLVMOpLowering : public ConversionPattern {
public:
+ /// Returns the default benefit value of all LLVM op lowering patterns.
+ static PatternBenefit getDefaultBenefit() { return PatternBenefit(1); }
+
LLVMOpLowering(StringRef rootOpName, MLIRContext *context,
- LLVMTypeConverter &lowering, PatternBenefit benefit = 1);
+ LLVMTypeConverter &lowering,
+ PatternBenefit benefit = getDefaultBenefit());
protected:
// Back-reference to the lowering class, used to call type and function
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D73713.241456.patch
Type: text/x-patch
Size: 4603 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200130/4e4b76a7/attachment-0001.bin>
More information about the llvm-commits
mailing list