13fef2d26SRiver Riddle //===- TestMemRefBoundCheck.cpp - Test out of bound access checks ---------===//
23fef2d26SRiver Riddle //
33fef2d26SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43fef2d26SRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
53fef2d26SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63fef2d26SRiver Riddle //
73fef2d26SRiver Riddle //===----------------------------------------------------------------------===//
83fef2d26SRiver Riddle //
93fef2d26SRiver Riddle // This file implements a pass to check memref accesses for out of bound
103fef2d26SRiver Riddle // accesses.
113fef2d26SRiver Riddle //
123fef2d26SRiver Riddle //===----------------------------------------------------------------------===//
133fef2d26SRiver Riddle 
14755dc07dSRiver Riddle #include "mlir/Dialect/Affine/Analysis/AffineAnalysis.h"
15755dc07dSRiver Riddle #include "mlir/Dialect/Affine/Analysis/AffineStructures.h"
16755dc07dSRiver Riddle #include "mlir/Dialect/Affine/Analysis/Utils.h"
173fef2d26SRiver Riddle #include "mlir/Dialect/Affine/IR/AffineOps.h"
183fef2d26SRiver Riddle #include "mlir/IR/Builders.h"
193fef2d26SRiver Riddle #include "mlir/Pass/Pass.h"
203fef2d26SRiver Riddle #include "llvm/ADT/TypeSwitch.h"
213fef2d26SRiver Riddle #include "llvm/Support/Debug.h"
223fef2d26SRiver Riddle 
233fef2d26SRiver Riddle #define DEBUG_TYPE "memref-bound-check"
243fef2d26SRiver Riddle 
253fef2d26SRiver Riddle using namespace mlir;
263fef2d26SRiver Riddle 
273fef2d26SRiver Riddle namespace {
283fef2d26SRiver Riddle 
293fef2d26SRiver Riddle /// Checks for out of bound memref access subscripts..
303fef2d26SRiver Riddle struct TestMemRefBoundCheck
3187d6bf37SRiver Riddle     : public PassWrapper<TestMemRefBoundCheck, OperationPass<>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anonb27b7f0d0111::TestMemRefBoundCheck32*5e50dd04SRiver Riddle   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestMemRefBoundCheck)
33*5e50dd04SRiver Riddle 
34b5e22e6dSMehdi Amini   StringRef getArgument() const final { return "test-memref-bound-check"; }
getDescription__anonb27b7f0d0111::TestMemRefBoundCheck35b5e22e6dSMehdi Amini   StringRef getDescription() const final {
3687d6bf37SRiver Riddle     return "Check memref access bounds";
37b5e22e6dSMehdi Amini   }
3841574554SRiver Riddle   void runOnOperation() override;
393fef2d26SRiver Riddle };
403fef2d26SRiver Riddle 
41be0a7e9fSMehdi Amini } // namespace
423fef2d26SRiver Riddle 
runOnOperation()4341574554SRiver Riddle void TestMemRefBoundCheck::runOnOperation() {
4487d6bf37SRiver Riddle   getOperation()->walk([](Operation *opInst) {
453fef2d26SRiver Riddle     TypeSwitch<Operation *>(opInst)
463fef2d26SRiver Riddle         .Case<AffineReadOpInterface, AffineWriteOpInterface>(
473fef2d26SRiver Riddle             [](auto op) { (void)boundCheckLoadOrStoreOp(op); });
483fef2d26SRiver Riddle 
493fef2d26SRiver Riddle     // TODO: do this for DMA ops as well.
503fef2d26SRiver Riddle   });
513fef2d26SRiver Riddle }
523fef2d26SRiver Riddle 
533fef2d26SRiver Riddle namespace mlir {
543fef2d26SRiver Riddle namespace test {
registerMemRefBoundCheck()55b5e22e6dSMehdi Amini void registerMemRefBoundCheck() { PassRegistration<TestMemRefBoundCheck>(); }
563fef2d26SRiver Riddle } // namespace test
573fef2d26SRiver Riddle } // namespace mlir
58