40 SkSpan<std::unique_ptr<ProgramElement>> elements,
48 using ProgramWriter::visitProgramElement;
50 bool visitExpressionPtr(std::unique_ptr<Expression>& expr)
override {
55 if (fDeadVariables.contains(assignedVar->variable())) {
57 fUsage->remove(expr.get());
58 expr = std::move(binary.right());
59 fUsage->add(expr.get());
63 fAssignmentWasEliminated =
true;
68 return this->visitExpressionPtr(expr);
75 return INHERITED::visitExpressionPtr(expr);
78 bool visitStatementPtr(std::unique_ptr<Statement>& stmt)
override {
85 if (CanEliminate(var, *counts)) {
86 fDeadVariables.add(var);
87 if (var->initialValue()) {
91 fUsage->remove(stmt.get());
92 stmt = ExpressionStatement::Make(
fContext, std::move(varDecl.
value()));
93 fUsage->add(stmt.get());
96 fUsage->remove(stmt.get());
104 return this->visitStatementPtr(stmt);
108 bool result = INHERITED::visitStatementPtr(stmt);
112 if (fAssignmentWasEliminated) {
113 fAssignmentWasEliminated =
false;
116 if (!Analysis::HasSideEffects(*exprStmt.
expression())) {
118 fUsage->remove(&exprStmt);
128 return counts.fVarExists && !counts.fRead && var->
storage() == VariableStorage::kLocal;
131 bool fMadeChanges =
false;
135 bool fAssignmentWasEliminated =
false;
140 DeadLocalVariableEliminator visitor{context,
usage};
142 for (
auto& [var, counts] :
usage->fVariableCounts) {
143 if (DeadLocalVariableEliminator::CanEliminate(var, counts)) {
146 for (std::unique_ptr<ProgramElement>& pe : elements) {
148 visitor.visitProgramElement(*pe);
155 return visitor.fMadeChanges;
static void usage(char *argv0)