forked from OSchip/llvm-project
d4a53f3bfa
During dialect conversion, target materialization is triggered to create cast-like operations when a type mismatch occurs between the value that replaces a rewritten operation and the type that another operations expects as operands processed by the type conversion. First, a dummy cast is inserted to make sure the pattern application can proceed. The decision to trigger the user-provided materialization hook is taken later based on the result of the dummy cast having uses. However, it only has uses if other patterns constructed new operations using the casted value as operand. If existing (legal) operations use the replaced value, they may have not been updated to use the casted value yet. The conversion infra would then delete the dummy cast first, and then would replace the uses with now-invalid (null in the bast case) value. When deciding whether to trigger cast materialization, check for liveness the uses not only of the casted value, but also of all the values that it replaces. This was discovered in the finalizing bufferize pass that cleans up mutually-cancelling casts without touching other operations. It is not impossible that there are other scenarios where the dialect converison infra could produce invalid operand uses because of dummy casts erased too eagerly. Reviewed By: springerm Differential Revision: https://reviews.llvm.org/D119937 |
||
---|---|---|
.. | ||
CMakeLists.txt | ||
ControlFlowSinkUtils.cpp | ||
DialectConversion.cpp | ||
FoldUtils.cpp | ||
GreedyPatternRewriteDriver.cpp | ||
InliningUtils.cpp | ||
RegionUtils.cpp |