From 4f7585195d59877624ecaab003131e1662b4f5b2 Mon Sep 17 00:00:00 2001 From: Stella Laurenzo Date: Wed, 13 Apr 2022 20:13:18 -0700 Subject: [PATCH] [NFC] Generically resolve body in FunctionOpInterface verifyBody. Since the actual implementation class can arbitrarily shadow parts of the FunctionOpInterface exported API, access the body generically instead of via the use of the interface being defined. Fixes https://github.com/llvm/llvm-project/issues/54807 Differential Revision: https://reviews.llvm.org/D123757 --- mlir/include/mlir/IR/FunctionInterfaces.td | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/mlir/include/mlir/IR/FunctionInterfaces.td b/mlir/include/mlir/IR/FunctionInterfaces.td index e1182bf..0dba0f7 100644 --- a/mlir/include/mlir/IR/FunctionInterfaces.td +++ b/mlir/include/mlir/IR/FunctionInterfaces.td @@ -86,8 +86,11 @@ def FunctionOpInterface : OpInterface<"FunctionOpInterface"> { if ($_op.isExternal()) return success(); ArrayRef fnInputTypes = $_op.getArgumentTypes(); - Block &entryBlock = $_op.front(); - + // NOTE: This should just be $_op.front() but access generically + // because the interface methods defined here may be shadowed in + // arbitrary ways. https://github.com/llvm/llvm-project/issues/54807 + Block &entryBlock = $_op->getRegion(0).front(); + unsigned numArguments = fnInputTypes.size(); if (entryBlock.getNumArguments() != numArguments) return $_op.emitOpError("entry block must have ") @@ -146,7 +149,7 @@ def FunctionOpInterface : OpInterface<"FunctionOpInterface"> { bodyRegion->push_back(body); for (Type input : inputTypes) body->addArgument(input, state.location); - } + } }]; let extraSharedClassDeclaration = [{ /// Block list iterator types. @@ -157,7 +160,7 @@ def FunctionOpInterface : OpInterface<"FunctionOpInterface"> { /// Block argument iterator types. using BlockArgListType = Region::BlockArgListType; using args_iterator = BlockArgListType::iterator; - + //===------------------------------------------------------------------===// // Body Handling //===------------------------------------------------------------------===// @@ -204,7 +207,7 @@ def FunctionOpInterface : OpInterface<"FunctionOpInterface"> { assert(empty() && "function already has an entry block"); Block *entry = new Block(); push_back(entry); - + // FIXME: Allow for passing in locations for these arguments instead of using // the operations location. ArrayRef inputTypes = $_op.getArgumentTypes(); -- 2.7.4