Skip to content

Commit a893dfa

Browse files
committed
Fix: Unused variables now removed after joining consecutive assignments.
Previously joining assignments could sometimes result in a declared variable which is no longer needed.
1 parent 97af65c commit a893dfa

File tree

4 files changed

+19
-7
lines changed

4 files changed

+19
-7
lines changed

ShaderShrinker/Shrinker.Parser/Optimizations/CombineAssignmentWithReturnExtension.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ public static class CombineAssignmentWithReturnExtension
2020
/// <summary>
2121
/// Merge variable assignment with single use in an return statement on the next line.
2222
/// </summary>
23-
public static void CombineAssignmentWithReturn(this SyntaxNode rootNode)
23+
public static bool CombineAssignmentWithReturn(this SyntaxNode rootNode)
2424
{
25+
var anyChanges = false;
2526
foreach (var functionNode in rootNode.FunctionDefinitions())
2627
{
2728
foreach (var braces in functionNode.TheTree.OfType<BraceSyntaxNode>().ToList())
@@ -117,6 +118,7 @@ public static void CombineAssignmentWithReturn(this SyntaxNode rootNode)
117118
assignmentDecl.Remove(); // Declaration is now empty - Remove it.
118119

119120
didChange = true;
121+
anyChanges = true;
120122

121123
if (addBrackets)
122124
{
@@ -137,6 +139,8 @@ public static void CombineAssignmentWithReturn(this SyntaxNode rootNode)
137139
}
138140
}
139141
}
142+
143+
return anyChanges;
140144
}
141145
}
142146
}

ShaderShrinker/Shrinker.Parser/Optimizations/CombineAssignmentWithSingleUseExtension.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ public static class CombineAssignmentWithSingleUseExtension
2020
/// <summary>
2121
/// Merge variable assignment with single use in an assignment on the next line.
2222
/// </summary>
23-
public static void CombineAssignmentWithSingleUse(this SyntaxNode rootNode)
23+
public static bool CombineAssignmentWithSingleUse(this SyntaxNode rootNode)
2424
{
25+
var anyChanges = false;
2526
var functionNodes = rootNode.FunctionDefinitions().ToList();
2627
foreach (var functionNode in functionNodes)
2728
{
@@ -116,12 +117,15 @@ public static void CombineAssignmentWithSingleUse(this SyntaxNode rootNode)
116117
declParent.Remove();
117118

118119
didChange = true;
120+
anyChanges = true;
119121
}
120122

121123
if (!didChange)
122124
break;
123125
}
124126
}
127+
128+
return anyChanges;
125129
}
126130
}
127131
}

ShaderShrinker/Shrinker.Parser/Shrinker.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,10 @@ public static SyntaxNode Simplify(this SyntaxNode rootNode, CustomOptions option
8282

8383
if (options.CombineAssignmentWithSingleUse)
8484
{
85-
rootNode.CombineAssignmentWithReturn();
86-
rootNode.CombineAssignmentWithSingleUse();
85+
var anyChanges = rootNode.CombineAssignmentWithReturn();
86+
anyChanges |= rootNode.CombineAssignmentWithSingleUse();
87+
if (anyChanges && options.RemoveUnusedVariables)
88+
rootNode.RemoveUnusedVariables();
8789
}
8890

8991
if (options.SimplifyBranching)

ShaderShrinker/UnitTests/ShrinkerTests.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,20 +1029,22 @@ public void CheckCombiningAssignmentWithUseWhenUsedOnlyOnce(
10291029
"int f(int i) { return i; } void main() { int a; for (int i = 0; i < 2; i++) { a = 2 + i; f(a); } return a; }",
10301030
"int main(out int i) { i = 2; return i; }",
10311031
"int main(inout int i) { i = 2; return i; }",
1032-
"int main(int i) { i = 2; return i; }")] string code,
1032+
"int main(int i) { i = 2; return i; }",
1033+
"int main() { int a, b; a = 1; b = a + 1; return b; }")] string code,
10331034
[Values("int main() { return 2 + 1; }",
10341035
"vec3 cam(vec3 ro, vec3 la, vec2 uv) { vec3 f = normalize(la - ro), r = normalize(cross(vec3(0, 1, 0), f)); return normalize(f + r * uv.x + cross(f, r) * uv.y); }",
10351036
"int f(int i) { return i; } void main() { int a; for (int i = 0; i < 2; i++) { a = 2 + i; f(a); } return a; }",
10361037
"int main(out int i) { i = 2; return i; }",
10371038
"int main(inout int i) { i = 2; return i; }",
1038-
"int main(int i) { i = 2; return i; }")] string expected)
1039+
"int main(int i) { i = 2; return i; }",
1040+
"int main() { return 1 + 1; }")] string expected)
10391041
{
10401042
var lexer = new Lexer();
10411043
lexer.Load(code);
10421044

10431045
var options = CustomOptions.None();
10441046
options.CombineAssignmentWithSingleUse = true;
1045-
options.GroupVariableDeclarations = true;
1047+
options.RemoveUnusedVariables = true;
10461048
var rootNode = new Parser(lexer)
10471049
.Parse()
10481050
.Simplify(options);

0 commit comments

Comments
 (0)