Skip to content

Commit 7da385d

Browse files
Revert "[mlir] allow function type cloning to fail (llvm#136300)"
This reverts commit 20a104a. Buildbot failure: https://lab.llvm.org/buildbot/#/builders/157/builds/25688 I've reproduced the build failure.
1 parent 4cb9a37 commit 7da385d

File tree

10 files changed

+44
-105
lines changed

10 files changed

+44
-105
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMTypes.td

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,7 @@ def LLVMFunctionType : LLVMType<"LLVMFunction", "func"> {
104104
bool isVarArg() const { return getVarArg(); }
105105

106106
/// Returns a clone of this function type with the given argument
107-
/// and result types. Returns null if the resulting function type would
108-
/// not verify.
107+
/// and result types.
109108
LLVMFunctionType clone(TypeRange inputs, TypeRange results) const;
110109

111110
/// Returns the result type of the function as an ArrayRef, enabling better

mlir/include/mlir/Interfaces/FunctionInterfaces.td

Lines changed: 27 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -255,105 +255,79 @@ def FunctionOpInterface : OpInterface<"FunctionOpInterface", [
255255
BlockArgListType getArguments() { return getFunctionBody().getArguments(); }
256256

257257
/// Insert a single argument of type `argType` with attributes `argAttrs` and
258-
/// location `argLoc` at `argIndex`. Returns failure if the function cannot be
259-
/// updated to have the new signature.
260-
::llvm::LogicalResult insertArgument(
261-
unsigned argIndex, ::mlir::Type argType, ::mlir::DictionaryAttr argAttrs,
262-
::mlir::Location argLoc) {
263-
return insertArguments({argIndex}, {argType}, {argAttrs}, {argLoc});
258+
/// location `argLoc` at `argIndex`.
259+
void insertArgument(unsigned argIndex, ::mlir::Type argType, ::mlir::DictionaryAttr argAttrs,
260+
::mlir::Location argLoc) {
261+
insertArguments({argIndex}, {argType}, {argAttrs}, {argLoc});
264262
}
265263

266264
/// Inserts arguments with the listed types, attributes, and locations at the
267265
/// listed indices. `argIndices` must be sorted. Arguments are inserted in the
268266
/// order they are listed, such that arguments with identical index will
269-
/// appear in the same order that they were listed here. Returns failure if
270-
/// the function cannot be updated to have the new signature.
271-
::llvm::LogicalResult insertArguments(
272-
::llvm::ArrayRef<unsigned> argIndices, ::mlir::TypeRange argTypes,
273-
::llvm::ArrayRef<::mlir::DictionaryAttr> argAttrs,
274-
::llvm::ArrayRef<::mlir::Location> argLocs) {
267+
/// appear in the same order that they were listed here.
268+
void insertArguments(::llvm::ArrayRef<unsigned> argIndices, ::mlir::TypeRange argTypes,
269+
::llvm::ArrayRef<::mlir::DictionaryAttr> argAttrs,
270+
::llvm::ArrayRef<::mlir::Location> argLocs) {
275271
unsigned originalNumArgs = $_op.getNumArguments();
276272
::mlir::Type newType = $_op.getTypeWithArgsAndResults(
277273
argIndices, argTypes, /*resultIndices=*/{}, /*resultTypes=*/{});
278-
if (!newType)
279-
return ::llvm::failure();
280274
::mlir::function_interface_impl::insertFunctionArguments(
281275
$_op, argIndices, argTypes, argAttrs, argLocs,
282276
originalNumArgs, newType);
283-
return ::llvm::success();
284277
}
285278

286-
/// Insert a single result of type `resultType` at `resultIndex`.Returns
287-
/// failure if the function cannot be updated to have the new signature.
288-
::llvm::LogicalResult insertResult(
289-
unsigned resultIndex, ::mlir::Type resultType,
290-
::mlir::DictionaryAttr resultAttrs) {
291-
return insertResults({resultIndex}, {resultType}, {resultAttrs});
279+
/// Insert a single result of type `resultType` at `resultIndex`.
280+
void insertResult(unsigned resultIndex, ::mlir::Type resultType,
281+
::mlir::DictionaryAttr resultAttrs) {
282+
insertResults({resultIndex}, {resultType}, {resultAttrs});
292283
}
293284

294285
/// Inserts results with the listed types at the listed indices.
295286
/// `resultIndices` must be sorted. Results are inserted in the order they are
296287
/// listed, such that results with identical index will appear in the same
297-
/// order that they were listed here. Returns failure if the function
298-
/// cannot be updated to have the new signature.
299-
::llvm::LogicalResult insertResults(
300-
::llvm::ArrayRef<unsigned> resultIndices,
301-
::mlir::TypeRange resultTypes,
302-
::llvm::ArrayRef<::mlir::DictionaryAttr> resultAttrs) {
288+
/// order that they were listed here.
289+
void insertResults(::llvm::ArrayRef<unsigned> resultIndices, ::mlir::TypeRange resultTypes,
290+
::llvm::ArrayRef<::mlir::DictionaryAttr> resultAttrs) {
303291
unsigned originalNumResults = $_op.getNumResults();
304292
::mlir::Type newType = $_op.getTypeWithArgsAndResults(
305293
/*argIndices=*/{}, /*argTypes=*/{}, resultIndices, resultTypes);
306-
if (!newType)
307-
return ::llvm::failure();
308294
::mlir::function_interface_impl::insertFunctionResults(
309295
$_op, resultIndices, resultTypes, resultAttrs,
310296
originalNumResults, newType);
311-
return ::llvm::success();
312297
}
313298

314-
/// Erase a single argument at `argIndex`. Returns failure if the function
315-
/// cannot be updated to have the new signature.
316-
::llvm::LogicalResult eraseArgument(unsigned argIndex) {
299+
/// Erase a single argument at `argIndex`.
300+
void eraseArgument(unsigned argIndex) {
317301
::llvm::BitVector argsToErase($_op.getNumArguments());
318302
argsToErase.set(argIndex);
319-
return eraseArguments(argsToErase);
303+
eraseArguments(argsToErase);
320304
}
321305

322-
/// Erases the arguments listed in `argIndices`. Returns failure if the
323-
/// function cannot be updated to have the new signature.
324-
::llvm::LogicalResult eraseArguments(const ::llvm::BitVector &argIndices) {
306+
/// Erases the arguments listed in `argIndices`.
307+
void eraseArguments(const ::llvm::BitVector &argIndices) {
325308
::mlir::Type newType = $_op.getTypeWithoutArgs(argIndices);
326-
if (!newType)
327-
return ::llvm::failure();
328309
::mlir::function_interface_impl::eraseFunctionArguments(
329310
$_op, argIndices, newType);
330-
return ::llvm::success();
331311
}
332312

333-
/// Erase a single result at `resultIndex`. Returns failure if the function
334-
/// cannot be updated to have the new signature.
335-
LogicalResult eraseResult(unsigned resultIndex) {
313+
/// Erase a single result at `resultIndex`.
314+
void eraseResult(unsigned resultIndex) {
336315
::llvm::BitVector resultsToErase($_op.getNumResults());
337316
resultsToErase.set(resultIndex);
338-
return eraseResults(resultsToErase);
317+
eraseResults(resultsToErase);
339318
}
340319

341-
/// Erases the results listed in `resultIndices`. Returns failure if the
342-
/// function cannot be updated to have the new signature.
343-
::llvm::LogicalResult eraseResults(const ::llvm::BitVector &resultIndices) {
320+
/// Erases the results listed in `resultIndices`.
321+
void eraseResults(const ::llvm::BitVector &resultIndices) {
344322
::mlir::Type newType = $_op.getTypeWithoutResults(resultIndices);
345-
if (!newType)
346-
return ::llvm::failure();
347323
::mlir::function_interface_impl::eraseFunctionResults(
348324
$_op, resultIndices, newType);
349-
return ::llvm::success();
350325
}
351326

352327
/// Return the type of this function with the specified arguments and
353328
/// results inserted. This is used to update the function's signature in
354329
/// the `insertArguments` and `insertResults` methods. The arrays must be
355-
/// sorted by increasing index. Return nullptr if the updated type would
356-
/// not be valid.
330+
/// sorted by increasing index.
357331
::mlir::Type getTypeWithArgsAndResults(
358332
::llvm::ArrayRef<unsigned> argIndices, ::mlir::TypeRange argTypes,
359333
::llvm::ArrayRef<unsigned> resultIndices, ::mlir::TypeRange resultTypes) {
@@ -367,8 +341,7 @@ def FunctionOpInterface : OpInterface<"FunctionOpInterface", [
367341

368342
/// Return the type of this function without the specified arguments and
369343
/// results. This is used to update the function's signature in the
370-
/// `eraseArguments` and `eraseResults` methods. Return nullptr if the
371-
/// updated type would not be valid.
344+
/// `eraseArguments` and `eraseResults` methods.
372345
::mlir::Type getTypeWithoutArgsAndResults(
373346
const ::llvm::BitVector &argIndices, const ::llvm::BitVector &resultIndices) {
374347
::llvm::SmallVector<::mlir::Type> argStorage, resultStorage;

mlir/lib/Conversion/GPUCommon/GPUOpsLowering.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,8 @@ GPUFuncOpLowering::matchAndRewrite(gpu::GPUFuncOp gpuFuncOp, OpAdaptor adaptor,
125125
// Perform signature modification
126126
rewriter.modifyOpInPlace(
127127
gpuFuncOp, [gpuFuncOp, &argIndices, &argTypes, &argAttrs, &argLocs]() {
128-
LogicalResult inserted =
129-
static_cast<FunctionOpInterface>(gpuFuncOp).insertArguments(
130-
argIndices, argTypes, argAttrs, argLocs);
131-
(void)inserted;
132-
assert(succeeded(inserted) &&
133-
"expected GPU funcs to support inserting any argument");
128+
static_cast<FunctionOpInterface>(gpuFuncOp).insertArguments(
129+
argIndices, argTypes, argAttrs, argLocs);
134130
});
135131
} else {
136132
workgroupBuffers.reserve(gpuFuncOp.getNumWorkgroupAttributions());

mlir/lib/Dialect/Bufferization/Transforms/BufferResultsToOutParams.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,7 @@ updateFuncOp(func::FuncOp func,
9292
}
9393

9494
// Erase the results.
95-
if (failed(func.eraseResults(erasedResultIndices)))
96-
return failure();
95+
func.eraseResults(erasedResultIndices);
9796

9897
// Add the new arguments to the entry block if the function is not external.
9998
if (func.isExternal())

mlir/lib/Dialect/Bufferization/Transforms/DropEquivalentBufferResults.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ mlir::bufferization::dropEquivalentBufferResults(ModuleOp module) {
113113
}
114114

115115
// Update function.
116-
if (failed(funcOp.eraseResults(erasedResultIndices)))
117-
return failure();
116+
funcOp.eraseResults(erasedResultIndices);
118117
returnOp.getOperandsMutable().assign(newReturnValues);
119118

120119
// Update function calls.

mlir/lib/Dialect/LLVMIR/IR/LLVMTypes.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,7 @@ LLVMFunctionType::getChecked(function_ref<InFlightDiagnostic()> emitError,
232232

233233
LLVMFunctionType LLVMFunctionType::clone(TypeRange inputs,
234234
TypeRange results) const {
235-
if (results.size() != 1 || !isValidResultType(results[0]))
236-
return {};
237-
if (!llvm::all_of(inputs, isValidArgumentType))
238-
return {};
235+
assert(results.size() == 1 && "expected a single result type");
239236
return get(results[0], llvm::to_vector(inputs), isVarArg());
240237
}
241238

mlir/lib/Query/Query.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,10 @@ static Operation *extractFunction(std::vector<Operation *> &ops,
8888
// Remove unused function arguments
8989
size_t currentIndex = 0;
9090
while (currentIndex < funcOp.getNumArguments()) {
91-
// Erase if possible.
9291
if (funcOp.getArgument(currentIndex).use_empty())
93-
if (succeeded(funcOp.eraseArgument(currentIndex)))
94-
continue;
95-
++currentIndex;
92+
funcOp.eraseArgument(currentIndex);
93+
else
94+
++currentIndex;
9695
}
9796

9897
return funcOp;

mlir/lib/Transforms/RemoveDeadValues.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -698,11 +698,8 @@ static void cleanUpDeadVals(RDVFinalCleanupList &list) {
698698

699699
// 3. Functions
700700
for (auto &f : list.functions) {
701-
// Some functions may not allow erasing arguments or results. These calls
702-
// return failure in such cases without modifying the function, so it's okay
703-
// to proceed.
704-
(void)f.funcOp.eraseArguments(f.nonLiveArgs);
705-
(void)f.funcOp.eraseResults(f.nonLiveRets);
701+
f.funcOp.eraseArguments(f.nonLiveArgs);
702+
f.funcOp.eraseResults(f.nonLiveRets);
706703
}
707704

708705
// 4. Operands

mlir/test/IR/test-func-erase-result.mlir

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: mlir-opt %s -test-func-erase-result -split-input-file -verify-diagnostics | FileCheck %s
1+
// RUN: mlir-opt %s -test-func-erase-result -split-input-file | FileCheck %s
22

33
// CHECK: func private @f(){{$}}
44
// CHECK-NOT: attributes{{.*}}result
@@ -66,8 +66,3 @@ func.func private @f() -> (
6666
f32 {test.erase_this_result},
6767
tensor<3xf32>
6868
)
69-
70-
// -----
71-
72-
// expected-error @below {{failed to erase results}}
73-
llvm.func @llvm_func(!llvm.ptr, i64)

mlir/test/lib/IR/TestFunc.cpp

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,8 @@ struct TestFuncInsertArg
4545
: unknownLoc);
4646
}
4747
func->removeAttr("test.insert_args");
48-
if (succeeded(func.insertArguments(indicesToInsert, typesToInsert,
49-
attrsToInsert, locsToInsert)))
50-
continue;
51-
52-
emitError(func->getLoc()) << "failed to insert arguments";
53-
return signalPassFailure();
48+
func.insertArguments(indicesToInsert, typesToInsert, attrsToInsert,
49+
locsToInsert);
5450
}
5551
}
5652
};
@@ -83,12 +79,7 @@ struct TestFuncInsertResult
8379
: DictionaryAttr::get(&getContext()));
8480
}
8581
func->removeAttr("test.insert_results");
86-
if (succeeded(func.insertResults(indicesToInsert, typesToInsert,
87-
attrsToInsert)))
88-
continue;
89-
90-
emitError(func->getLoc()) << "failed to insert results";
91-
return signalPassFailure();
82+
func.insertResults(indicesToInsert, typesToInsert, attrsToInsert);
9283
}
9384
}
9485
};
@@ -109,10 +100,7 @@ struct TestFuncEraseArg
109100
for (auto argIndex : llvm::seq<int>(0, func.getNumArguments()))
110101
if (func.getArgAttr(argIndex, "test.erase_this_arg"))
111102
indicesToErase.set(argIndex);
112-
if (succeeded(func.eraseArguments(indicesToErase)))
113-
continue;
114-
emitError(func->getLoc()) << "failed to erase arguments";
115-
return signalPassFailure();
103+
func.eraseArguments(indicesToErase);
116104
}
117105
}
118106
};
@@ -134,10 +122,7 @@ struct TestFuncEraseResult
134122
for (auto resultIndex : llvm::seq<int>(0, func.getNumResults()))
135123
if (func.getResultAttr(resultIndex, "test.erase_this_result"))
136124
indicesToErase.set(resultIndex);
137-
if (succeeded(func.eraseResults(indicesToErase)))
138-
continue;
139-
emitError(func->getLoc()) << "failed to erase results";
140-
return signalPassFailure();
125+
func.eraseResults(indicesToErase);
141126
}
142127
}
143128
};

0 commit comments

Comments
 (0)