OutlinedStatementReductionOpportunities extends StandardVisitor { static List<OutlinedStatementReductionOpportunity> findOpportunities( ShaderJob shaderJob, ReducerContext context) { return shaderJob.getShaders() .stream() .map(OutlinedStatementReductionOpportunities::findOpportunitiesForShader) .reduce(Collections.emptyList(), ListConcat::concatenate); } private  OutlinedStatementReductionOpportunities(TranslationUnit tu); @Override void visitExprStmt(ExprStmt exprStmt);  }
@Test public void testOutline() throws Exception { String program = "int _GLF_outlined_1(int x) { return x; }" + "void main() { int y; y = _GLF_outlined_1(0); }"; String programAfter = "int _GLF_outlined_1(int x) { return x; }" + "void main() { int y; y = 0; }"; TranslationUnit tu = ParseHelper.parse(program); List<OutlinedStatementReductionOpportunity> ops = OutlinedStatementReductionOpportunities .findOpportunities(MakeShaderJobFromFragmentShader.make(tu), new ReducerContext(false, ShadingLanguageVersion.ESSL_100, new RandomWrapper(0), new IdGenerator())); assertEquals(1, ops.size()); ops.get(0).applyReduction(); assertEquals(PrettyPrinterVisitor.prettyPrintAsString(ParseHelper.parse(programAfter)), PrettyPrinterVisitor.prettyPrintAsString(tu)); }
@Test public void testOutline2() throws Exception { String program = "int _GLF_outlined_1(int x, int y, int z) { return x + (x + y) + z; }" + "void main() { int a, b, c; y = _GLF_outlined_1(0, a, b + c); }"; String programAfter = "int _GLF_outlined_1(int x, int y, int z) { return x + (x + y) + z; }" + "void main() { int a, b, c; y = 0 + (0 + a) + b + c; }"; TranslationUnit tu = ParseHelper.parse(program); List<OutlinedStatementReductionOpportunity> ops = OutlinedStatementReductionOpportunities .findOpportunities(MakeShaderJobFromFragmentShader.make(tu), new ReducerContext(false, ShadingLanguageVersion.ESSL_100, new RandomWrapper(0), new IdGenerator())); assertEquals(1, ops.size()); ops.get(0).applyReduction(); assertEquals(PrettyPrinterVisitor.prettyPrintAsString(ParseHelper.parse(programAfter)), PrettyPrinterVisitor.prettyPrintAsString(tu)); }
@Test public void testOutline3() throws Exception { String program = "uniform vec2 injectionSwitch;" + "int _GLF_outlined_1(int x, int y, int z) { return injectionSwitch.y * x + (x + y) + z; }" + "void main() { int a, b, c; y = _GLF_outlined_1(0, a, b + c); }"; String programAfter = "uniform vec2 injectionSwitch;" + "int _GLF_outlined_1(int x, int y, int z) { return injectionSwitch.y * x + (x + y) + z; }" + "void main() { int a, b, c; y = injectionSwitch.y * 0 + (0 + a) + b + c; }"; TranslationUnit tu = ParseHelper.parse(program); List<OutlinedStatementReductionOpportunity> ops = OutlinedStatementReductionOpportunities .findOpportunities(MakeShaderJobFromFragmentShader.make(tu), new ReducerContext(false, ShadingLanguageVersion.ESSL_100, new RandomWrapper(0), new IdGenerator())); assertEquals(1, ops.size()); ops.get(0).applyReduction(); assertEquals(PrettyPrinterVisitor.prettyPrintAsString(ParseHelper.parse(programAfter)), PrettyPrinterVisitor.prettyPrintAsString(tu)); }
@Test public void testOutline4() throws Exception { String program = "int _GLF_outlined_1(int x, int y, int z) { if(_GLF_DEAD(false)) { } " + "return injectionSwitch.y * x + (x + y) + z; }" + "void main() { int a, b, c; y = _GLF_outlined_1(0, a, b + c); }"; TranslationUnit tu = ParseHelper.parse(program); List<OutlinedStatementReductionOpportunity> ops = OutlinedStatementReductionOpportunities .findOpportunities(MakeShaderJobFromFragmentShader.make(tu), new ReducerContext(false, ShadingLanguageVersion.ESSL_100, new RandomWrapper(0), new IdGenerator())); assertEquals(0, ops.size()); }