// // Copyright (c) 2011 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // #include "compiler/intermediate.h" struct TLoopIndexInfo { int id; int initValue; int stopValue; int incrementValue; TOperator op; int currentValue; }; class ForLoopUnroll { public: ForLoopUnroll() { } void FillLoopIndexInfo(TIntermLoop* node, TLoopIndexInfo& info); // Update the info.currentValue for the next loop iteration. void Step(); // Return false if loop condition is no longer satisfied. bool SatisfiesLoopCondition(); // Check if the symbol is the index of a loop that's unrolled. bool NeedsToReplaceSymbolWithValue(TIntermSymbol* symbol); // Return the current value of a given loop index symbol. int GetLoopIndexValue(TIntermSymbol* symbol); void Push(TLoopIndexInfo& info); void Pop(); static void MarkForLoopsWithIntegerIndicesForUnrolling(TIntermNode* root); private: int getLoopIncrement(TIntermLoop* node); int evaluateIntConstant(TIntermConstantUnion* node); TVector mLoopIndexStack; };