Skip to content

Commit aedf37c

Browse files
committed
refactor interface
1 parent 09b67c9 commit aedf37c

File tree

9 files changed

+31
-80
lines changed

9 files changed

+31
-80
lines changed

mlir/include/mlir/Dialect/Arith/IR/ArithOps.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1687,7 +1687,7 @@ class BooleanConditionOrMatchingShape<string condition, string result> :
16871687
def SelectOp : Arith_Op<"select", [Pure,
16881688
AllTypesMatch<["true_value", "false_value", "result"]>,
16891689
BooleanConditionOrMatchingShape<"condition", "result">,
1690-
DeclareOpInterfaceMethods<InferIntRangeInterface, ["inferResultRangesOrPoison"]>,
1690+
DeclareOpInterfaceMethods<InferIntRangeInterface, ["inferResultRangesFromOptional"]>,
16911691
DeclareOpInterfaceMethods<SelectLikeOpInterface>]> {
16921692
let summary = "select operation";
16931693
let description = [{

mlir/include/mlir/Dialect/Vector/IR/VectorOps.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,7 @@ def Vector_FromElementsOp : Vector_Op<"from_elements", [
843843

844844
def Vector_InsertOp :
845845
Vector_Op<"insert", [Pure,
846-
DeclareOpInterfaceMethods<InferIntRangeInterface, ["inferResultRangesOrPoison"]>,
846+
DeclareOpInterfaceMethods<InferIntRangeInterface, ["inferResultRangesFromOptional"]>,
847847
PredOpTrait<"source operand and result have same element type",
848848
TCresVTEtIsSameAsOpBase<0, 0>>,
849849
AllTypesMatch<["dest", "result"]>]> {

mlir/include/mlir/IR/Matchers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ struct infer_int_range_op_binder {
129129
*bind_value = argRanges;
130130
matched = true;
131131
};
132-
inferIntRangeOp.inferResultRangesOrPoison(argRanges, setResultRanges);
132+
inferIntRangeOp.inferResultRangesFromOptional(argRanges, setResultRanges);
133133
return matched;
134134
}
135135
};

mlir/include/mlir/Interfaces/InferIntRangeInterface.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,6 @@ void defaultInferResultRangesFromOptional(InferIntRangeInterface interface,
199199
ArrayRef<ConstantIntRanges> argRanges,
200200
SetIntRangeFn setResultRanges);
201201

202-
/// Default implementation of `inferResultRangesOrPoison` which propagates
203-
/// poison and dispatches to the `inferResultRangesFromOptional`.
204-
void defaultInferResultRangesOrPoison(InferIntRangeInterface interface,
205-
ArrayRef<IntegerValueRange> argRanges,
206-
SetIntLatticeFn setResultRanges);
207-
208202
} // end namespace intrange::detail
209203
} // end namespace mlir
210204

mlir/include/mlir/Interfaces/InferIntRangeInterface.td

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ def InferIntRangeInterface : OpInterface<"InferIntRangeInterface"> {
6363
as an argument. When implemented, `setValueRange` should be called on
6464
all result values for the operation.
6565

66-
If any of the operands have poison ranges, they will be propagated to the
67-
results automatically after the metdod returns.
66+
Unlike `inferResultRanges` this method does not automatically propagate
67+
poison from the inputs. This allows more precise poison semantics
68+
control.
6869

6970
This method allows for more precise implementations when operations
7071
want to reason about inputs which may be undefined during the analysis.
@@ -78,30 +79,6 @@ def InferIntRangeInterface : OpInterface<"InferIntRangeInterface"> {
7879
::mlir::intrange::detail::defaultInferResultRanges($_op,
7980
argRanges,
8081
setResultRanges);
81-
}]>,
82-
83-
InterfaceMethod<[{
84-
Infer the bounds on the results of this op given the lattice representation
85-
of the bounds for its arguments. For each result value or block argument
86-
(that isn't a branch argument, since the dataflow analysis handles
87-
those case), the method should call `setValueRange` with that `Value`
88-
as an argument. When implemented, `setValueRange` should be called on
89-
all result values for the operation.
90-
91-
Unlike `inferResultRanges`/`inferResultRangesFromOptional` this method
92-
does not automatically propagate poison from the inputs. This allows more
93-
precise poison semantics implementation.
94-
}],
95-
/*retTy=*/"void",
96-
/*methodName=*/"inferResultRangesOrPoison",
97-
/*args=*/(ins "::llvm::ArrayRef<::mlir::IntegerValueRange>":$argRanges,
98-
"::mlir::SetIntLatticeFn":$setResultRanges),
99-
/*methodBody=*/"",
100-
/*defaultImplementation=*/[{
101-
::mlir::intrange::detail::defaultInferResultRangesOrPoison(
102-
$_op,
103-
argRanges,
104-
setResultRanges);
10582
}]>
10683
];
10784
}

mlir/lib/Analysis/DataFlow/IntegerRangeAnalysis.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ LogicalResult IntegerRangeAnalysis::visitOperation(
133133
propagateIfChanged(lattice, changed);
134134
};
135135

136-
inferrable.inferResultRangesOrPoison(argRanges, joinCallback);
136+
inferrable.inferResultRangesFromOptional(argRanges, joinCallback);
137137
return success();
138138
}
139139

@@ -176,7 +176,7 @@ void IntegerRangeAnalysis::visitNonControlFlowArguments(
176176
propagateIfChanged(lattice, changed);
177177
};
178178

179-
inferrable.inferResultRangesOrPoison(argRanges, joinCallback);
179+
inferrable.inferResultRangesFromOptional(argRanges, joinCallback);
180180
return;
181181
}
182182

mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ void arith::CmpIOp::inferResultRanges(ArrayRef<ConstantIntRanges> argRanges,
312312
// SelectOp
313313
//===----------------------------------------------------------------------===//
314314

315-
void arith::SelectOp::inferResultRangesOrPoison(
315+
void arith::SelectOp::inferResultRangesFromOptional(
316316
ArrayRef<IntegerValueRange> argRanges, SetIntLatticeFn setResultRange) {
317317
std::optional<APInt> mbCondVal =
318318
argRanges[0].isUninitialized()

mlir/lib/Dialect/Vector/IR/VectorOps.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3211,7 +3211,7 @@ void ShuffleOp::getCanonicalizationPatterns(RewritePatternSet &results,
32113211
// InsertOp
32123212
//===----------------------------------------------------------------------===//
32133213

3214-
void vector::InsertOp::inferResultRangesOrPoison(
3214+
void vector::InsertOp::inferResultRangesFromOptional(
32153215
ArrayRef<IntegerValueRange> argRanges, SetIntLatticeFn setResultRanges) {
32163216
if (argRanges[0].isUninitialized() || argRanges[1].isUninitialized())
32173217
return;

mlir/lib/Interfaces/InferIntRangeInterface.cpp

Lines changed: 21 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -229,62 +229,42 @@ void mlir::intrange::detail::defaultInferResultRanges(
229229
llvm::SmallVector<ConstantIntRanges> unpacked;
230230
unpacked.reserve(argRanges.size());
231231

232-
for (const IntegerValueRange &range : argRanges) {
233-
if (range.isUninitialized())
234-
return;
235-
unpacked.push_back(range.getValue());
236-
}
237-
238-
interface.inferResultRanges(
239-
unpacked,
240-
[&setResultRanges](Value value, const ConstantIntRanges &argRanges) {
241-
setResultRanges(value, IntegerValueRange{argRanges});
242-
});
243-
}
244-
245-
void mlir::intrange::detail::defaultInferResultRangesFromOptional(
246-
InferIntRangeInterface interface, ArrayRef<ConstantIntRanges> argRanges,
247-
SetIntRangeFn setResultRanges) {
248-
auto ranges = llvm::to_vector_of<IntegerValueRange>(argRanges);
249-
interface.inferResultRangesFromOptional(
250-
ranges,
251-
[&setResultRanges](Value value, const IntegerValueRange &argRanges) {
252-
if (!argRanges.isUninitialized())
253-
setResultRanges(value, argRanges.getValue());
254-
});
255-
}
256-
257-
void mlir::intrange::detail::defaultInferResultRangesOrPoison(
258-
InferIntRangeInterface interface, ArrayRef<IntegerValueRange> argRanges,
259-
SetIntLatticeFn setResultRanges) {
260-
261232
bool signedPoison = false;
262233
bool unsignedPoison = false;
263234
for (const IntegerValueRange &range : argRanges) {
264235
if (range.isUninitialized())
265-
continue;
236+
return;
266237

267238
const ConstantIntRanges &value = range.getValue();
239+
unpacked.push_back(value);
268240
signedPoison = signedPoison || value.isSignedPoison();
269241
unsignedPoison = unsignedPoison || value.isUnsignedPoison();
270242
}
271243

272-
auto visitor = [&](Value value, const IntegerValueRange &range) {
273-
if (range.isUninitialized())
274-
return;
275-
244+
auto visitor = [&](Value value, const ConstantIntRanges &range) {
276245
if (!signedPoison && !unsignedPoison)
277246
return setResultRanges(value, range);
278247

279-
const ConstantIntRanges &origRange = range.getValue();
280-
auto poison = ConstantIntRanges::poison(origRange.getBitWidth());
281-
APInt umin = unsignedPoison ? poison.umin() : origRange.umin();
282-
APInt umax = unsignedPoison ? poison.umax() : origRange.umax();
283-
APInt smin = signedPoison ? poison.smin() : origRange.smin();
284-
APInt smax = signedPoison ? poison.smax() : origRange.smax();
248+
auto poison = ConstantIntRanges::poison(range.getBitWidth());
249+
APInt umin = unsignedPoison ? poison.umin() : range.umin();
250+
APInt umax = unsignedPoison ? poison.umax() : range.umax();
251+
APInt smin = signedPoison ? poison.smin() : range.smin();
252+
APInt smax = signedPoison ? poison.smax() : range.smax();
285253

286254
setResultRanges(value, ConstantIntRanges(umin, umax, smin, smax));
287255
};
288256

289-
interface.inferResultRangesFromOptional(argRanges, visitor);
257+
interface.inferResultRanges(unpacked, visitor);
258+
}
259+
260+
void mlir::intrange::detail::defaultInferResultRangesFromOptional(
261+
InferIntRangeInterface interface, ArrayRef<ConstantIntRanges> argRanges,
262+
SetIntRangeFn setResultRanges) {
263+
auto ranges = llvm::to_vector_of<IntegerValueRange>(argRanges);
264+
interface.inferResultRangesFromOptional(
265+
ranges,
266+
[&setResultRanges](Value value, const IntegerValueRange &argRanges) {
267+
if (!argRanges.isUninitialized())
268+
setResultRanges(value, argRanges.getValue());
269+
});
290270
}

0 commit comments

Comments
 (0)