@@ -80,22 +80,25 @@ void mlir::getForwardSlice(Value root, SetVector<Operation *> *forwardSlice,
8080 forwardSlice->insert (v.rbegin (), v.rend ());
8181}
8282
83- static void getBackwardSliceImpl (Operation *op,
84- SetVector<Operation *> *backwardSlice,
85- const BackwardSliceOptions &options) {
83+ static LogicalResult getBackwardSliceImpl (Operation *op,
84+ SetVector<Operation *> *backwardSlice,
85+ const BackwardSliceOptions &options) {
8686 if (!op || op->hasTrait <OpTrait::IsIsolatedFromAbove>())
87- return ;
87+ return success () ;
8888
8989 // Evaluate whether we should keep this def.
9090 // This is useful in particular to implement scoping; i.e. return the
9191 // transitive backwardSlice in the current scope.
9292 if (options.filter && !options.filter (op))
93- return ;
93+ return success ();
94+
95+ bool succeeded = true ;
9496
9597 auto processValue = [&](Value value) {
9698 if (auto *definingOp = value.getDefiningOp ()) {
9799 if (backwardSlice->count (definingOp) == 0 )
98- getBackwardSliceImpl (definingOp, backwardSlice, options);
100+ succeeded &= getBackwardSliceImpl (definingOp, backwardSlice, options)
101+ .succeeded ();
99102 } else if (auto blockArg = dyn_cast<BlockArgument>(value)) {
100103 if (options.omitBlockArguments )
101104 return ;
@@ -106,9 +109,13 @@ static void getBackwardSliceImpl(Operation *op,
106109 // blocks of parentOp, which are not technically backward unless they flow
107110 // into us. For now, just bail.
108111 if (parentOp && backwardSlice->count (parentOp) == 0 ) {
109- assert (parentOp->getNumRegions () == 1 &&
110- llvm::hasSingleElement (parentOp->getRegion (0 ).getBlocks ()));
111- getBackwardSliceImpl (parentOp, backwardSlice, options);
112+ if (parentOp->getNumRegions () == 1 &&
113+ llvm::hasSingleElement (parentOp->getRegion (0 ).getBlocks ())) {
114+ succeeded &= getBackwardSliceImpl (parentOp, backwardSlice, options)
115+ .succeeded ();
116+ } else {
117+ succeeded = false ;
118+ }
112119 }
113120 } else {
114121 llvm_unreachable (" No definingOp and not a block argument." );
@@ -133,28 +140,30 @@ static void getBackwardSliceImpl(Operation *op,
133140 llvm::for_each (op->getOperands (), processValue);
134141
135142 backwardSlice->insert (op);
143+ return success (succeeded);
136144}
137145
138- void mlir::getBackwardSlice (Operation *op,
139- SetVector<Operation *> *backwardSlice,
140- const BackwardSliceOptions &options) {
141- getBackwardSliceImpl (op, backwardSlice, options);
146+ LogicalResult
147+ mlir::getBackwardSlice (Operation *op, SetVector<Operation *> *backwardSlice,
148+ const BackwardSliceOptions &options) {
149+ LogicalResult result = getBackwardSliceImpl (op, backwardSlice, options);
142150
143151 if (!options.inclusive ) {
144152 // Don't insert the top level operation, we just queried on it and don't
145153 // want it in the results.
146154 backwardSlice->remove (op);
147155 }
156+ return result;
148157}
149158
150- void mlir::getBackwardSlice (Value root, SetVector<Operation *> *backwardSlice,
151- const BackwardSliceOptions &options) {
159+ LogicalResult mlir::getBackwardSlice (Value root,
160+ SetVector<Operation *> *backwardSlice,
161+ const BackwardSliceOptions &options) {
152162 if (Operation *definingOp = root.getDefiningOp ()) {
153- getBackwardSlice (definingOp, backwardSlice, options);
154- return ;
163+ return getBackwardSlice (definingOp, backwardSlice, options);
155164 }
156165 Operation *bbAargOwner = cast<BlockArgument>(root).getOwner ()->getParentOp ();
157- getBackwardSlice (bbAargOwner, backwardSlice, options);
166+ return getBackwardSlice (bbAargOwner, backwardSlice, options);
158167}
159168
160169SetVector<Operation *>
@@ -170,7 +179,9 @@ mlir::getSlice(Operation *op, const BackwardSliceOptions &backwardSliceOptions,
170179 auto *currentOp = (slice)[currentIndex];
171180 // Compute and insert the backwardSlice starting from currentOp.
172181 backwardSlice.clear ();
173- getBackwardSlice (currentOp, &backwardSlice, backwardSliceOptions);
182+ auto result =
183+ getBackwardSlice (currentOp, &backwardSlice, backwardSliceOptions);
184+ assert (result.succeeded ());
174185 slice.insert_range (backwardSlice);
175186
176187 // Compute and insert the forwardSlice starting from currentOp.
@@ -193,7 +204,8 @@ static bool dependsOnCarriedVals(Value value,
193204 sliceOptions.filter = [&](Operation *op) {
194205 return !ancestorOp->isAncestor (op);
195206 };
196- getBackwardSlice (value, &slice, sliceOptions);
207+ auto result = getBackwardSlice (value, &slice, sliceOptions);
208+ assert (result.succeeded ());
197209
198210 // Check that none of the operands of the operations in the backward slice are
199211 // loop iteration arguments, and neither is the value itself.
0 commit comments