blob: 7011ac77f752ca4f0b3efc1ba05fddb4aa892b87 [file] [log] [blame]
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -04001/*
2 * Copyright 2018 Google Inc.
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "src/sksl/ir/SkSLVariableReference.h"
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -04009
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "src/sksl/SkSLIRGenerator.h"
11#include "src/sksl/ir/SkSLConstructor.h"
12#include "src/sksl/ir/SkSLFloatLiteral.h"
13#include "src/sksl/ir/SkSLSetting.h"
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040014
15namespace SkSL {
16
Brian Osman79457ef2020-09-24 15:01:27 -040017VariableReference::VariableReference(int offset, const Variable* variable, RefKind refKind)
18 : INHERITED(offset, kExpressionKind, &variable->type())
19 , fVariable(variable)
20 , fRefKind(refKind) {
21 SkASSERT(fVariable);
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040022 if (refKind != kRead_RefKind) {
Brian Osman79457ef2020-09-24 15:01:27 -040023 fVariable->fWriteCount++;
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040024 }
25 if (refKind != kWrite_RefKind) {
Brian Osman79457ef2020-09-24 15:01:27 -040026 fVariable->fReadCount++;
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040027 }
28}
29
30VariableReference::~VariableReference() {
31 if (fRefKind != kRead_RefKind) {
Brian Osman79457ef2020-09-24 15:01:27 -040032 fVariable->fWriteCount--;
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040033 }
34 if (fRefKind != kWrite_RefKind) {
Brian Osman79457ef2020-09-24 15:01:27 -040035 fVariable->fReadCount--;
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040036 }
37}
38
39void VariableReference::setRefKind(RefKind refKind) {
40 if (fRefKind != kRead_RefKind) {
Brian Osman79457ef2020-09-24 15:01:27 -040041 fVariable->fWriteCount--;
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040042 }
43 if (fRefKind != kWrite_RefKind) {
Brian Osman79457ef2020-09-24 15:01:27 -040044 fVariable->fReadCount--;
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040045 }
46 if (refKind != kRead_RefKind) {
Brian Osman79457ef2020-09-24 15:01:27 -040047 fVariable->fWriteCount++;
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040048 }
49 if (refKind != kWrite_RefKind) {
Brian Osman79457ef2020-09-24 15:01:27 -040050 fVariable->fReadCount++;
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040051 }
52 fRefKind = refKind;
53}
54
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040055std::unique_ptr<Expression> VariableReference::constantPropagate(const IRGenerator& irGenerator,
56 const DefinitionMap& definitions) {
57 if (fRefKind != kRead_RefKind) {
58 return nullptr;
59 }
Brian Osman79457ef2020-09-24 15:01:27 -040060 if ((fVariable->fModifiers.fFlags & Modifiers::kConst_Flag) && fVariable->fInitialValue &&
61 fVariable->fInitialValue->isCompileTimeConstant() &&
Ethan Nicholas30d30222020-09-11 12:27:26 -040062 this->type().typeKind() != Type::TypeKind::kArray) {
Brian Osman79457ef2020-09-24 15:01:27 -040063 return fVariable->fInitialValue->clone();
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040064 }
Brian Osman79457ef2020-09-24 15:01:27 -040065 auto exprIter = definitions.find(fVariable);
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040066 if (exprIter != definitions.end() && exprIter->second &&
Brian Osmanb6b95732020-06-30 11:44:27 -040067 (*exprIter->second)->isCompileTimeConstant()) {
John Stiles8614e492020-09-21 09:28:48 -040068 return (*exprIter->second)->clone();
Ethan Nicholas8f7e28f2018-03-26 14:24:27 -040069 }
70 return nullptr;
71}
72
John Stilesa6841be2020-08-06 14:11:56 -040073} // namespace SkSL