From: Lei Zhang Date: Tue, 8 Nov 2022 00:11:46 +0000 (-0500) Subject: [mlir][spirv] Don't return value when cannot fold spirv.bitcast X-Git-Tag: upstream/17.0.6~28272 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7c2d3153a9481793da58894dbf35d4994f3b67a4;p=platform%2Fupstream%2Fllvm.git [mlir][spirv] Don't return value when cannot fold spirv.bitcast Returing a value would make the canonicalization infrastructure think that folding succeeded so the pattern will be tried again when invoked via, e.g., `applyPatternsAndFoldGreedily` and eventually fail due to not converging after 10 times by default. Reviewed By: hanchung Differential Revision: https://reviews.llvm.org/D137598 --- diff --git a/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp b/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp index 57e6475..b068d23 100644 --- a/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp +++ b/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp @@ -117,22 +117,22 @@ void spirv::AccessChainOp::getCanonicalizationPatterns( //===----------------------------------------------------------------------===// OpFoldResult spirv::BitcastOp::fold(ArrayRef /*operands*/) { - Value arg = getOperand(); - if (getType() == arg.getType()) - return arg; + Value curInput = getOperand(); + if (getType() == curInput.getType()) + return curInput; // Look through nested bitcasts. - if (auto bitcast = arg.getDefiningOp()) { - Value nestedArg = bitcast.getOperand(); - if (nestedArg.getType() == getType()) - return nestedArg; + if (auto prevCast = curInput.getDefiningOp()) { + Value prevInput = prevCast.getOperand(); + if (prevInput.getType() == getType()) + return prevInput; - getOperandMutable().assign(nestedArg); + getOperandMutable().assign(prevInput); return getResult(); } // TODO(kuhar): Consider constant-folding the operand attribute. - return getResult(); + return {}; } //===----------------------------------------------------------------------===//