1 /* 2 * Copyright 2022 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "include/private/SkSLModifiers.h" 9 #include "src/sksl/SkSLAnalysis.h" 10 #include "src/sksl/SkSLContext.h" 11 #include "src/sksl/SkSLModifiersPool.h" 12 #include "src/sksl/analysis/SkSLProgramUsage.h" 13 #include "src/sksl/ir/SkSLVariable.h" 14 #include "src/sksl/transform/SkSLTransform.h" 15 16 namespace SkSL { 17 18 class Expression; 19 AddConstToVarModifiers(const Context & context,const Variable & var,const Expression * initialValue,const ProgramUsage * usage)20const Modifiers* Transform::AddConstToVarModifiers(const Context& context, 21 const Variable& var, 22 const Expression* initialValue, 23 const ProgramUsage* usage) { 24 // If the variable is already marked as `const`, keep our existing modifiers. 25 const Modifiers* modifiers = &var.modifiers(); 26 if (modifiers->fFlags & Modifiers::kConst_Flag) { 27 return modifiers; 28 } 29 // If the variable doesn't have a compile-time-constant initial value, we can't `const` it. 30 if (!initialValue || !Analysis::IsCompileTimeConstant(*initialValue)) { 31 return modifiers; 32 } 33 // This only works for variables that are written-to a single time. 34 ProgramUsage::VariableCounts counts = usage->get(var); 35 if (counts.fWrite != 1) { 36 return modifiers; 37 } 38 // Add `const` to our variable's modifiers, making it eligible for constant-folding. 39 Modifiers constModifiers = *modifiers; 40 constModifiers.fFlags |= Modifiers::kConst_Flag; 41 return context.fModifiersPool->add(constModifiers); 42 } 43 44 } // namespace SkSL 45