github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/third_party/mlir/lib/Analysis/MemRefBoundCheck.cpp (about) 1 //===- MemRefBoundCheck.cpp - MLIR Affine Structures Class ----------------===// 2 // 3 // Copyright 2019 The MLIR Authors. 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 // ============================================================================= 17 // 18 // This file implements a pass to check memref accessses for out of bound 19 // accesses. 20 // 21 //===----------------------------------------------------------------------===// 22 23 #include "mlir/Analysis/AffineAnalysis.h" 24 #include "mlir/Analysis/AffineStructures.h" 25 #include "mlir/Analysis/Passes.h" 26 #include "mlir/Analysis/Utils.h" 27 #include "mlir/Dialect/AffineOps/AffineOps.h" 28 #include "mlir/Dialect/StandardOps/Ops.h" 29 #include "mlir/IR/Builders.h" 30 #include "mlir/Pass/Pass.h" 31 #include "llvm/Support/Debug.h" 32 33 #define DEBUG_TYPE "memref-bound-check" 34 35 using namespace mlir; 36 37 namespace { 38 39 /// Checks for out of bound memef access subscripts.. 40 struct MemRefBoundCheck : public FunctionPass<MemRefBoundCheck> { 41 void runOnFunction() override; 42 }; 43 44 } // end anonymous namespace 45 46 FunctionPassBase *mlir::createMemRefBoundCheckPass() { 47 return new MemRefBoundCheck(); 48 } 49 50 void MemRefBoundCheck::runOnFunction() { 51 getFunction().walk([](Operation *opInst) { 52 if (auto loadOp = dyn_cast<AffineLoadOp>(opInst)) { 53 boundCheckLoadOrStoreOp(loadOp); 54 } else if (auto storeOp = dyn_cast<AffineStoreOp>(opInst)) { 55 boundCheckLoadOrStoreOp(storeOp); 56 } 57 // TODO(bondhugula): do this for DMA ops as well. 58 }); 59 } 60 61 static PassRegistration<MemRefBoundCheck> 62 memRefBoundCheck("memref-bound-check", 63 "Check memref access bounds in a Function");