diff --git a/mlir/lib/Analysis/Utils.cpp b/mlir/lib/Analysis/Utils.cpp --- a/mlir/lib/Analysis/Utils.cpp +++ b/mlir/lib/Analysis/Utils.cpp @@ -35,9 +35,8 @@ AffineForOp currAffineForOp; // Traverse up the hierarchy collecting all 'affine.for' operation while // skipping over 'affine.if' operations. - while (currOp && ((currAffineForOp = dyn_cast(currOp)) || - isa(currOp))) { - if (currAffineForOp) + while (currOp) { + if (AffineForOp currAffineForOp = dyn_cast(currOp)) loops->push_back(currAffineForOp); currOp = currOp->getParentOp(); } @@ -54,8 +53,9 @@ // Traverse up the hierarchy collecting all `affine.for` and `affine.if` // operations. - while (currOp && (isa(currOp))) { - ops->push_back(currOp); + while (currOp) { + if (isa(currOp)) + ops->push_back(currOp); currOp = currOp->getParentOp(); } std::reverse(ops->begin(), ops->end()); diff --git a/mlir/test/Dialect/Affine/scalrep.mlir b/mlir/test/Dialect/Affine/scalrep.mlir --- a/mlir/test/Dialect/Affine/scalrep.mlir +++ b/mlir/test/Dialect/Affine/scalrep.mlir @@ -670,10 +670,34 @@ } return } - // CHECK: affine.for // CHECK-NEXT: affine.store // CHECK-NEXT: "test.use" // CHECK-NEXT: affine.store // CHECK-NEXT: } +// CHECK-LABEL: @with_inner_ops +func @with_inner_ops(%arg0: memref, %arg1: memref, %arg2: i1) { + %cst = constant 0.000000e+00 : f64 + %cst_0 = constant 3.140000e+00 : f64 + %cst_1 = constant 1.000000e+00 : f64 + affine.for %arg3 = 0 to 28 { + affine.store %cst, %arg1[%arg3] : memref + affine.store %cst_0, %arg1[%arg3] : memref + %0 = scf.if %arg2 -> (f64) { + scf.yield %cst_1 : f64 + } else { + %1 = affine.load %arg1[%arg3] : memref + scf.yield %1 : f64 + } + affine.store %0, %arg0[%arg3] : memref + } + return +} + +// CHECK: %[[pi:.+]] = constant 3.140000e+00 : f64 +// CHECK: %{{.*}} = scf.if %arg2 -> (f64) { +// CHECK: scf.yield %{{.*}} : f64 +// CHECK: } else { +// CHECK: scf.yield %[[pi]] : f64 +// CHECK: }