Lines Matching refs:Context
398 inline bool ScopDetection::invalid(DetectionContext &Context, bool Assert, in invalid() argument
400 if (!Context.Verifying) { in invalid()
401 RejectLog &Log = Context.Log; in invalid()
452 DetectionContext &Context) const { in addOverApproximatedRegion()
454 if (!Context.NonAffineSubRegionSet.insert(AR)) in addOverApproximatedRegion()
463 Context.BoxedLoopsSet.insert(L); in addOverApproximatedRegion()
466 return (AllowNonAffineSubLoops || Context.BoxedLoopsSet.empty()); in addOverApproximatedRegion()
470 InvariantLoadsSetTy &RequiredILS, DetectionContext &Context) const { in onlyValidRequiredInvariantLoads()
471 Region &CurRegion = Context.CurRegion; in onlyValidRequiredInvariantLoads()
483 if (Context.RequiredILS.count(Load)) in onlyValidRequiredInvariantLoads()
485 if (!isHoistableLoad(Load, CurRegion, LI, SE, DT, Context.RequiredILS)) in onlyValidRequiredInvariantLoads()
488 for (auto NonAffineRegion : Context.NonAffineSubRegionSet) { in onlyValidRequiredInvariantLoads()
499 Context.RequiredILS.insert(RequiredILS.begin(), RequiredILS.end()); in onlyValidRequiredInvariantLoads()
539 DetectionContext &Context) const { in isAffine()
541 if (!isAffineExpr(&Context.CurRegion, Scope, S, SE, &AccessILS)) in isAffine()
544 if (!onlyValidRequiredInvariantLoads(AccessILS, Context)) in isAffine()
552 DetectionContext &Context) const { in isValidSwitch()
563 if (isAffine(ConditionSCEV, L, Context)) in isValidSwitch()
567 addOverApproximatedRegion(RI.getRegionFor(&BB), Context)) in isValidSwitch()
570 return invalid<ReportNonAffBranch>(Context, /*Assert=*/true, &BB, in isValidSwitch()
576 DetectionContext &Context) { in isValidBranch() argument
586 return isValidBranch(BB, BI, Op0, IsLoopBranch, Context) && in isValidBranch()
587 isValidBranch(BB, BI, Op1, IsLoopBranch, Context); in isValidBranch()
593 getUniqueNonErrorValue(PHI, &Context.CurRegion, this)); in isValidBranch()
599 if (!IsLoopBranch && Context.CurRegion.contains(Load)) { in isValidBranch()
600 Context.RequiredILS.insert(Load); in isValidBranch()
607 addOverApproximatedRegion(RI.getRegionFor(&BB), Context)) in isValidBranch()
609 return invalid<ReportInvalidCond>(Context, /*Assert=*/true, BI, &BB); in isValidBranch()
617 return invalid<ReportUndefOperand>(Context, /*Assert=*/true, &BB, ICmp); in isValidBranch()
623 LHS = tryForwardThroughPHI(LHS, Context.CurRegion, SE, this); in isValidBranch()
624 RHS = tryForwardThroughPHI(RHS, Context.CurRegion, SE, this); in isValidBranch()
629 addOverApproximatedRegion(RI.getRegionFor(&BB), Context); in isValidBranch()
640 if (isAffine(LHS, L, Context) && isAffine(RHS, L, Context)) in isValidBranch()
644 addOverApproximatedRegion(RI.getRegionFor(&BB), Context)) in isValidBranch()
650 return invalid<ReportNonAffBranch>(Context, /*Assert=*/true, &BB, LHS, RHS, in isValidBranch()
656 DetectionContext &Context) { in isValidCFG() argument
657 Region &CurRegion = Context.CurRegion; in isValidCFG()
671 return invalid<ReportInvalidTerminator>(Context, /*Assert=*/true, &BB); in isValidCFG()
675 return invalid<ReportUndefCond>(Context, /*Assert=*/true, TI, &BB); in isValidCFG()
678 return isValidBranch(BB, BI, Condition, IsLoopBranch, Context); in isValidCFG()
683 return isValidSwitch(BB, SI, Condition, IsLoopBranch, Context); in isValidCFG()
687 DetectionContext &Context) const { in isValidCallInst()
695 if (isValidIntrinsicInst(*II, Context)) in isValidCallInst()
720 Context.HasUnknownAccess = true; in isValidCallInst()
723 Context.AST.addUnknown(&CI); in isValidCallInst()
744 Context.HasUnknownAccess = true; in isValidCallInst()
749 Context.AST.addUnknown(&CI); in isValidCallInst()
764 DetectionContext &Context) const { in isValidIntrinsicInst()
783 if (!isValidAccess(&II, AF, BP, Context)) in isValidIntrinsicInst()
792 if (!isValidAccess(&II, AF, BP, Context)) in isValidIntrinsicInst()
798 Context)) in isValidIntrinsicInst()
875 ScopDetection::getDelinearizationTerms(DetectionContext &Context, in getDelinearizationTerms() argument
878 for (const auto &Pair : Context.Accesses[BasePointer]) { in getDelinearizationTerms()
905 if (!Context.CurRegion.contains(Inst)) in getDelinearizationTerms()
924 bool ScopDetection::hasValidArraySizes(DetectionContext &Context, in hasValidArraySizes() argument
938 Region &CurRegion = Context.CurRegion; in hasValidArraySizes()
942 if (!isAffine(DelinearizedSize, nullptr, Context)) { in hasValidArraySizes()
949 if (Context.CurRegion.contains(Load) && in hasValidArraySizes()
950 isHoistableLoad(Load, CurRegion, LI, SE, DT, Context.RequiredILS)) in hasValidArraySizes()
951 Context.RequiredILS.insert(Load); in hasValidArraySizes()
956 Context.RequiredILS)) in hasValidArraySizes()
958 Context, /*Assert=*/true, DelinearizedSize, in hasValidArraySizes()
959 Context.Accesses[BasePointer].front().first, BaseValue); in hasValidArraySizes()
967 for (const auto &Pair : Context.Accesses[BasePointer]) { in hasValidArraySizes()
971 if (!isAffine(AF, Scope, Context)) { in hasValidArraySizes()
972 invalid<ReportNonAffineAccess>(Context, /*Assert=*/true, AF, Insn, in hasValidArraySizes()
990 DetectionContext &Context, const SCEVUnknown *BasePointer, in computeAccessFunctions() argument
995 for (const auto &Pair : Context.Accesses[BasePointer]) { in computeAccessFunctions()
1005 if (isAffine(Pair.second, Scope, Context)) in computeAccessFunctions()
1019 if (!isAffine(S, Scope, Context)) in computeAccessFunctions()
1027 invalid<ReportNonAffineAccess>(Context, /*Assert=*/true, Pair.second, in computeAccessFunctions()
1035 Context.InsnToMemAcc.insert(TempMemoryAccesses.begin(), in computeAccessFunctions()
1041 bool ScopDetection::hasBaseAffineAccesses(DetectionContext &Context, in hasBaseAffineAccesses() argument
1046 auto Terms = getDelinearizationTerms(Context, BasePointer); in hasBaseAffineAccesses()
1049 Context.ElementSize[BasePointer]); in hasBaseAffineAccesses()
1051 if (!hasValidArraySizes(Context, Shape->DelinearizedSizes, BasePointer, in hasBaseAffineAccesses()
1055 return computeAccessFunctions(Context, BasePointer, Shape); in hasBaseAffineAccesses()
1058 bool ScopDetection::hasAffineMemoryAccesses(DetectionContext &Context) const { in hasAffineMemoryAccesses()
1061 if (Context.HasUnknownAccess && !Context.NonAffineAccesses.empty()) in hasAffineMemoryAccesses()
1064 for (auto &Pair : Context.NonAffineAccesses) { in hasAffineMemoryAccesses()
1067 if (!hasBaseAffineAccesses(Context, BasePointer, Scope)) { in hasAffineMemoryAccesses()
1079 DetectionContext &Context) const { in isValidAccess()
1082 return invalid<ReportNoBasePtr>(Context, /*Assert=*/true, Inst); in isValidAccess()
1086 return invalid<ReportUndefBasePtr>(Context, /*Assert=*/true, Inst); in isValidAccess()
1090 return invalid<ReportIntToPtr>(Context, /*Assert=*/true, Inst); in isValidAccess()
1094 if (!isInvariant(*BV, Context.CurRegion, Context)) in isValidAccess()
1095 return invalid<ReportVariantBasePtr>(Context, /*Assert=*/true, BV, Inst); in isValidAccess()
1108 if (Context.ElementSize[BP]) { in isValidAccess()
1109 if (!AllowDifferentTypes && Context.ElementSize[BP] != Size) in isValidAccess()
1110 return invalid<ReportDifferentArrayElementSize>(Context, /*Assert=*/true, in isValidAccess()
1113 Context.ElementSize[BP] = SE.getSMinExpr(Size, Context.ElementSize[BP]); in isValidAccess()
1115 Context.ElementSize[BP] = Size; in isValidAccess()
1122 if (Context.BoxedLoopsSet.count(L)) in isValidAccess()
1126 bool IsAffine = !IsVariantInNonAffineLoop && isAffine(AF, Scope, Context); in isValidAccess()
1129 return invalid<ReportNonAffineAccess>(Context, /*Assert=*/true, AF, Inst, in isValidAccess()
1132 Context.Accesses[BP].push_back({Inst, AF}); in isValidAccess()
1135 Context.NonAffineAccesses.insert( in isValidAccess()
1138 return invalid<ReportNonAffineAccess>(Context, /*Assert=*/true, AF, Inst, in isValidAccess()
1148 AliasSet &AS = Context.AST.getAliasSetFor( in isValidAccess()
1171 if (Inst && Context.CurRegion.contains(Inst)) { in isValidAccess()
1175 if (Load && isHoistableLoad(Load, Context.CurRegion, LI, SE, DT, in isValidAccess()
1179 Context.RequiredILS.insert(Load); in isValidAccess()
1196 return invalid<ReportAlias>(Context, /*Assert=*/true, Inst, AS); in isValidAccess()
1203 DetectionContext &Context) const { in isValidMemoryAccess()
1211 return isValidAccess(Inst, AccessFunction, BasePointer, Context); in isValidMemoryAccess()
1215 DetectionContext &Context) { in isValidInstruction() argument
1222 if (isErrorBlock(*OpInst->getParent(), Context.CurRegion)) { in isValidInstruction()
1241 if (isValidCallInst(*CI, Context)) in isValidInstruction()
1244 return invalid<ReportFuncCall>(Context, /*Assert=*/true, &Inst); in isValidInstruction()
1251 return invalid<ReportAlloca>(Context, /*Assert=*/true, &Inst); in isValidInstruction()
1256 Context.hasStores |= isa<StoreInst>(MemInst); in isValidInstruction()
1257 Context.hasLoads |= isa<LoadInst>(MemInst); in isValidInstruction()
1259 return invalid<ReportNonSimpleMemoryAccess>(Context, /*Assert=*/true, in isValidInstruction()
1262 return isValidMemoryAccess(MemInst, Context); in isValidInstruction()
1266 return invalid<ReportUnknownInst>(Context, /*Assert=*/true, &Inst); in isValidInstruction()
1280 bool ScopDetection::canUseISLTripCount(Loop *L, DetectionContext &Context) { in canUseISLTripCount() argument
1287 if (!isValidCFG(*ControlBB, true, false, Context)) in canUseISLTripCount()
1295 bool ScopDetection::isValidLoop(Loop *L, DetectionContext &Context) { in isValidLoop() argument
1326 return invalid<ReportLoopHasNoExit>(Context, /*Assert=*/true, L); in isValidLoop()
1337 return invalid<ReportLoopHasMultipleExits>(Context, /*Assert=*/true, L); in isValidLoop()
1340 if (canUseISLTripCount(L, Context)) in isValidLoop()
1345 while (R != &Context.CurRegion && !R->contains(L)) in isValidLoop()
1348 if (addOverApproximatedRegion(R, Context)) in isValidLoop()
1353 return invalid<ReportLoopBound>(Context, /*Assert=*/true, L, LoopCount); in isValidLoop()
1490 DetectionContext &Context = *Entry.get(); in expandRegion() local
1495 if (!Context.Log.hasErrors()) { in expandRegion()
1499 if (!allBlocksValid(Context) || Context.Log.hasErrors()) { in expandRegion()
1561 DetectionContext &Context = *Entry.get(); in findScops() local
1565 invalid<ReportUnprofitable>(Context, /*Assert=*/true, &R); in findScops()
1567 RegionIsValid = isValidRegion(Context); in findScops()
1569 bool HasErrors = !RegionIsValid || Context.Log.size() > 0; in findScops()
1615 bool ScopDetection::allBlocksValid(DetectionContext &Context) { in allBlocksValid() argument
1616 Region &CurRegion = Context.CurRegion; in allBlocksValid()
1622 if (!isValidLoop(L, Context) && !KeepGoing) in allBlocksValid()
1629 return invalid<ReportLoopOnlySomeLatches>(Context, /*Assert=*/true, in allBlocksValid()
1641 if (!isValidCFG(*BB, false, IsErrorBlock, Context) && !KeepGoing) in allBlocksValid()
1648 if (!isValidInstruction(*I, Context) && !KeepGoing) in allBlocksValid()
1652 if (!hasAffineMemoryAccesses(Context)) in allBlocksValid()
1658 bool ScopDetection::hasSufficientCompute(DetectionContext &Context, in hasSufficientCompute() argument
1665 for (auto *BB : Context.CurRegion.blocks()) in hasSufficientCompute()
1666 if (Context.CurRegion.contains(LI.getLoopFor(BB))) in hasSufficientCompute()
1675 DetectionContext &Context) const { in hasPossiblyDistributableLoop()
1676 for (auto *BB : Context.CurRegion.blocks()) { in hasPossiblyDistributableLoop()
1678 if (!Context.CurRegion.contains(L)) in hasPossiblyDistributableLoop()
1680 if (Context.BoxedLoopsSet.count(L)) in hasPossiblyDistributableLoop()
1694 bool ScopDetection::isProfitableRegion(DetectionContext &Context) const { in isProfitableRegion()
1695 Region &CurRegion = Context.CurRegion; in isProfitableRegion()
1702 if (!Context.hasStores || !Context.hasLoads) in isProfitableRegion()
1703 return invalid<ReportUnprofitable>(Context, /*Assert=*/true, &CurRegion); in isProfitableRegion()
1707 int NumAffineLoops = NumLoops - Context.BoxedLoopsSet.size(); in isProfitableRegion()
1715 if (NumAffineLoops == 1 && hasPossiblyDistributableLoop(Context)) in isProfitableRegion()
1724 if (NumAffineLoops == 1 && hasSufficientCompute(Context, NumLoops)) in isProfitableRegion()
1727 return invalid<ReportUnprofitable>(Context, /*Assert=*/true, &CurRegion); in isProfitableRegion()
1730 bool ScopDetection::isValidRegion(DetectionContext &Context) { in isValidRegion() argument
1731 Region &CurRegion = Context.CurRegion; in isValidRegion()
1744 return invalid<ReportUnreachableInExit>(Context, /*Assert=*/true, in isValidRegion()
1761 Context, /*Assert=*/true, PredTerm, PredTerm->getDebugLoc()); in isValidRegion()
1769 return invalid<ReportEntry>(Context, /*Assert=*/true, CurRegion.getEntry()); in isValidRegion()
1771 if (!allBlocksValid(Context)) in isValidRegion()
1775 return invalid<ReportIrreducibleRegion>(Context, /*Assert=*/true, in isValidRegion()
1940 DetectionContext Context(const_cast<Region &>(R), AA, true /*verifying*/); in verifyRegion() local
1941 isValidRegion(Context); in verifyRegion()