Home | History | Annotate | Download | only in sksl

Lines Matching refs:cfg

30 BlockId CFG::newBlock() {
40 BlockId CFG::newIsolatedBlock() {
46 void CFG::addExit(BlockId from, BlockId to) {
53 void CFG::dump() {
174 // ternaries cross basic block boundaries, must regenerate the CFG to remove it
294 void CFGGenerator::addExpression(CFG& cfg, std::unique_ptr<Expression>* e, bool constantPropagate) {
305 this->addExpression(cfg, &b->fLeft, constantPropagate);
306 BlockId start = cfg.fCurrent;
307 cfg.newBlock();
308 this->addExpression(cfg, &b->fRight, constantPropagate);
309 cfg.newBlock();
310 cfg.addExit(start, cfg.fCurrent);
311 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({
320 this->addExpression(cfg, &b->fRight, constantPropagate);
321 this->addLValue(cfg, &b->fLeft);
322 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({
331 this->addExpression(cfg, &b->fLeft, !Compiler::IsAssignment(b->fOperator));
332 this->addExpression(cfg, &b->fRight, constantPropagate);
333 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({
345 this->addExpression(cfg, &arg, constantPropagate);
347 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kExpression_Kind,
354 this->addExpression(cfg, &arg, constantPropagate);
356 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kExpression_Kind,
361 this->addExpression(cfg, &((FieldAccess*) e->get())->fBase, constantPropagate);
362 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kExpression_Kind,
366 this->addExpression(cfg, &((IndexExpression*) e->get())->fBase, constantPropagate);
367 this->addExpression(cfg, &((IndexExpression*) e->get())->fIndex, constantPropagate);
368 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kExpression_Kind,
373 this->addExpression(cfg, &p->fOperand, constantPropagate &&
376 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kExpression_Kind,
381 this->addExpression(cfg, &((PostfixExpression*) e->get())->fOperand, false);
382 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kExpression_Kind,
386 this->addExpression(cfg, &((Swizzle*) e->get())->fBase, constantPropagate);
387 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kExpression_Kind,
395 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kExpression_Kind,
400 this->addExpression(cfg, &t->fTest, constantPropagate);
401 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kExpression_Kind,
403 BlockId start = cfg.fCurrent;
404 cfg.newBlock();
405 this->addExpression(cfg, &t->fIfTrue, constantPropagate);
406 BlockId next = cfg.newBlock();
407 cfg.fCurrent = start;
408 cfg.newBlock();
409 this->addExpression(cfg, &t->fIfFalse, constantPropagate);
410 cfg.addExit(cfg.fCurrent, next);
411 cfg.fCurrent = next;
423 void CFGGenerator::addLValue(CFG& cfg, std::unique_ptr<Expression>* e) {
426 this->addLValue(cfg, &((FieldAccess&) **e).fBase);
429 this->addLValue(cfg, &((IndexExpression&) **e).fBase);
430 this->addExpression(cfg, &((IndexExpression&) **e).fIndex, true);
433 this->addLValue(cfg, &((Swizzle&) **e).fBase);
438 this->addExpression(cfg, &((TernaryExpression&) **e).fTest, true);
442 this->addLValue(cfg, &((TernaryExpression&) **e).fIfTrue);
443 this->addLValue(cfg, &((TernaryExpression&) **e).fIfFalse);
452 void CFGGenerator::addStatement(CFG& cfg, std::unique_ptr<Statement>* s) {
456 addStatement(cfg, &child);
461 this->addExpression(cfg, &ifs.fTest, true);
462 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kStatement_Kind, false,
464 BlockId start = cfg.fCurrent;
465 cfg.newBlock();
466 this->addStatement(cfg, &ifs.fIfTrue);
467 BlockId next = cfg.newBlock();
469 cfg.fCurrent = start;
470 cfg.newBlock();
471 this->addStatement(cfg, &ifs.fIfFalse);
472 cfg.addExit(cfg.fCurrent, next);
473 cfg.fCurrent = next;
475 cfg.addExit(start, next);
480 this->addExpression(cfg, &((ExpressionStatement&) **s).fExpression, true);
481 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kStatement_Kind, false,
493 this->addExpression(cfg, &vd.fValue, true);
495 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kStatement_Kind,
498 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kStatement_Kind, false,
503 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kStatement_Kind, false,
505 cfg.fCurrent = cfg.newIsolatedBlock();
510 this->addExpression(cfg, &r.fExpression, true);
512 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kStatement_Kind, false,
514 cfg.fCurrent = cfg.newIsolatedBlock();
518 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kStatement_Kind, false,
520 cfg.addExit(cfg.fCurrent, fLoopExits.top());
521 cfg.fCurrent = cfg.newIsolatedBlock();
524 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kStatement_Kind, false,
526 cfg.addExit(cfg.fCurrent, fLoopContinues.top());
527 cfg.fCurrent = cfg.newIsolatedBlock();
531 BlockId loopStart = cfg.newBlock();
533 BlockId loopExit = cfg.newIsolatedBlock();
535 this->addExpression(cfg, &w.fTest, true);
536 BlockId test = cfg.fCurrent;
537 cfg.addExit(test, loopExit);
538 cfg.newBlock();
539 this->addStatement(cfg, &w.fStatement);
540 cfg.addExit(cfg.fCurrent, loopStart);
543 cfg.fCurrent = loopExit;
548 BlockId loopStart = cfg.newBlock();
550 BlockId loopExit = cfg.newIsolatedBlock();
552 this->addStatement(cfg, &d.fStatement);
553 this->addExpression(cfg, &d.fTest, true);
554 cfg.addExit(cfg.fCurrent, loopExit);
555 cfg.addExit(cfg.fCurrent, loopStart);
558 cfg.fCurrent = loopExit;
564 this->addStatement(cfg, &f.fInitializer);
566 BlockId loopStart = cfg.newBlock();
567 BlockId next = cfg.newIsolatedBlock();
569 BlockId loopExit = cfg.newIsolatedBlock();
572 this->addExpression(cfg, &f.fTest, true);
581 cfg.newBlock();
582 this->addStatement(cfg, &f.fStatement);
583 cfg.addExit(cfg.fCurrent, next);
584 cfg.fCurrent = next;
586 this->addExpression(cfg, &f.fNext, true);
588 cfg.addExit(cfg.fCurrent, loopStart);
589 cfg.addExit(cfg.fCurrent, loopExit);
592 cfg.fCurrent = loopExit;
597 this->addExpression(cfg, &ss.fValue, true);
598 cfg.fBlocks[cfg.fCurrent].fNodes.push_back({ BasicBlock::Node::kStatement_Kind, false,
600 BlockId start = cfg.fCurrent;
601 BlockId switchExit = cfg.newIsolatedBlock();
604 cfg.newBlock();
605 cfg.addExit(start, cfg.fCurrent);
609 this->addExpression(cfg, &c->fValue, true);
612 this->addStatement(cfg, &caseStatement);
615 cfg.addExit(cfg.fCurrent, switchExit);
619 cfg.addExit(start, switchExit);
622 cfg.fCurrent = switchExit;
633 CFG CFGGenerator::getCFG(FunctionDefinition& f) {
634 CFG result;