Lines Matching defs:ED
2740 const ExecutionDomainTy &ED = CB ? CEDMap[{CB, PRE}] : BEDMap[nullptr];
2741 if (!ED.IsReachedFromAlignedBarrierOnly ||
2742 ED.EncounteredNonLocalSideEffect)
2744 if (!ED.EncounteredAssumes.empty() && !A.isModulePass())
2759 } else if (!ED.AlignedBarriers.empty()) {
2761 SmallVector<CallBase *> Worklist(ED.AlignedBarriers.begin(),
2762 ED.AlignedBarriers.end());
2788 if (!ED.EncounteredAssumes.empty() && (CB || !ED.AlignedBarriers.empty()))
2789 for (auto *AssumeCB : ED.EncounteredAssumes)
2808 /// \p ED.
2810 mergeInPredecessorBarriersAndAssumptions(Attributor &A, ExecutionDomainTy &ED,
2813 /// Merge all information from \p PredED into the successor \p ED. If
2815 /// represented by \p ED from this predecessor.
2816 bool mergeInPredecessor(Attributor &A, ExecutionDomainTy &ED,
2990 Attributor &A, ExecutionDomainTy &ED, const ExecutionDomainTy &PredED) {
2992 ED.addAssumeInst(A, *EA);
2995 ED.addAlignedBarrier(A, *AB);
2999 Attributor &A, ExecutionDomainTy &ED, const ExecutionDomainTy &PredED,
3004 setAndRecord(ED.IsExecutedByInitialThreadOnly,
3006 ED.IsExecutedByInitialThreadOnly));
3008 Changed |= setAndRecord(ED.IsReachedFromAlignedBarrierOnly,
3009 ED.IsReachedFromAlignedBarrierOnly &&
3011 Changed |= setAndRecord(ED.EncounteredNonLocalSideEffect,
3012 ED.EncounteredNonLocalSideEffect |
3015 if (ED.IsReachedFromAlignedBarrierOnly)
3016 mergeInPredecessorBarriersAndAssumptions(A, ED, PredED);
3018 ED.clearAssumeInstAndAlignedBarriers();
3081 // traversal. \p CB is the aligned barrier, \p ED is the execution domain when
3083 auto HandleAlignedBarrier = [&](CallBase &CB, ExecutionDomainTy &ED) {
3085 // First, update the barrier ED kept in the separate CEDMap.
3087 Changed |= mergeInPredecessor(A, CallInED, ED);
3089 // Next adjust the ED we use for the traversal.
3090 ED.EncounteredNonLocalSideEffect = false;
3091 ED.IsReachedFromAlignedBarrierOnly = true;
3093 ED.clearAssumeInstAndAlignedBarriers();
3094 ED.addAlignedBarrier(A, CB);
3096 Changed |= mergeInPredecessor(A, CallOutED, ED);
3115 ExecutionDomainTy ED;
3118 Changed |= handleCallees(A, ED);
3130 mergeInPredecessor(A, ED, BEDMap[PredBB], InitialEdgeOnly);
3134 // Now we traverse the block, accumulate effects in ED and attach
3147 ED.addAssumeInst(A, *AI);
3156 if (!ED.EncounteredNonLocalSideEffect) {
3158 if (ED.IsReachedFromAlignedBarrierOnly)
3196 HandleAlignedBarrier(*CB, ED);
3204 if (!ED.EncounteredNonLocalSideEffect &&
3206 ED.EncounteredNonLocalSideEffect = true;
3208 ED.IsReachedFromAlignedBarrierOnly = false;
3215 // call in ED for potential use by the callee.
3217 Changed |= mergeInPredecessor(A, CallInED, ED);
3228 ED.IsReachedFromAlignedBarrierOnly =
3230 AlignedBarrierLastInBlock = ED.IsReachedFromAlignedBarrierOnly;
3232 ED.EncounteredNonLocalSideEffect |=
3235 ED.EncounteredNonLocalSideEffect =
3243 mergeInPredecessorBarriersAndAssumptions(A, ED, CalleeED);
3245 Changed |= mergeInPredecessor(A, CallOutED, ED);
3250 ED.IsReachedFromAlignedBarrierOnly = false;
3254 AlignedBarrierLastInBlock &= ED.IsReachedFromAlignedBarrierOnly;
3255 ED.EncounteredNonLocalSideEffect |= !CB->doesNotAccessMemory();
3257 Changed |= mergeInPredecessor(A, CallOutED, ED);
3288 if (!ED.EncounteredNonLocalSideEffect &&
3290 ED.EncounteredNonLocalSideEffect = true;
3297 Changed |= mergeInPredecessor(A, InterProceduralED, ED);
3302 Changed |= mergeInPredecessor(A, FnED, ED);
3313 ED.IsReachingAlignedBarrierOnly = StoredED.IsReachingAlignedBarrierOnly &
3320 if (ED.IsExecutedByInitialThreadOnly !=
3322 ED.IsReachedFromAlignedBarrierOnly !=
3324 ED.EncounteredNonLocalSideEffect !=
3329 StoredED = std::move(ED);
3581 const auto *ED = A.getAAFor<AAExecutionDomain>(
3583 if (!ED || !ED->isExecutedByInitialThreadOnly(*CB))