xref: /llvm-project/mlir/test/lib/Analysis/TestMemRefBoundCheck.cpp (revision 4c48f016effde67d500fc95290096aec9f3bdb70)
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;
26*4c48f016SMatthias Springer using namespace mlir::affine;
273fef2d26SRiver Riddle 
283fef2d26SRiver Riddle namespace {
293fef2d26SRiver Riddle 
303fef2d26SRiver Riddle /// Checks for out of bound memref access subscripts..
313fef2d26SRiver Riddle struct TestMemRefBoundCheck
3287d6bf37SRiver Riddle     : public PassWrapper<TestMemRefBoundCheck, OperationPass<>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anon8c0578d00111::TestMemRefBoundCheck335e50dd04SRiver Riddle   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestMemRefBoundCheck)
345e50dd04SRiver Riddle 
35b5e22e6dSMehdi Amini   StringRef getArgument() const final { return "test-memref-bound-check"; }
getDescription__anon8c0578d00111::TestMemRefBoundCheck36b5e22e6dSMehdi Amini   StringRef getDescription() const final {
3787d6bf37SRiver Riddle     return "Check memref access bounds";
38b5e22e6dSMehdi Amini   }
3941574554SRiver Riddle   void runOnOperation() override;
403fef2d26SRiver Riddle };
413fef2d26SRiver Riddle 
42be0a7e9fSMehdi Amini } // namespace
433fef2d26SRiver Riddle 
runOnOperation()4441574554SRiver Riddle void TestMemRefBoundCheck::runOnOperation() {
4587d6bf37SRiver Riddle   getOperation()->walk([](Operation *opInst) {
463fef2d26SRiver Riddle     TypeSwitch<Operation *>(opInst)
473fef2d26SRiver Riddle         .Case<AffineReadOpInterface, AffineWriteOpInterface>(
483fef2d26SRiver Riddle             [](auto op) { (void)boundCheckLoadOrStoreOp(op); });
493fef2d26SRiver Riddle 
503fef2d26SRiver Riddle     // TODO: do this for DMA ops as well.
513fef2d26SRiver Riddle   });
523fef2d26SRiver Riddle }
533fef2d26SRiver Riddle 
543fef2d26SRiver Riddle namespace mlir {
553fef2d26SRiver Riddle namespace test {
registerMemRefBoundCheck()56b5e22e6dSMehdi Amini void registerMemRefBoundCheck() { PassRegistration<TestMemRefBoundCheck>(); }
573fef2d26SRiver Riddle } // namespace test
583fef2d26SRiver Riddle } // namespace mlir
59