Migrate compiler elimination passes to Transform.

Change-Id: Ibb8695917d0a8ff43467542ee7a7b36f573513f8
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/456798
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/src/sksl/transform/SkSLEliminateDeadFunctions.cpp b/src/sksl/transform/SkSLEliminateDeadFunctions.cpp
new file mode 100644
index 0000000..2777a97
--- /dev/null
+++ b/src/sksl/transform/SkSLEliminateDeadFunctions.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2021 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "include/private/SkSLProgramElement.h"
+#include "src/sksl/SkSLProgramSettings.h"
+#include "src/sksl/ir/SkSLFunctionDefinition.h"
+#include "src/sksl/ir/SkSLProgram.h"
+#include "src/sksl/transform/SkSLTransform.h"
+
+#include <algorithm>
+
+namespace SkSL {
+
+bool Transform::EliminateDeadFunctions(Program& program, ProgramUsage* usage) {
+    bool madeChanges = false;
+
+    if (program.fConfig->fSettings.fRemoveDeadFunctions) {
+        auto isDeadFunction = [&](const ProgramElement* element) {
+            if (!element->is<FunctionDefinition>()) {
+                return false;
+            }
+            const FunctionDefinition& fn = element->as<FunctionDefinition>();
+            if (fn.declaration().isMain() || usage->get(fn.declaration()) > 0) {
+                return false;
+            }
+            usage->remove(*element);
+            madeChanges = true;
+            return true;
+        };
+
+        program.fOwnedElements.erase(std::remove_if(program.fOwnedElements.begin(),
+                                                    program.fOwnedElements.end(),
+                                                    [&](const std::unique_ptr<ProgramElement>& pe) {
+                                                        return isDeadFunction(pe.get());
+                                                    }),
+                                     program.fOwnedElements.end());
+        program.fSharedElements.erase(std::remove_if(program.fSharedElements.begin(),
+                                                     program.fSharedElements.end(),
+                                                     isDeadFunction),
+                                      program.fSharedElements.end());
+    }
+    return madeChanges;
+}
+
+}  // namespace SkSL