comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java @ 16909:62cfffca9be2

Truffle-DSL: some more performance optimizations.
author Christian Humer <christian.humer@gmail.com>
date Sat, 23 Aug 2014 19:31:18 +0200
parents 2db61eddcb97
children 6ee7afea175a
comparison
equal deleted inserted replaced
16908:d3f282a9e287 16909:62cfffca9be2
320 } 320 }
321 321
322 /** 322 /**
323 * <pre> 323 * <pre>
324 * variant1 $condition != null 324 * variant1 $condition != null
325 * 325 *
326 * $type $name = defaultValue($type); 326 * $type $name = defaultValue($type);
327 * if ($condition) { 327 * if ($condition) {
328 * $name = $value; 328 * $name = $value;
329 * } 329 * }
330 * 330 *
331 * variant2 $condition != null 331 * variant2 $condition != null
332 * $type $name = $value; 332 * $type $name = $value;
333 * </pre> 333 * </pre>
334 * 334 *
335 * . 335 * .
1743 emitEncounteredSynthetic(builder, current); 1743 emitEncounteredSynthetic(builder, current);
1744 } else { 1744 } else {
1745 builder.startReturn().tree(createTemplateMethodCall(builder, null, source, current, null)).end(); 1745 builder.startReturn().tree(createTemplateMethodCall(builder, null, source, current, null)).end();
1746 } 1746 }
1747 1747
1748 return encloseThrowsWithFallThrough(current, builder.getRoot()); 1748 return encloseThrowsWithFallThrough(parent, current, builder.getRoot());
1749 } 1749 }
1750 1750
1751 private CodeTree encloseThrowsWithFallThrough(SpecializationData current, CodeTree tree) { 1751 private CodeTree encloseThrowsWithFallThrough(CodeTreeBuilder parent, SpecializationData current, CodeTree tree) {
1752 if (current.getExceptions().isEmpty()) { 1752 if (current.getExceptions().isEmpty()) {
1753 return tree; 1753 return tree;
1754 } 1754 }
1755 CodeTreeBuilder builder = new CodeTreeBuilder(null); 1755 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
1756 1756
1757 builder.startTryBlock(); 1757 builder.startTryBlock();
1758 builder.tree(tree); 1758 builder.tree(tree);
1759 for (SpecializationThrowsData exception : current.getExceptions()) { 1759 for (SpecializationThrowsData exception : current.getExceptions()) {
1760 builder.end().startCatchBlock(exception.getJavaClass(), "rewriteEx"); 1760 builder.end().startCatchBlock(exception.getJavaClass(), "rewriteEx");
1878 return targetExecutable; 1878 return targetExecutable;
1879 } 1879 }
1880 1880
1881 private CodeTree createExecuteChild(CodeTreeBuilder parent, NodeExecutionData execution, ExecutableTypeData sourceExecutable, Parameter targetParameter, Parameter unexpectedParameter) { 1881 private CodeTree createExecuteChild(CodeTreeBuilder parent, NodeExecutionData execution, ExecutableTypeData sourceExecutable, Parameter targetParameter, Parameter unexpectedParameter) {
1882 SpecializationData specialization = getModel(); 1882 SpecializationData specialization = getModel();
1883 TreeSet<TypeData> possiblePolymorphicTypes = lookupPolymorphicTargetTypes(targetParameter); 1883 if (specialization.isPolymorphic() && targetParameter.getTypeSystemType().isGeneric() && unexpectedParameter == null) {
1884 if (specialization.isPolymorphic() && targetParameter.getTypeSystemType().isGeneric() && unexpectedParameter == null && possiblePolymorphicTypes.size() > 1) { 1884 List<TypeData> possiblePolymorphicTypes = lookupPolymorphicTargetTypes(targetParameter);
1885 1885 if (possiblePolymorphicTypes.size() > 1) {
1886 CodeTreeBuilder builder = parent.create(); 1886 CodeTreeBuilder builder = parent.create();
1887 1887
1888 boolean elseIf = false; 1888 boolean elseIf = false;
1889 for (TypeData possiblePolymoprhicType : possiblePolymorphicTypes) { 1889 for (TypeData possiblePolymoprhicType : possiblePolymorphicTypes) {
1890 if (possiblePolymoprhicType.isGeneric()) { 1890 if (possiblePolymoprhicType.isGeneric()) {
1891 continue; 1891 continue;
1892 } 1892 }
1893 elseIf = builder.startIf(elseIf); 1893 elseIf = builder.startIf(elseIf);
1894 1894
1895 Parameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName()); 1895 Parameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName());
1896 TypeData sourceType = sourceParameter != null ? sourceParameter.getTypeSystemType() : null; 1896 TypeData sourceType = sourceParameter != null ? sourceParameter.getTypeSystemType() : null;
1897 builder.string(polymorphicTypeName(targetParameter.getSpecification().getExecution())).string(" == ").typeLiteral(possiblePolymoprhicType.getPrimitiveType()); 1897 builder.string(polymorphicTypeName(targetParameter.getSpecification().getExecution())).string(" == ").typeLiteral(possiblePolymoprhicType.getPrimitiveType());
1898 builder.end().startBlock(); 1898 builder.end().startBlock();
1899 builder.startStatement(); 1899 builder.startStatement();
1900 builder.tree(createExecuteChildExpression(parent, execution, sourceType, new Parameter(targetParameter, possiblePolymoprhicType), unexpectedParameter, null)); 1900 builder.tree(createExecuteChildExpression(parent, execution, sourceType, new Parameter(targetParameter, possiblePolymoprhicType), unexpectedParameter, null));
1901 builder.end();
1902 builder.end();
1903 }
1904
1905 builder.startElseBlock();
1906 builder.startStatement().tree(createExecuteChildImplicit(parent, execution, sourceExecutable, targetParameter, unexpectedParameter)).end();
1901 builder.end(); 1907 builder.end();
1902 builder.end(); 1908
1903 } 1909 return builder.getRoot();
1904 1910 }
1905 builder.startElseBlock(); 1911 }
1906 builder.startStatement().tree(createExecuteChildImplicit(parent, execution, sourceExecutable, targetParameter, unexpectedParameter)).end(); 1912 return createExecuteChildImplicit(parent, execution, sourceExecutable, targetParameter, unexpectedParameter);
1907 builder.end();
1908
1909 return builder.getRoot();
1910 } else {
1911 return createExecuteChildImplicit(parent, execution, sourceExecutable, targetParameter, unexpectedParameter);
1912 }
1913 } 1913 }
1914 1914
1915 protected final List<Parameter> getImplicitTypeParameters(SpecializationData model) { 1915 protected final List<Parameter> getImplicitTypeParameters(SpecializationData model) {
1916 List<Parameter> parameter = new ArrayList<>(); 1916 List<Parameter> parameter = new ArrayList<>();
1917 for (Parameter param : model.getSignatureParameters()) { 1917 for (Parameter param : model.getSignatureParameters()) {
1922 } 1922 }
1923 } 1923 }
1924 return parameter; 1924 return parameter;
1925 } 1925 }
1926 1926
1927 protected final TreeSet<TypeData> lookupPolymorphicTargetTypes(Parameter param) { 1927 protected final List<TypeData> lookupPolymorphicTargetTypes(Parameter param) {
1928 SpecializationData specialization = getModel(); 1928 SpecializationData specialization = getModel();
1929 TreeSet<TypeData> possiblePolymorphicTypes = new TreeSet<>(); 1929 Set<TypeData> possiblePolymorphicTypes = new HashSet<>();
1930 for (SpecializationData otherSpecialization : specialization.getNode().getSpecializations()) { 1930 for (SpecializationData otherSpecialization : specialization.getNode().getSpecializations()) {
1931 if (!otherSpecialization.isSpecialized()) { 1931 if (!otherSpecialization.isSpecialized()) {
1932 continue; 1932 continue;
1933 } 1933 }
1934 Parameter otherParameter = otherSpecialization.findParameter(param.getLocalName()); 1934 Parameter otherParameter = otherSpecialization.findParameter(param.getLocalName());
1935 if (otherParameter != null) { 1935 if (otherParameter != null) {
1936 possiblePolymorphicTypes.add(otherParameter.getTypeSystemType()); 1936 possiblePolymorphicTypes.add(otherParameter.getTypeSystemType());
1937 } 1937 }
1938 } 1938 }
1939 return possiblePolymorphicTypes; 1939 List<TypeData> types = new ArrayList<>(possiblePolymorphicTypes);
1940 Collections.sort(types);
1941 return types;
1940 } 1942 }
1941 1943
1942 private CodeTree createExecuteChildImplicit(CodeTreeBuilder parent, NodeExecutionData execution, ExecutableTypeData sourceExecutable, Parameter param, Parameter unexpectedParameter) { 1944 private CodeTree createExecuteChildImplicit(CodeTreeBuilder parent, NodeExecutionData execution, ExecutableTypeData sourceExecutable, Parameter param, Parameter unexpectedParameter) {
1943 CodeTreeBuilder builder = parent.create(); 1945 CodeTreeBuilder builder = parent.create();
1944 Parameter sourceParameter = sourceExecutable.findParameter(param.getLocalName()); 1946 Parameter sourceParameter = sourceExecutable.findParameter(param.getLocalName());
2113 private boolean containsNewLine(CodeTree tree) { 2115 private boolean containsNewLine(CodeTree tree) {
2114 if (tree.getCodeKind() == CodeTreeKind.NEW_LINE) { 2116 if (tree.getCodeKind() == CodeTreeKind.NEW_LINE) {
2115 return true; 2117 return true;
2116 } 2118 }
2117 2119
2118 for (CodeTree codeTree : tree.getEnclosedElements()) { 2120 List<CodeTree> enclosing = tree.getEnclosedElements();
2119 if (containsNewLine(codeTree)) { 2121 if (enclosing != null) {
2120 return true; 2122 for (CodeTree codeTree : enclosing) {
2123 if (containsNewLine(codeTree)) {
2124 return true;
2125 }
2121 } 2126 }
2122 } 2127 }
2123 return false; 2128 return false;
2124 } 2129 }
2125 2130
2126 private boolean hasUnexpected(Parameter sourceParameter, Parameter targetParameter, Parameter unexpectedParameter) { 2131 private boolean hasUnexpected(Parameter sourceParameter, Parameter targetParameter, Parameter unexpectedParameter) {
2127 NodeExecutionData execution = targetParameter.getSpecification().getExecution(); 2132 NodeExecutionData execution = targetParameter.getSpecification().getExecution();
2128 2133
2129 if (getModel().isPolymorphic() && targetParameter.getTypeSystemType().isGeneric() && unexpectedParameter == null) { 2134 if (getModel().isPolymorphic() && targetParameter.getTypeSystemType().isGeneric() && unexpectedParameter == null) {
2130 // check for other polymorphic types 2135 // check for other polymorphic types
2131 TreeSet<TypeData> polymorphicTargetTypes = lookupPolymorphicTargetTypes(targetParameter); 2136 List<TypeData> polymorphicTargetTypes = lookupPolymorphicTargetTypes(targetParameter);
2132 if (polymorphicTargetTypes.size() > 1) { 2137 if (polymorphicTargetTypes.size() > 1) {
2133 for (TypeData polymorphicTargetType : polymorphicTargetTypes) { 2138 for (TypeData polymorphicTargetType : polymorphicTargetTypes) {
2134 if (hasUnexpectedType(execution, sourceParameter, polymorphicTargetType)) { 2139 if (hasUnexpectedType(execution, sourceParameter, polymorphicTargetType)) {
2135 return true; 2140 return true;
2136 } 2141 }