Change parallelism detection test pass to emit a note
authorUday Bondhugula <bondhugula@google.com>
Tue, 12 Mar 2019 23:31:22 +0000 (16:31 -0700)
committerjpienaar <jpienaar@google.com>
Sat, 30 Mar 2019 00:16:27 +0000 (17:16 -0700)
- emit a note on the loop being parallel instead of setting a loop attribute
- rename the pass -test-detect-parallel (from -detect-parallel)

PiperOrigin-RevId: 238122847

mlir/include/mlir/Analysis/Passes.h
mlir/lib/Analysis/TestParallelismDetection.cpp [moved from mlir/lib/Analysis/ParallelismDetection.cpp with 68% similarity]
mlir/test/Transforms/parallelism-detection.mlir

index 1bc13ce..a3093a9 100644 (file)
@@ -35,8 +35,8 @@ FunctionPassBase *createMemRefBoundCheckPass();
 /// Creates a pass to check memref access dependences in an ML Function.
 FunctionPassBase *createMemRefDependenceCheckPass();
 
-/// Creates a pass to test parallelism detection; marks parallel loops.
-FunctionPassBase *createLoopParallelismDetectionPass();
+/// Creates a pass to test parallelism detection; emits note for parallel loops.
+FunctionPassBase *createParallelismDetectionTestPass();
 
 } // end namespace mlir
 
similarity index 68%
rename from mlir/lib/Analysis/ParallelismDetection.cpp
rename to mlir/lib/Analysis/TestParallelismDetection.cpp
index 920511e..efe3839 100644 (file)
@@ -29,26 +29,26 @@ using namespace mlir;
 
 namespace {
 
-struct LoopParallelismDetection
-    : public FunctionPass<LoopParallelismDetection> {
+struct TestParallelismDetection
+    : public FunctionPass<TestParallelismDetection> {
   void runOnFunction() override;
 };
 
 } // end anonymous namespace
 
-FunctionPassBase *mlir::createLoopParallelismDetectionPass() {
-  return new LoopParallelismDetection();
+FunctionPassBase *mlir::createParallelismDetectionTestPass() {
+  return new TestParallelismDetection();
 }
 
-// Walks the function and marks all parallel 'for' ops with an attribute.
-void LoopParallelismDetection::runOnFunction() {
+// Walks the function and emits a note for all 'for' ops detected as parallel.
+void TestParallelismDetection::runOnFunction() {
   Function *f = getFunction();
   FuncBuilder b(f);
   f->walk<AffineForOp>([&](OpPointer<AffineForOp> forOp) {
-    forOp->getInstruction()->setAttr("parallel",
-                                     b.getBoolAttr(isLoopParallel(forOp)));
+    if (isLoopParallel(forOp))
+      forOp->emitNote("parallel loop");
   });
 }
 
-static PassRegistration<LoopParallelismDetection> pass("detect-parallel",
-                                                       "Detect parallel loops");
+static PassRegistration<TestParallelismDetection>
+    pass("test-detect-parallel", "Test parallelism detection ");
index bf11fd5..91f8f92 100644 (file)
@@ -1,11 +1,14 @@
-// RUN: mlir-opt %s -detect-parallel | mlir-opt | FileCheck %s
+// RUN: mlir-opt %s -test-detect-parallel -split-input-file -verify | FileCheck %s
 
+// CHECK-LABEL: func @loop_nest_3d_outer_two_parallel
 func @loop_nest_3d_outer_two_parallel(%N : index) {
   %0 = alloc() : memref<1024 x 1024 x vector<64xf32>>
   %1 = alloc() : memref<1024 x 1024 x vector<64xf32>>
   %2 = alloc() : memref<1024 x 1024 x vector<64xf32>>
   for %i = 0 to %N {
+  // expected-note@-1 {{parallel loop}}
     for %j = 0 to %N {
+    // expected-note@-1 {{parallel loop}}
       for %k = 0 to %N {
         %5 = load %0[%i, %k] : memref<1024x1024xvector<64xf32>>
         %6 = load %1[%k, %j] : memref<1024x1024xvector<64xf32>>
@@ -13,8 +16,8 @@ func @loop_nest_3d_outer_two_parallel(%N : index) {
         %8 = mulf %5, %6 : vector<64xf32>
         %9 = addf %7, %8 : vector<64xf32>
         store %9, %2[%i, %j] : memref<1024x1024xvector<64xf32>>
-      }  // CHECK: } {parallel: false}
-    } // CHECK: } {parallel: true}
-  }  // CHECK: } {parallel: true}
+      }
+    }
+  }
   return
 }