// // Copyright 2017 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. // // RemoveUnreferencedVariables_test.cpp: // Tests for removing unreferenced variables from the AST. // #include "GLSLANG/ShaderLang.h" #include "angle_gl.h" #include "gtest/gtest.h" #include "tests/test_utils/compiler_test.h" usingnamespacesh; class RemoveUnreferencedVariablesTest : public MatchOutputCodeTest { … }; // Test that a simple unreferenced declaration is pruned. TEST_F(RemoveUnreferencedVariablesTest, SimpleDeclaration) { … } // Test that a simple unreferenced global declaration is pruned. TEST_F(RemoveUnreferencedVariablesTest, SimpleGlobalDeclaration) { … } // Test that a simple unreferenced variable with an initializer is pruned. TEST_F(RemoveUnreferencedVariablesTest, SimpleInitializer) { … } // Test that a user-defined function call inside an unreferenced variable initializer is retained. TEST_F(RemoveUnreferencedVariablesTest, SideEffectInInitializer) { … } // Test that a modf call inside an unreferenced variable initializer is retained. TEST_F(RemoveUnreferencedVariablesTest, BuiltInSideEffectInInitializer) { … } // Test that an imageStore call inside an unreferenced variable initializer is retained. TEST_F(RemoveUnreferencedVariablesTest, ImageStoreSideEffectInInitializer) { … } // Test that multiple variables that are chained but otherwise are unreferenced are removed. TEST_F(RemoveUnreferencedVariablesTest, MultipleVariablesChained) { … } // Test that multiple variables that are chained with the last one being referenced are kept. TEST_F(RemoveUnreferencedVariablesTest, MultipleVariablesChainedReferenced) { … } // Test that multiple variables that are chained within two scopes but otherwise are unreferenced // are removed. TEST_F(RemoveUnreferencedVariablesTest, MultipleVariablesChainedTwoScopes) { … } // Test that multiple variables that are chained with the last one being referenced in an inner // scope are kept. TEST_F(RemoveUnreferencedVariablesTest, VariableReferencedInAnotherScope) { … } // Test that if there are two variables with the same name, one of them can be removed and another // one kept. TEST_F(RemoveUnreferencedVariablesTest, TwoVariablesWithSameNameInDifferentScopes) { … } // Test that an unreferenced variable declared in a for loop header is removed. TEST_F(RemoveUnreferencedVariablesTest, UnreferencedVariableDeclaredInForLoopHeader) { … } // Test that a loop condition is kept even if it declares an unreferenced variable. TEST_F(RemoveUnreferencedVariablesTest, UnreferencedVariableDeclaredInWhileLoopCondition) { … } // Test that a variable declared in a for loop header that is only referenced in an unreferenced // variable initializer is removed. TEST_F(RemoveUnreferencedVariablesTest, VariableDeclaredInForLoopHeaderAccessedInUnreferencedVariableInitializer) { … } // Test that a user-defined type (struct) declaration that's used is not removed, but that the // variable that's declared in the same declaration is removed. TEST_F(RemoveUnreferencedVariablesTest, UserDefinedTypeReferencedAndVariableNotReferenced) { … } // Test that a nameless user-defined type (struct) declaration is removed entirely. TEST_F(RemoveUnreferencedVariablesTest, NamelessUserDefinedTypeUnreferenced) { … } // Test that a variable that's only referenced in a unused function is removed. TEST_F(RemoveUnreferencedVariablesTest, VariableOnlyReferencedInUnusedFunction) { … } // Test that a variable that's only referenced in an array length() method call is removed. TEST_F(RemoveUnreferencedVariablesTest, VariableOnlyReferencedInLengthMethod) { … } // Test that an unreferenced user-defined type is removed. TEST_F(RemoveUnreferencedVariablesTest, UserDefinedTypeUnreferenced) { … } // Test that a user-defined type that's only referenced in an unreferenced variable is removed. TEST_F(RemoveUnreferencedVariablesTest, UserDefinedTypeReferencedInUnreferencedVariable) { … } // Test that a user-defined type that's declared in an empty declaration and that is only referenced // in an unreferenced variable is removed also when the shader contains another independent // user-defined type that's declared in an empty declaration. This tests special case handling of // reference counting of empty symbols. TEST_F(RemoveUnreferencedVariablesTest, TwoUserDefinedTypesDeclaredInEmptyDeclarationsWithOneOfThemUnreferenced) { … } // Test that a user-defined type that is only referenced in another unreferenced type is removed. TEST_F(RemoveUnreferencedVariablesTest, UserDefinedTypeChain) { … } // Test that a user-defined type that is referenced in another user-defined type that is used is // kept. TEST_F(RemoveUnreferencedVariablesTest, UserDefinedTypeChainReferenced) { … } // Test that a struct type that is only referenced in a constructor and function call is kept. TEST_F(RemoveUnreferencedVariablesTest, UserDefinedTypeReferencedInConstructorAndCall) { … } // Test that a struct type that is only referenced in a constructor is kept. This assumes that there // isn't more sophisticated folding of struct field access going on. TEST_F(RemoveUnreferencedVariablesTest, UserDefinedTypeReferencedInConstructor) { … } // Test that a struct type that is only referenced in an unused function is removed. TEST_F(RemoveUnreferencedVariablesTest, UserDefinedTypeReferencedInUnusedFunction) { … } // Test that a struct type that is only referenced as a function return value is kept. TEST_F(RemoveUnreferencedVariablesTest, UserDefinedTypeReturnedFromFunction) { … } // Test that a struct type that is only referenced in a uniform block is kept. TEST_F(RemoveUnreferencedVariablesTest, UserDefinedTypeInUniformBlock) { … } // Test that a struct type that is referenced from an initializer with a constructor can be removed. TEST_F(RemoveUnreferencedVariablesTest, UserDefinedTypeConstructorInitializer) { … }