@@ -379,32 +379,44 @@ static bool isDivisibleBySymbol(AffineExpr expr, unsigned symbolPos,
379379 // Note: Assignment must occur before pop, which will affect whether it
380380 // enters other execution branches.
381381 result = cast<AffineConstantExpr>(expr).getValue () == 0 ;
382+ llvm::detail::scope_exit<std::function<void (void )>> sexit (
383+ std::move (std::get<3 >(stack.back ())));
382384 stack.pop_back ();
383385 break ;
384386 }
385387 case AffineExprKind::DimId: {
386388 result = false ;
389+ llvm::detail::scope_exit<std::function<void (void )>> sexit (
390+ std::move (std::get<3 >(stack.back ())));
387391 stack.pop_back ();
388392 break ;
389393 }
390394 case AffineExprKind::SymbolId: {
391395 result = cast<AffineSymbolExpr>(expr).getPosition () == symbolPos;
396+ llvm::detail::scope_exit<std::function<void (void )>> sexit (
397+ std::move (std::get<3 >(stack.back ())));
392398 stack.pop_back ();
393399 break ;
394400 }
395401 // Checks divisibility by the given symbol for both operands.
396402 case AffineExprKind::Add: {
397403 AffineBinaryOpExpr binaryExpr = cast<AffineBinaryOpExpr>(expr);
398- stack.emplace_back (binaryExpr.getLHS (), symbolPos, opKind,
399- [&stack, &result, binaryExpr, symbolPos, opKind]() {
400- if (result) {
401- stack.emplace_back (
402- binaryExpr.getRHS (), symbolPos, opKind,
403- [&stack]() { stack.pop_back (); });
404- } else {
405- stack.pop_back ();
406- }
407- });
404+ stack.emplace_back (
405+ binaryExpr.getLHS (), symbolPos, opKind,
406+ [&stack, &result, binaryExpr, symbolPos, opKind]() {
407+ if (result) {
408+ stack.emplace_back (
409+ binaryExpr.getRHS (), symbolPos, opKind, [&stack]() {
410+ llvm::detail::scope_exit<std::function<void (void )>> sexit (
411+ std::move (std::get<3 >(stack.back ())));
412+ stack.pop_back ();
413+ });
414+ } else {
415+ llvm::detail::scope_exit<std::function<void (void )>> sexit (
416+ std::move (std::get<3 >(stack.back ())));
417+ stack.pop_back ();
418+ }
419+ });
408420 break ;
409421 }
410422 // Checks divisibility by the given symbol for both operands. Consider the
@@ -414,32 +426,44 @@ static bool isDivisibleBySymbol(AffineExpr expr, unsigned symbolPos,
414426 // is `AffineExprKind::Mod` for this reason.
415427 case AffineExprKind::Mod: {
416428 AffineBinaryOpExpr binaryExpr = cast<AffineBinaryOpExpr>(expr);
417- stack.emplace_back (binaryExpr.getLHS (), symbolPos, AffineExprKind::Mod,
418- [&stack, &result, binaryExpr, symbolPos]() {
419- if (result) {
420- stack.emplace_back (
421- binaryExpr.getRHS (), symbolPos,
422- AffineExprKind::Mod,
423- [&stack]() { stack.pop_back (); });
424- } else {
425- stack.pop_back ();
426- }
427- });
429+ stack.emplace_back (
430+ binaryExpr.getLHS (), symbolPos, AffineExprKind::Mod,
431+ [&stack, &result, binaryExpr, symbolPos]() {
432+ if (result) {
433+ stack.emplace_back (
434+ binaryExpr.getRHS (), symbolPos, AffineExprKind::Mod,
435+ [&stack]() {
436+ llvm::detail::scope_exit<std::function<void (void )>> sexit (
437+ std::move (std::get<3 >(stack.back ())));
438+ stack.pop_back ();
439+ });
440+ } else {
441+ llvm::detail::scope_exit<std::function<void (void )>> sexit (
442+ std::move (std::get<3 >(stack.back ())));
443+ stack.pop_back ();
444+ }
445+ });
428446 break ;
429447 }
430448 // Checks if any of the operand divisible by the given symbol.
431449 case AffineExprKind::Mul: {
432450 AffineBinaryOpExpr binaryExpr = cast<AffineBinaryOpExpr>(expr);
433- stack.emplace_back (binaryExpr.getLHS (), symbolPos, opKind,
434- [&stack, &result, binaryExpr, symbolPos, opKind]() {
435- if (!result) {
436- stack.emplace_back (
437- binaryExpr.getRHS (), symbolPos, opKind,
438- [&stack]() { stack.pop_back (); });
439- } else {
440- stack.pop_back ();
441- }
442- });
451+ stack.emplace_back (
452+ binaryExpr.getLHS (), symbolPos, opKind,
453+ [&stack, &result, binaryExpr, symbolPos, opKind]() {
454+ if (!result) {
455+ stack.emplace_back (
456+ binaryExpr.getRHS (), symbolPos, opKind, [&stack]() {
457+ llvm::detail::scope_exit<std::function<void (void )>> sexit (
458+ std::move (std::get<3 >(stack.back ())));
459+ stack.pop_back ();
460+ });
461+ } else {
462+ llvm::detail::scope_exit<std::function<void (void )>> sexit (
463+ std::move (std::get<3 >(stack.back ())));
464+ stack.pop_back ();
465+ }
466+ });
443467 break ;
444468 }
445469 // Floordiv and ceildiv are divisible by the given symbol when the first
@@ -457,19 +481,27 @@ static bool isDivisibleBySymbol(AffineExpr expr, unsigned symbolPos,
457481 AffineBinaryOpExpr binaryExpr = cast<AffineBinaryOpExpr>(expr);
458482 if (opKind != expr.getKind ()) {
459483 result = false ;
484+ llvm::detail::scope_exit<std::function<void (void )>> sexit (
485+ std::move (std::get<3 >(stack.back ())));
460486 stack.pop_back ();
461487 break ;
462488 }
463489 if (llvm::any_of (stack, [](auto &it) {
464490 return std::get<0 >(it).getKind () == AffineExprKind::Mul;
465491 })) {
466492 result = false ;
493+ llvm::detail::scope_exit<std::function<void (void )>> sexit (
494+ std::move (std::get<3 >(stack.back ())));
467495 stack.pop_back ();
468496 break ;
469497 }
470498
471- stack.emplace_back (binaryExpr.getLHS (), symbolPos, expr.getKind (),
472- [&stack]() { stack.pop_back (); });
499+ stack.emplace_back (
500+ binaryExpr.getLHS (), symbolPos, expr.getKind (), [&stack]() {
501+ llvm::detail::scope_exit<std::function<void (void )>> sexit (
502+ std::move (std::get<3 >(stack.back ())));
503+ stack.pop_back ();
504+ });
473505 break ;
474506 }
475507 llvm_unreachable (" Unknown AffineExpr" );
0 commit comments