// e1 ; e2 inline bool do_Loop() { if (!allocate(true)) return false; CuMetaFirst left; CuMetaFirst right; if (!meta_StartFirstSets(input, node->arg.pair->left, &left)) { CU_DEBUG(1, "meta_StartFirstSets checking left failed\n"); return false; } if (!meta_StartFirstSets(input, node->arg.pair->right, &right)) { CU_DEBUG(1, "meta_StartFirstSets checking right failed\n"); return false; } result->type = inSequence(left->type, right->type); merge(left); if (pft_transparent == left->type) { merge(right); } if (pft_event == left->type) { merge(right); } return true; }
bool ExprSequence::inSequence(const Stmt *Before, const Stmt *After) const { Before = resolveSyntheticStmt(Before); After = resolveSyntheticStmt(After); // If 'After' is in the subtree of the siblings that follow 'Before' in the // chain of successors, we know that 'After' is sequenced after 'Before'. for (const Stmt *Successor = getSequenceSuccessor(Before); Successor; Successor = getSequenceSuccessor(Successor)) { if (isDescendantOrEqual(After, Successor, Context)) return true; } // If 'After' is a parent of 'Before' or is sequenced after one of these // parents, we know that it is sequenced after 'Before'. for (const Stmt *Parent : getParentStmts(Before, Context)) { if (Parent == After || inSequence(Parent, After)) return true; } return false; }
bool ExprSequence::potentiallyAfter(const Stmt *After, const Stmt *Before) const { return !inSequence(After, Before); }