@@ -387,6 +387,8 @@ ScheduleTreeOptimizer::isolateFullPartialTiles(isl::schedule_node Node,
387387 isl::union_set ScheduleRangeUSet = SchedRelUMap.range ();
388388 isl::set ScheduleRange{ScheduleRangeUSet};
389389 isl::set IsolateDomain = getPartialTilePrefixes (ScheduleRange, VectorWidth);
390+ if (IsolateDomain.is_null ())
391+ return isl::schedule_node ();
390392 auto AtomicOption = getDimOptions (IsolateDomain.ctx (), " atomic" );
391393 isl::union_set IsolateOption = getIsolateOptions (IsolateDomain, 1 );
392394 Node = Node.parent ().parent ();
@@ -430,6 +432,8 @@ isl::schedule_node ScheduleTreeOptimizer::prevectSchedBand(
430432 Node =
431433 isl::manage (isl_schedule_node_band_tile (Node.release (), Sizes.release ()));
432434 Node = isolateFullPartialTiles (Node, VectorWidth);
435+ if (Node.is_null ())
436+ return isl::schedule_node ();
433437 Node = Node.child (0 );
434438 // Make sure the "trivially vectorizable loop" is not unrolled. Otherwise,
435439 // we will have troubles to match it in the backend.
@@ -543,6 +547,8 @@ ScheduleTreeOptimizer::applyPrevectBandOpt(isl::schedule_node Node) {
543547 break ;
544548 }
545549
550+ if (Node.is_null ())
551+ return isl::schedule_node ();
546552 return Node;
547553}
548554
@@ -574,7 +580,12 @@ ScheduleTreeOptimizer::optimizeBand(__isl_take isl_schedule_node *NodeArg,
574580 if (OAI->Prevect ) {
575581 // FIXME: Prevectorization requirements are different from those checked by
576582 // isTileableBandNode.
577- Node = applyPrevectBandOpt (Node);
583+ {
584+ IslMaxOperationsGuard MaxOpGuard (Node.ctx ().get (), ScheduleComputeOut);
585+ Node = applyPrevectBandOpt (Node);
586+ if (MaxOpGuard.hasQuotaExceeded () || Node.is_null ())
587+ return (isl::schedule_node ()).release ();
588+ }
578589 }
579590
580591 return Node.release ();
@@ -585,6 +596,8 @@ ScheduleTreeOptimizer::optimizeSchedule(isl::schedule Schedule,
585596 const OptimizerAdditionalInfoTy *OAI) {
586597 auto Root = Schedule.get_root ();
587598 Root = optimizeScheduleNode (Root, OAI);
599+ if (Root.is_null ())
600+ return isl::schedule ();
588601 return Root.get_schedule ();
589602}
590603
@@ -593,6 +606,8 @@ isl::schedule_node ScheduleTreeOptimizer::optimizeScheduleNode(
593606 Node = isl::manage (isl_schedule_node_map_descendant_bottom_up (
594607 Node.release (), optimizeBand,
595608 const_cast <void *>(static_cast <const void *>(OAI))));
609+ if (Node.is_null ())
610+ return isl::schedule_node ();
596611 return Node;
597612}
598613
@@ -908,6 +923,12 @@ static void runIslScheduleOptimizer(
908923 DepsChanged};
909924 if (OAI.PatternOpts || OAI.Postopts || OAI.Prevect ) {
910925 Schedule = ScheduleTreeOptimizer::optimizeSchedule (Schedule, &OAI);
926+ if (Schedule.is_null ()) {
927+ POLLY_DEBUG (dbgs () << " Invalidating scop from further optimization as "
928+ " max operations exceeded\n " );
929+ S.invalidate (COMPLEXITY, DebugLoc ());
930+ return ;
931+ }
911932 Schedule = hoistExtensionNodes (Schedule);
912933 POLLY_DEBUG (printSchedule (dbgs (), Schedule, " After post-optimizations" ));
913934 walkScheduleTreeForStatistics (Schedule, 2 );
0 commit comments