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