Skip to content

Commit 1d4801f

Browse files
authored
[mlir] fix maybeReplaceWithConstant in IntRangeOptimizations (#133556)
If a dialect is caching/reusing constants when materializing then such constants might already have `IntegerValueRangeLattice`s associated with them and the range endpoint bit widths might not match the new replacement (amongst other possible wackiness). I observed this with `%true = arith.constant true` which was materialized but had an existing `IntegerValueRangeLattice` (i.e., `solver.getOrCreateState<dataflow::IntegerValueRangeLattice>` was not uninitalized) with range endpoint bit widths: ``` umin bit width: 32 umax bit width: 32 smin bit width: 32 smax bit width: 32 ``` while the widths of the range end points for something like `%20 = arith.cmpi slt, %19, %c1_i32` (a replacement candidate) would be ``` umin bit width: 1 umax bit width: 1 smin bit width: 1 smax bit width: 1 ``` Thus, we should be clearing the analysis state each time a constant is reused.
1 parent 63bb007 commit 1d4801f

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

mlir/lib/Dialect/Arith/Transforms/IntRangeOptimizations.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,11 @@ LogicalResult maybeReplaceWithConstant(DataFlowSolver &solver,
9191
if (!constOp)
9292
return failure();
9393

94-
copyIntegerRange(solver, value, constOp->getResult(0));
95-
rewriter.replaceAllUsesWith(value, constOp->getResult(0));
94+
OpResult res = constOp->getResult(0);
95+
if (solver.lookupState<dataflow::IntegerValueRangeLattice>(res))
96+
solver.eraseState(res);
97+
copyIntegerRange(solver, value, res);
98+
rewriter.replaceAllUsesWith(value, res);
9699
return success();
97100
}
98101
} // namespace mlir::dataflow

0 commit comments

Comments
 (0)