21#define GEN_PASS_DEF_ARITHUNSIGNEDWHENEQUIVALENTPASS
22#include "mlir/Dialect/Arith/Transforms/Passes.h.inc"
34 CmpIPredicate pred = op.getPredicate();
36 case CmpIPredicate::sle:
37 case CmpIPredicate::slt:
38 case CmpIPredicate::sge:
39 case CmpIPredicate::sgt:
40 return success(llvm::all_of(op.getOperands(), [&solver](
Value v) ->
bool {
41 return succeeded(staticallyNonNegative(solver, v));
52 case CmpIPredicate::sle:
53 return CmpIPredicate::ule;
54 case CmpIPredicate::slt:
55 return CmpIPredicate::ult;
56 case CmpIPredicate::sge:
57 return CmpIPredicate::uge;
58 case CmpIPredicate::sgt:
59 return CmpIPredicate::ugt;
68 DataFlowListener(DataFlowSolver &s) : s(s) {}
71 void notifyOperationErased(Operation *op)
override {
72 s.eraseState(s.getProgramPointAfter(op));
84template <
typename Signed,
typename Un
signed>
86 ConvertOpToUnsigned(MLIRContext *context, DataFlowSolver &s)
87 : OpRewritePattern<
Signed>(context), solver(s) {}
89 LogicalResult matchAndRewrite(Signed op, PatternRewriter &rw)
const override {
100 DataFlowSolver &solver;
104 ConvertCmpIToUnsigned(MLIRContext *context, DataFlowSolver &s)
105 : OpRewritePattern<CmpIOp>(context), solver(s) {}
107 LogicalResult matchAndRewrite(CmpIOp op, PatternRewriter &rw)
const override {
112 op.getLhs(), op.getRhs());
117 DataFlowSolver &solver;
120struct ArithUnsignedWhenEquivalentPass
122 ArithUnsignedWhenEquivalentPass> {
124 void runOnOperation()
override {
125 Operation *op = getOperation();
127 DataFlowSolver solver;
128 solver.
load<DeadCodeAnalysis>();
129 solver.
load<IntegerRangeAnalysis>();
131 return signalPassFailure();
133 DataFlowListener listener(solver);
145 patterns.add<ConvertOpToUnsigned<DivSIOp, DivUIOp>,
146 ConvertOpToUnsigned<CeilDivSIOp, CeilDivUIOp>,
147 ConvertOpToUnsigned<FloorDivSIOp, DivUIOp>,
148 ConvertOpToUnsigned<RemSIOp, RemUIOp>,
149 ConvertOpToUnsigned<MinSIOp, MinUIOp>,
150 ConvertOpToUnsigned<MaxSIOp, MaxUIOp>,
151 ConvertOpToUnsigned<ExtSIOp, ExtUIOp>, ConvertCmpIToUnsigned>(
static CmpIPredicate toUnsignedPred(CmpIPredicate pred)
Return the unsigned equivalent of a signed comparison predicate, or the predicate itself if there is ...
static LogicalResult isCmpIConvertable(DataFlowSolver &solver, CmpIOp op)
Succeeds when the comparison predicate is a signed operation and all the operands are non-negative,...
The general data-flow analysis solver.
AnalysisT * load(Args &&...args)
Load an analysis into the solver. Return the analysis instance.
LogicalResult initializeAndRun(Operation *top)
Initialize the children analyses starting from the provided top-level operation and run the analysis ...
result_range getResults()
MLIRContext * getContext()
Return the context this operation is associated with.
OpTy replaceOpWithNewOp(Operation *op, Args &&...args)
Replace the results of the given (original) op with a new op that is created without verification (re...
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
void populateUnsignedWhenEquivalentPatterns(RewritePatternSet &patterns, DataFlowSolver &solver)
Replace signed ops with unsigned ones where they are proven equivalent.
LogicalResult staticallyNonNegative(DataFlowSolver &solver, Operation *op)
Succeeds if an op can be converted to its unsigned equivalent without changing its semantics.
Include the generated interface declarations.
const FrozenRewritePatternSet & patterns
void walkAndApplyPatterns(Operation *op, const FrozenRewritePatternSet &patterns, RewriterBase::Listener *listener=nullptr)
A fast walk-based pattern rewrite driver.
OpRewritePattern is a wrapper around RewritePattern that allows for matching and rewriting against an...