Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1000)

Side by Side Diff: pkg/compiler/lib/src/ssa/nodes.dart

Issue 1182053010: Revert "Split TypedSelector into Selector and TypeMask." (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of ssa; 5 part of ssa;
6 6
7 abstract class HVisitor<R> { 7 abstract class HVisitor<R> {
8 R visitAdd(HAdd node); 8 R visitAdd(HAdd node);
9 R visitAwait(HAwait node); 9 R visitAwait(HAwait node);
10 R visitBitAnd(HBitAnd node); 10 R visitBitAnd(HBitAnd node);
(...skipping 1375 matching lines...) Expand 10 before | Expand all | Expand 10 after
1386 static const int ARGUMENTS_OFFSET = 1; 1386 static const int ARGUMENTS_OFFSET = 1;
1387 bool canThrow() => true; 1387 bool canThrow() => true;
1388 1388
1389 /** 1389 /**
1390 * Returns whether this call is on an intercepted method. 1390 * Returns whether this call is on an intercepted method.
1391 */ 1391 */
1392 bool get isInterceptedCall { 1392 bool get isInterceptedCall {
1393 // We know it's a selector call if it follows the interceptor 1393 // We know it's a selector call if it follows the interceptor
1394 // calling convention, which adds the actual receiver as a 1394 // calling convention, which adds the actual receiver as a
1395 // parameter to the call. 1395 // parameter to the call.
1396 return (selector != null) && 1396 return (selector != null) && (inputs.length - 2 == selector.argumentCount);
1397 (inputs.length - 2 == selector.argumentCount);
1398 } 1397 }
1399 } 1398 }
1400 1399
1401 abstract class HInvokeDynamic extends HInvoke { 1400 abstract class HInvokeDynamic extends HInvoke {
1402 final InvokeDynamicSpecializer specializer; 1401 final InvokeDynamicSpecializer specializer;
1403 Selector selector; 1402 Selector selector;
1404 TypeMask mask;
1405 Element element; 1403 Element element;
1406 1404
1407 HInvokeDynamic(Selector selector, 1405 HInvokeDynamic(Selector selector,
1408 this.mask,
1409 this.element, 1406 this.element,
1410 List<HInstruction> inputs, 1407 List<HInstruction> inputs,
1411 TypeMask type, 1408 TypeMask type,
1412 [bool isIntercepted = false]) 1409 [bool isIntercepted = false])
1413 : super(inputs, type), 1410 : super(inputs, type),
1414 this.selector = selector, 1411 this.selector = selector,
1415 specializer = isIntercepted 1412 specializer = isIntercepted
1416 ? InvokeDynamicSpecializer.lookupSpecializer(selector) 1413 ? InvokeDynamicSpecializer.lookupSpecializer(selector)
1417 : const InvokeDynamicSpecializer(); 1414 : const InvokeDynamicSpecializer();
1418 toString() => 'invoke dynamic: selector=$selector, mask=$mask'; 1415 toString() => 'invoke dynamic: $selector';
1419 HInstruction get receiver => inputs[0]; 1416 HInstruction get receiver => inputs[0];
1420 HInstruction getDartReceiver(Compiler compiler) { 1417 HInstruction getDartReceiver(Compiler compiler) {
1421 return isCallOnInterceptor(compiler) ? inputs[1] : inputs[0]; 1418 return isCallOnInterceptor(compiler) ? inputs[1] : inputs[0];
1422 } 1419 }
1423 1420
1424 /** 1421 /**
1425 * Returns whether this call is on an interceptor object. 1422 * Returns whether this call is on an interceptor object.
1426 */ 1423 */
1427 bool isCallOnInterceptor(Compiler compiler) { 1424 bool isCallOnInterceptor(Compiler compiler) {
1428 return isInterceptedCall && receiver.isInterceptor(compiler); 1425 return isInterceptedCall && receiver.isInterceptor(compiler);
1429 } 1426 }
1430 1427
1431 int typeCode() => HInstruction.INVOKE_DYNAMIC_TYPECODE; 1428 int typeCode() => HInstruction.INVOKE_DYNAMIC_TYPECODE;
1432 bool typeEquals(other) => other is HInvokeDynamic; 1429 bool typeEquals(other) => other is HInvokeDynamic;
1433 bool dataEquals(HInvokeDynamic other) { 1430 bool dataEquals(HInvokeDynamic other) {
1434 // Use the name and the kind instead of [Selector.operator==] 1431 // Use the name and the kind instead of [Selector.operator==]
1435 // because we don't need to check the arity (already checked in 1432 // because we don't need to check the arity (already checked in
1436 // [gvnEquals]), and the receiver types may not be in sync. 1433 // [gvnEquals]), and the receiver types may not be in sync.
1437 return selector.name == other.selector.name 1434 return selector.name == other.selector.name
1438 && selector.kind == other.selector.kind; 1435 && selector.kind == other.selector.kind;
1439 } 1436 }
1440 } 1437 }
1441 1438
1442 class HInvokeClosure extends HInvokeDynamic { 1439 class HInvokeClosure extends HInvokeDynamic {
1443 HInvokeClosure(Selector selector, 1440 HInvokeClosure(Selector selector, List<HInstruction> inputs, TypeMask type)
1444 List<HInstruction> inputs, 1441 : super(selector, null, inputs, type) {
1445 TypeMask type)
1446 : super(selector, null, null, inputs, type) {
1447 assert(selector.isClosureCall); 1442 assert(selector.isClosureCall);
1448 } 1443 }
1449 accept(HVisitor visitor) => visitor.visitInvokeClosure(this); 1444 accept(HVisitor visitor) => visitor.visitInvokeClosure(this);
1450 } 1445 }
1451 1446
1452 class HInvokeDynamicMethod extends HInvokeDynamic { 1447 class HInvokeDynamicMethod extends HInvokeDynamic {
1453 HInvokeDynamicMethod(Selector selector, 1448 HInvokeDynamicMethod(Selector selector,
1454 TypeMask mask,
1455 List<HInstruction> inputs, 1449 List<HInstruction> inputs,
1456 TypeMask type, 1450 TypeMask type,
1457 [bool isIntercepted = false]) 1451 [bool isIntercepted = false])
1458 : super(selector, mask, null, inputs, type, isIntercepted); 1452 : super(selector, null, inputs, type, isIntercepted);
1459 1453
1460 String toString() => 'invoke dynamic method: selector=$selector, mask=$mask'; 1454 String toString() => 'invoke dynamic method: $selector';
1461 accept(HVisitor visitor) => visitor.visitInvokeDynamicMethod(this); 1455 accept(HVisitor visitor) => visitor.visitInvokeDynamicMethod(this);
1462 } 1456 }
1463 1457
1464 abstract class HInvokeDynamicField extends HInvokeDynamic { 1458 abstract class HInvokeDynamicField extends HInvokeDynamic {
1465 HInvokeDynamicField( 1459 HInvokeDynamicField(
1466 Selector selector, TypeMask mask, 1460 Selector selector, Element element, List<HInstruction> inputs,
1467 Element element, List<HInstruction> inputs,
1468 TypeMask type) 1461 TypeMask type)
1469 : super(selector, mask, element, inputs, type); 1462 : super(selector, element, inputs, type);
1470 toString() => 'invoke dynamic field: selector=$selector, mask=$mask'; 1463 toString() => 'invoke dynamic field: $selector';
1471 } 1464 }
1472 1465
1473 class HInvokeDynamicGetter extends HInvokeDynamicField { 1466 class HInvokeDynamicGetter extends HInvokeDynamicField {
1474 HInvokeDynamicGetter(Selector selector, TypeMask mask, 1467 HInvokeDynamicGetter(selector, element, inputs, type)
1475 Element element, List<HInstruction> inputs, TypeMask type) 1468 : super(selector, element, inputs, type);
1476 : super(selector, mask, element, inputs, type); 1469 toString() => 'invoke dynamic getter: $selector';
1477 toString() => 'invoke dynamic getter: selector=$selector, mask=$mask';
1478 accept(HVisitor visitor) => visitor.visitInvokeDynamicGetter(this); 1470 accept(HVisitor visitor) => visitor.visitInvokeDynamicGetter(this);
1479 } 1471 }
1480 1472
1481 class HInvokeDynamicSetter extends HInvokeDynamicField { 1473 class HInvokeDynamicSetter extends HInvokeDynamicField {
1482 HInvokeDynamicSetter(Selector selector, TypeMask mask, 1474 HInvokeDynamicSetter(selector, element, inputs, type)
1483 Element element, List<HInstruction> inputs, TypeMask type) 1475 : super(selector, element, inputs, type);
1484 : super(selector, mask, element, inputs, type); 1476 toString() => 'invoke dynamic setter: $selector';
1485 toString() => 'invoke dynamic setter: selector=$selector, mask=$mask';
1486 accept(HVisitor visitor) => visitor.visitInvokeDynamicSetter(this); 1477 accept(HVisitor visitor) => visitor.visitInvokeDynamicSetter(this);
1487 } 1478 }
1488 1479
1489 class HInvokeStatic extends HInvoke { 1480 class HInvokeStatic extends HInvoke {
1490 final Element element; 1481 final Element element;
1491 1482
1492 final bool targetCanThrow; 1483 final bool targetCanThrow;
1493 1484
1494 bool canThrow() => targetCanThrow; 1485 bool canThrow() => targetCanThrow;
1495 1486
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
1794 [this.instantiatedTypes]) 1785 [this.instantiatedTypes])
1795 : super(type, inputs); 1786 : super(type, inputs);
1796 1787
1797 accept(HVisitor visitor) => visitor.visitForeignNew(this); 1788 accept(HVisitor visitor) => visitor.visitForeignNew(this);
1798 1789
1799 bool get isAllocation => true; 1790 bool get isAllocation => true;
1800 } 1791 }
1801 1792
1802 abstract class HInvokeBinary extends HInstruction { 1793 abstract class HInvokeBinary extends HInstruction {
1803 final Selector selector; 1794 final Selector selector;
1804 HInvokeBinary( 1795 HInvokeBinary(HInstruction left, HInstruction right, this.selector, type)
1805 HInstruction left, HInstruction right, this.selector, TypeMask type)
1806 : super(<HInstruction>[left, right], type) { 1796 : super(<HInstruction>[left, right], type) {
1807 sideEffects.clearAllSideEffects(); 1797 sideEffects.clearAllSideEffects();
1808 sideEffects.clearAllDependencies(); 1798 sideEffects.clearAllDependencies();
1809 setUseGvn(); 1799 setUseGvn();
1810 } 1800 }
1811 1801
1812 HInstruction get left => inputs[0]; 1802 HInstruction get left => inputs[0];
1813 HInstruction get right => inputs[1]; 1803 HInstruction get right => inputs[1];
1814 1804
1815 BinaryOperation operation(ConstantSystem constantSystem); 1805 BinaryOperation operation(ConstantSystem constantSystem);
1816 } 1806 }
1817 1807
1818 abstract class HBinaryArithmetic extends HInvokeBinary { 1808 abstract class HBinaryArithmetic extends HInvokeBinary {
1819 HBinaryArithmetic( 1809 HBinaryArithmetic(left, right, selector, type)
1820 HInstruction left, HInstruction right, Selector selector, TypeMask type)
1821 : super(left, right, selector, type); 1810 : super(left, right, selector, type);
1822 BinaryOperation operation(ConstantSystem constantSystem); 1811 BinaryOperation operation(ConstantSystem constantSystem);
1823 } 1812 }
1824 1813
1825 class HAdd extends HBinaryArithmetic { 1814 class HAdd extends HBinaryArithmetic {
1826 HAdd(HInstruction left, HInstruction right, Selector selector, TypeMask type) 1815 HAdd(left, right, selector, type) : super(left, right, selector, type);
1827 : super(left, right, selector, type);
1828 accept(HVisitor visitor) => visitor.visitAdd(this); 1816 accept(HVisitor visitor) => visitor.visitAdd(this);
1829 1817
1830 BinaryOperation operation(ConstantSystem constantSystem) 1818 BinaryOperation operation(ConstantSystem constantSystem)
1831 => constantSystem.add; 1819 => constantSystem.add;
1832 int typeCode() => HInstruction.ADD_TYPECODE; 1820 int typeCode() => HInstruction.ADD_TYPECODE;
1833 bool typeEquals(other) => other is HAdd; 1821 bool typeEquals(other) => other is HAdd;
1834 bool dataEquals(HInstruction other) => true; 1822 bool dataEquals(HInstruction other) => true;
1835 } 1823 }
1836 1824
1837 class HDivide extends HBinaryArithmetic { 1825 class HDivide extends HBinaryArithmetic {
1838 HDivide( 1826 HDivide(left, right, selector, type) : super(left, right, selector, type);
1839 HInstruction left, HInstruction right, Selector selector, TypeMask type)
1840 : super(left, right, selector, type);
1841 accept(HVisitor visitor) => visitor.visitDivide(this); 1827 accept(HVisitor visitor) => visitor.visitDivide(this);
1842 1828
1843 BinaryOperation operation(ConstantSystem constantSystem) 1829 BinaryOperation operation(ConstantSystem constantSystem)
1844 => constantSystem.divide; 1830 => constantSystem.divide;
1845 int typeCode() => HInstruction.DIVIDE_TYPECODE; 1831 int typeCode() => HInstruction.DIVIDE_TYPECODE;
1846 bool typeEquals(other) => other is HDivide; 1832 bool typeEquals(other) => other is HDivide;
1847 bool dataEquals(HInstruction other) => true; 1833 bool dataEquals(HInstruction other) => true;
1848 } 1834 }
1849 1835
1850 class HMultiply extends HBinaryArithmetic { 1836 class HMultiply extends HBinaryArithmetic {
1851 HMultiply( 1837 HMultiply(left, right, selector, type) : super(left, right, selector, type);
1852 HInstruction left, HInstruction right, Selector selector, TypeMask type)
1853 : super(left, right, selector, type);
1854 accept(HVisitor visitor) => visitor.visitMultiply(this); 1838 accept(HVisitor visitor) => visitor.visitMultiply(this);
1855 1839
1856 BinaryOperation operation(ConstantSystem operations) 1840 BinaryOperation operation(ConstantSystem operations)
1857 => operations.multiply; 1841 => operations.multiply;
1858 int typeCode() => HInstruction.MULTIPLY_TYPECODE; 1842 int typeCode() => HInstruction.MULTIPLY_TYPECODE;
1859 bool typeEquals(other) => other is HMultiply; 1843 bool typeEquals(other) => other is HMultiply;
1860 bool dataEquals(HInstruction other) => true; 1844 bool dataEquals(HInstruction other) => true;
1861 } 1845 }
1862 1846
1863 class HSubtract extends HBinaryArithmetic { 1847 class HSubtract extends HBinaryArithmetic {
1864 HSubtract( 1848 HSubtract(left, right, selector, type) : super(left, right, selector, type);
1865 HInstruction left, HInstruction right, Selector selector, TypeMask type)
1866 : super(left, right, selector, type);
1867 accept(HVisitor visitor) => visitor.visitSubtract(this); 1849 accept(HVisitor visitor) => visitor.visitSubtract(this);
1868 1850
1869 BinaryOperation operation(ConstantSystem constantSystem) 1851 BinaryOperation operation(ConstantSystem constantSystem)
1870 => constantSystem.subtract; 1852 => constantSystem.subtract;
1871 int typeCode() => HInstruction.SUBTRACT_TYPECODE; 1853 int typeCode() => HInstruction.SUBTRACT_TYPECODE;
1872 bool typeEquals(other) => other is HSubtract; 1854 bool typeEquals(other) => other is HSubtract;
1873 bool dataEquals(HInstruction other) => true; 1855 bool dataEquals(HInstruction other) => true;
1874 } 1856 }
1875 1857
1876 class HTruncatingDivide extends HBinaryArithmetic { 1858 class HTruncatingDivide extends HBinaryArithmetic {
1877 HTruncatingDivide( 1859 HTruncatingDivide(left, right, selector, type)
1878 HInstruction left, HInstruction right, Selector selector, TypeMask type)
1879 : super(left, right, selector, type); 1860 : super(left, right, selector, type);
1880 accept(HVisitor visitor) => visitor.visitTruncatingDivide(this); 1861 accept(HVisitor visitor) => visitor.visitTruncatingDivide(this);
1881 1862
1882 BinaryOperation operation(ConstantSystem constantSystem) 1863 BinaryOperation operation(ConstantSystem constantSystem)
1883 => constantSystem.truncatingDivide; 1864 => constantSystem.truncatingDivide;
1884 int typeCode() => HInstruction.TRUNCATING_DIVIDE_TYPECODE; 1865 int typeCode() => HInstruction.TRUNCATING_DIVIDE_TYPECODE;
1885 bool typeEquals(other) => other is HTruncatingDivide; 1866 bool typeEquals(other) => other is HTruncatingDivide;
1886 bool dataEquals(HInstruction other) => true; 1867 bool dataEquals(HInstruction other) => true;
1887 } 1868 }
1888 1869
(...skipping 14 matching lines...) Expand all
1903 * following join-block. 1884 * following join-block.
1904 */ 1885 */
1905 HBasicBlock get defaultTarget => block.successors.last; 1886 HBasicBlock get defaultTarget => block.successors.last;
1906 1887
1907 accept(HVisitor visitor) => visitor.visitSwitch(this); 1888 accept(HVisitor visitor) => visitor.visitSwitch(this);
1908 1889
1909 String toString() => "HSwitch cases = $inputs"; 1890 String toString() => "HSwitch cases = $inputs";
1910 } 1891 }
1911 1892
1912 abstract class HBinaryBitOp extends HInvokeBinary { 1893 abstract class HBinaryBitOp extends HInvokeBinary {
1913 HBinaryBitOp( 1894 HBinaryBitOp(left, right, selector, type)
1914 HInstruction left, HInstruction right, Selector selector, TypeMask type)
1915 : super(left, right, selector, type); 1895 : super(left, right, selector, type);
1916 } 1896 }
1917 1897
1918 class HShiftLeft extends HBinaryBitOp { 1898 class HShiftLeft extends HBinaryBitOp {
1919 HShiftLeft( 1899 HShiftLeft(left, right, selector, type) : super(left, right, selector, type);
1920 HInstruction left, HInstruction right, Selector selector, TypeMask type)
1921 : super(left, right, selector, type);
1922 accept(HVisitor visitor) => visitor.visitShiftLeft(this); 1900 accept(HVisitor visitor) => visitor.visitShiftLeft(this);
1923 1901
1924 BinaryOperation operation(ConstantSystem constantSystem) 1902 BinaryOperation operation(ConstantSystem constantSystem)
1925 => constantSystem.shiftLeft; 1903 => constantSystem.shiftLeft;
1926 int typeCode() => HInstruction.SHIFT_LEFT_TYPECODE; 1904 int typeCode() => HInstruction.SHIFT_LEFT_TYPECODE;
1927 bool typeEquals(other) => other is HShiftLeft; 1905 bool typeEquals(other) => other is HShiftLeft;
1928 bool dataEquals(HInstruction other) => true; 1906 bool dataEquals(HInstruction other) => true;
1929 } 1907 }
1930 1908
1931 class HShiftRight extends HBinaryBitOp { 1909 class HShiftRight extends HBinaryBitOp {
1932 HShiftRight( 1910 HShiftRight(left, right, selector, type) : super(left, right, selector, type);
1933 HInstruction left, HInstruction right, Selector selector, TypeMask type)
1934 : super(left, right, selector, type);
1935 accept(HVisitor visitor) => visitor.visitShiftRight(this); 1911 accept(HVisitor visitor) => visitor.visitShiftRight(this);
1936 1912
1937 BinaryOperation operation(ConstantSystem constantSystem) 1913 BinaryOperation operation(ConstantSystem constantSystem)
1938 => constantSystem.shiftRight; 1914 => constantSystem.shiftRight;
1939 int typeCode() => HInstruction.SHIFT_RIGHT_TYPECODE; 1915 int typeCode() => HInstruction.SHIFT_RIGHT_TYPECODE;
1940 bool typeEquals(other) => other is HShiftRight; 1916 bool typeEquals(other) => other is HShiftRight;
1941 bool dataEquals(HInstruction other) => true; 1917 bool dataEquals(HInstruction other) => true;
1942 } 1918 }
1943 1919
1944 class HBitOr extends HBinaryBitOp { 1920 class HBitOr extends HBinaryBitOp {
1945 HBitOr( 1921 HBitOr(left, right, selector, type) : super(left, right, selector, type);
1946 HInstruction left, HInstruction right, Selector selector, TypeMask type)
1947 : super(left, right, selector, type);
1948 accept(HVisitor visitor) => visitor.visitBitOr(this); 1922 accept(HVisitor visitor) => visitor.visitBitOr(this);
1949 1923
1950 BinaryOperation operation(ConstantSystem constantSystem) 1924 BinaryOperation operation(ConstantSystem constantSystem)
1951 => constantSystem.bitOr; 1925 => constantSystem.bitOr;
1952 int typeCode() => HInstruction.BIT_OR_TYPECODE; 1926 int typeCode() => HInstruction.BIT_OR_TYPECODE;
1953 bool typeEquals(other) => other is HBitOr; 1927 bool typeEquals(other) => other is HBitOr;
1954 bool dataEquals(HInstruction other) => true; 1928 bool dataEquals(HInstruction other) => true;
1955 } 1929 }
1956 1930
1957 class HBitAnd extends HBinaryBitOp { 1931 class HBitAnd extends HBinaryBitOp {
1958 HBitAnd( 1932 HBitAnd(left, right, selector, type) : super(left, right, selector, type);
1959 HInstruction left, HInstruction right, Selector selector, TypeMask type)
1960 : super(left, right, selector, type);
1961 accept(HVisitor visitor) => visitor.visitBitAnd(this); 1933 accept(HVisitor visitor) => visitor.visitBitAnd(this);
1962 1934
1963 BinaryOperation operation(ConstantSystem constantSystem) 1935 BinaryOperation operation(ConstantSystem constantSystem)
1964 => constantSystem.bitAnd; 1936 => constantSystem.bitAnd;
1965 int typeCode() => HInstruction.BIT_AND_TYPECODE; 1937 int typeCode() => HInstruction.BIT_AND_TYPECODE;
1966 bool typeEquals(other) => other is HBitAnd; 1938 bool typeEquals(other) => other is HBitAnd;
1967 bool dataEquals(HInstruction other) => true; 1939 bool dataEquals(HInstruction other) => true;
1968 } 1940 }
1969 1941
1970 class HBitXor extends HBinaryBitOp { 1942 class HBitXor extends HBinaryBitOp {
1971 HBitXor( 1943 HBitXor(left, right, selector, type) : super(left, right, selector, type);
1972 HInstruction left, HInstruction right, Selector selector, TypeMask type)
1973 : super(left, right, selector, type);
1974 accept(HVisitor visitor) => visitor.visitBitXor(this); 1944 accept(HVisitor visitor) => visitor.visitBitXor(this);
1975 1945
1976 BinaryOperation operation(ConstantSystem constantSystem) 1946 BinaryOperation operation(ConstantSystem constantSystem)
1977 => constantSystem.bitXor; 1947 => constantSystem.bitXor;
1978 int typeCode() => HInstruction.BIT_XOR_TYPECODE; 1948 int typeCode() => HInstruction.BIT_XOR_TYPECODE;
1979 bool typeEquals(other) => other is HBitXor; 1949 bool typeEquals(other) => other is HBitXor;
1980 bool dataEquals(HInstruction other) => true; 1950 bool dataEquals(HInstruction other) => true;
1981 } 1951 }
1982 1952
1983 abstract class HInvokeUnary extends HInstruction { 1953 abstract class HInvokeUnary extends HInstruction {
1984 final Selector selector; 1954 final Selector selector;
1985 HInvokeUnary(HInstruction input, this.selector, type) 1955 HInvokeUnary(HInstruction input, this.selector, type)
1986 : super(<HInstruction>[input], type) { 1956 : super(<HInstruction>[input], type) {
1987 sideEffects.clearAllSideEffects(); 1957 sideEffects.clearAllSideEffects();
1988 sideEffects.clearAllDependencies(); 1958 sideEffects.clearAllDependencies();
1989 setUseGvn(); 1959 setUseGvn();
1990 } 1960 }
1991 1961
1992 HInstruction get operand => inputs[0]; 1962 HInstruction get operand => inputs[0];
1993 1963
1994 UnaryOperation operation(ConstantSystem constantSystem); 1964 UnaryOperation operation(ConstantSystem constantSystem);
1995 } 1965 }
1996 1966
1997 class HNegate extends HInvokeUnary { 1967 class HNegate extends HInvokeUnary {
1998 HNegate(HInstruction input, Selector selector, TypeMask type) 1968 HNegate(input, selector, type) : super(input, selector, type);
1999 : super(input, selector, type);
2000 accept(HVisitor visitor) => visitor.visitNegate(this); 1969 accept(HVisitor visitor) => visitor.visitNegate(this);
2001 1970
2002 UnaryOperation operation(ConstantSystem constantSystem) 1971 UnaryOperation operation(ConstantSystem constantSystem)
2003 => constantSystem.negate; 1972 => constantSystem.negate;
2004 int typeCode() => HInstruction.NEGATE_TYPECODE; 1973 int typeCode() => HInstruction.NEGATE_TYPECODE;
2005 bool typeEquals(other) => other is HNegate; 1974 bool typeEquals(other) => other is HNegate;
2006 bool dataEquals(HInstruction other) => true; 1975 bool dataEquals(HInstruction other) => true;
2007 } 1976 }
2008 1977
2009 class HBitNot extends HInvokeUnary { 1978 class HBitNot extends HInvokeUnary {
2010 HBitNot(HInstruction input, Selector selector, TypeMask type) 1979 HBitNot(input, selector, type) : super(input, selector, type);
2011 : super(input, selector, type);
2012 accept(HVisitor visitor) => visitor.visitBitNot(this); 1980 accept(HVisitor visitor) => visitor.visitBitNot(this);
2013 1981
2014 UnaryOperation operation(ConstantSystem constantSystem) 1982 UnaryOperation operation(ConstantSystem constantSystem)
2015 => constantSystem.bitNot; 1983 => constantSystem.bitNot;
2016 int typeCode() => HInstruction.BIT_NOT_TYPECODE; 1984 int typeCode() => HInstruction.BIT_NOT_TYPECODE;
2017 bool typeEquals(other) => other is HBitNot; 1985 bool typeEquals(other) => other is HBitNot;
2018 bool dataEquals(HInstruction other) => true; 1986 bool dataEquals(HInstruction other) => true;
2019 } 1987 }
2020 1988
2021 class HExit extends HControlFlow { 1989 class HExit extends HControlFlow {
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
2404 * will fetch the interceptor of its first parameter, and make a call 2372 * will fetch the interceptor of its first parameter, and make a call
2405 * on a given selector with the remaining parameters. 2373 * on a given selector with the remaining parameters.
2406 * 2374 *
2407 * In order to share the same optimizations with regular interceptor 2375 * In order to share the same optimizations with regular interceptor
2408 * calls, this class extends [HInvokeDynamic] and also has the null 2376 * calls, this class extends [HInvokeDynamic] and also has the null
2409 * constant as the first input. 2377 * constant as the first input.
2410 */ 2378 */
2411 class HOneShotInterceptor extends HInvokeDynamic { 2379 class HOneShotInterceptor extends HInvokeDynamic {
2412 Set<ClassElement> interceptedClasses; 2380 Set<ClassElement> interceptedClasses;
2413 HOneShotInterceptor(Selector selector, 2381 HOneShotInterceptor(Selector selector,
2414 TypeMask mask,
2415 List<HInstruction> inputs, 2382 List<HInstruction> inputs,
2416 TypeMask type, 2383 TypeMask type,
2417 this.interceptedClasses) 2384 this.interceptedClasses)
2418 : super(selector, mask, null, inputs, type, true) { 2385 : super(selector, null, inputs, type, true) {
2419 assert(inputs[0] is HConstant); 2386 assert(inputs[0] is HConstant);
2420 assert(inputs[0].isNull()); 2387 assert(inputs[0].isNull());
2421 } 2388 }
2422 bool isCallOnInterceptor(Compiler compiler) => true; 2389 bool isCallOnInterceptor(Compiler compiler) => true;
2423 2390
2424 String toString() => 'one shot interceptor: selector=$selector, mask=$mask'; 2391 String toString() => 'one shot interceptor on $selector';
2425 accept(HVisitor visitor) => visitor.visitOneShotInterceptor(this); 2392 accept(HVisitor visitor) => visitor.visitOneShotInterceptor(this);
2426 } 2393 }
2427 2394
2428 /** An [HLazyStatic] is a static that is initialized lazily at first read. */ 2395 /** An [HLazyStatic] is a static that is initialized lazily at first read. */
2429 class HLazyStatic extends HInstruction { 2396 class HLazyStatic extends HInstruction {
2430 final Element element; 2397 final Element element;
2431 HLazyStatic(this.element, type) : super(<HInstruction>[], type) { 2398 HLazyStatic(this.element, type) : super(<HInstruction>[], type) {
2432 // TODO(4931): The first access has side-effects, but we afterwards we 2399 // TODO(4931): The first access has side-effects, but we afterwards we
2433 // should be able to GVN. 2400 // should be able to GVN.
2434 sideEffects.setAllSideEffects(); 2401 sideEffects.setAllSideEffects();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2468 2435
2469 bool get isAllocation => true; 2436 bool get isAllocation => true;
2470 } 2437 }
2471 2438
2472 /** 2439 /**
2473 * The primitive array indexing operation. Note that this instruction 2440 * The primitive array indexing operation. Note that this instruction
2474 * does not throw because we generate the checks explicitly. 2441 * does not throw because we generate the checks explicitly.
2475 */ 2442 */
2476 class HIndex extends HInstruction { 2443 class HIndex extends HInstruction {
2477 final Selector selector; 2444 final Selector selector;
2478 HIndex(HInstruction receiver, 2445 HIndex(HInstruction receiver, HInstruction index, this.selector, type)
2479 HInstruction index,
2480 this.selector,
2481 TypeMask type)
2482 : super(<HInstruction>[receiver, index], type) { 2446 : super(<HInstruction>[receiver, index], type) {
2483 sideEffects.clearAllSideEffects(); 2447 sideEffects.clearAllSideEffects();
2484 sideEffects.clearAllDependencies(); 2448 sideEffects.clearAllDependencies();
2485 sideEffects.setDependsOnIndexStore(); 2449 sideEffects.setDependsOnIndexStore();
2486 setUseGvn(); 2450 setUseGvn();
2487 } 2451 }
2488 2452
2489 String toString() => 'index operator'; 2453 String toString() => 'index operator';
2490 accept(HVisitor visitor) => visitor.visitIndex(this); 2454 accept(HVisitor visitor) => visitor.visitIndex(this);
2491 2455
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after
3217 class HDynamicType extends HRuntimeType { 3181 class HDynamicType extends HRuntimeType {
3218 HDynamicType(DynamicType dartType, TypeMask instructionType) 3182 HDynamicType(DynamicType dartType, TypeMask instructionType)
3219 : super(const <HInstruction>[], dartType, instructionType); 3183 : super(const <HInstruction>[], dartType, instructionType);
3220 3184
3221 accept(HVisitor visitor) => visitor.visitDynamicType(this); 3185 accept(HVisitor visitor) => visitor.visitDynamicType(this);
3222 3186
3223 int typeCode() => HInstruction.DYNAMIC_TYPE_TYPECODE; 3187 int typeCode() => HInstruction.DYNAMIC_TYPE_TYPECODE;
3224 3188
3225 bool typeEquals(HInstruction other) => other is HDynamicType; 3189 bool typeEquals(HInstruction other) => other is HDynamicType;
3226 } 3190 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart ('k') | pkg/compiler/lib/src/ssa/optimize.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698