@@ -45,18 +45,15 @@ struct LoopUnroll : public affine::impl::AffineLoopUnrollBase<LoopUnroll> {
4545 const std::function<unsigned (AffineForOp)> getUnrollFactor;
4646
4747 LoopUnroll () : getUnrollFactor(nullptr ) {}
48- LoopUnroll (const LoopUnroll &other)
49-
50- = default ;
48+ LoopUnroll (const LoopUnroll &other) = default ;
5149 explicit LoopUnroll (
5250 std::optional<unsigned > unrollFactor = std::nullopt ,
53- bool unrollUpToFactor = false , bool unrollFull = false ,
51+ bool unrollUpToFactor = false ,
5452 const std::function<unsigned (AffineForOp)> &getUnrollFactor = nullptr)
5553 : getUnrollFactor(getUnrollFactor) {
5654 if (unrollFactor)
5755 this ->unrollFactor = *unrollFactor;
5856 this ->unrollUpToFactor = unrollUpToFactor;
59- this ->unrollFull = unrollFull;
6057 }
6158
6259 void runOnOperation () override ;
@@ -85,11 +82,17 @@ static void gatherInnermostLoops(FunctionOpInterface f,
8582}
8683
8784void LoopUnroll::runOnOperation () {
85+ if (!(unrollFactor.getValue () > 0 || unrollFactor.getValue () == -1 )) {
86+ emitError (UnknownLoc::get (&getContext ()),
87+ " Invalid option: 'unroll-factor' should be greater than 0 or "
88+ " equal to -1" );
89+ return signalPassFailure ();
90+ }
8891 FunctionOpInterface func = getOperation ();
8992 if (func.isExternal ())
9093 return ;
9194
92- if (unrollFull && unrollFullThreshold.hasValue ()) {
95+ if (unrollFactor. getValue () == - 1 && unrollFullThreshold.hasValue ()) {
9396 // Store short loops as we walk.
9497 SmallVector<AffineForOp, 4 > loops;
9598
@@ -130,7 +133,7 @@ LogicalResult LoopUnroll::runOnAffineForOp(AffineForOp forOp) {
130133 return loopUnrollByFactor (forOp, getUnrollFactor (forOp),
131134 /* annotateFn=*/ nullptr , cleanUpUnroll);
132135 // Unroll completely if full loop unroll was specified.
133- if (unrollFull )
136+ if (unrollFactor. getValue () == - 1 )
134137 return loopUnrollFull (forOp);
135138 // Otherwise, unroll by the given unroll factor.
136139 if (unrollUpToFactor)
@@ -141,9 +144,9 @@ LogicalResult LoopUnroll::runOnAffineForOp(AffineForOp forOp) {
141144
142145std::unique_ptr<InterfacePass<FunctionOpInterface>>
143146mlir::affine::createLoopUnrollPass (
144- int unrollFactor, bool unrollUpToFactor, bool unrollFull,
147+ int unrollFactor, bool unrollUpToFactor,
145148 const std::function<unsigned (AffineForOp)> &getUnrollFactor) {
146149 return std::make_unique<LoopUnroll>(
147150 unrollFactor == -1 ? std::nullopt : std::optional<unsigned >(unrollFactor),
148- unrollUpToFactor, unrollFull, getUnrollFactor);
151+ unrollUpToFactor, getUnrollFactor);
149152}
0 commit comments