Index: tests/compiler/dart2js/backend_dart/opt_constprop_test.dart |
diff --git a/tests/compiler/dart2js/backend_dart/opt_constprop_test.dart b/tests/compiler/dart2js/backend_dart/opt_constprop_test.dart |
deleted file mode 100644 |
index 2ee38902d77b0f877ed21ce968d2da068a5b7a65..0000000000000000000000000000000000000000 |
--- a/tests/compiler/dart2js/backend_dart/opt_constprop_test.dart |
+++ /dev/null |
@@ -1,528 +0,0 @@ |
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-import 'dart:async'; |
-import '../mock_compiler.dart'; |
-import 'sexpr_unstringifier.dart'; |
-import 'package:async_helper/async_helper.dart'; |
-import "package:expect/expect.dart"; |
-import 'package:compiler/src/cps_ir/cps_ir_nodes_sexpr.dart'; |
-import 'package:compiler/src/cps_ir/optimizers.dart'; |
-import 'package:compiler/src/constant_system_dart.dart'; |
- |
-// The tests in this file that ensure that sparse constant propagation on the |
-// CPS IR works as expected. |
- |
-// CP1 represents the following incoming dart code: |
-// |
-// int main() { |
-// int i = 1; |
-// int j; |
-// if (i == 1) { |
-// j = 2; |
-// } else { |
-// j = 3; |
-// } |
-// return j; |
-// } |
- |
-String CP1_IN = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetPrim (v1 (Constant (Int 1))) |
- (LetCont |
- ((k0 (v2) |
- (LetCont |
- ((k1 () |
- (LetPrim (v3 (Constant (Int 2))) |
- (InvokeContinuation return (v3)))) |
- (k2 () |
- (LetPrim (v4 (Constant (Int 3))) |
- (InvokeContinuation return (v4))))) |
- (Branch (IsTrue v2) k1 k2)))) |
- (InvokeMethod v0 == (v1) k0))))) |
-"""; |
-String CP1_OUT = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetPrim (v1 (Constant (Int 1))) |
- (LetCont |
- ((k0 (v2) |
- (LetCont |
- ((k1 () |
- (LetPrim (v3 (Constant (Int 2))) |
- (InvokeContinuation return (v3)))) |
- (k2 () |
- (LetPrim (v4 (Constant (Int 3))) |
- (InvokeContinuation return (v4))))) |
- (InvokeContinuation k1 ())))) |
- (LetPrim (v5 (Constant (Bool true))) |
- (InvokeContinuation k0 (v5))))))) |
-"""; |
- |
-// CP2 represents the following incoming dart code: |
-// |
-// int main() { |
-// int i = 1; |
-// while (true) { |
-// if (false || false) { |
-// return i; |
-// } |
-// if (true && i == 1) { |
-// return i; |
-// } |
-// } |
-// return 42; |
-// } |
- |
-String CP2_IN = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetCont |
- ((rec k0 () |
- (LetCont |
- ((k1 () |
- (LetPrim (v1 (Constant (Int 42))) |
- (InvokeContinuation return (v1)))) |
- (k2 () |
- (LetPrim (v2 (Constant (Bool false))) |
- (LetCont |
- ((k3 (v3) |
- (LetCont |
- ((k4 () |
- (InvokeContinuation return (v0))) |
- (k5 () |
- (LetPrim (v4 (Constant (Bool true))) |
- (LetCont |
- ((k6 (v5) |
- (LetCont |
- ((k7 () |
- (InvokeContinuation return (v0))) |
- (k8 () |
- (InvokeContinuation rec k0 ()))) |
- (Branch (IsTrue v5) k7 k8)))) |
- (LetCont |
- ((k9 () |
- (LetPrim (v6 (Constant (Int 1))) |
- (LetCont |
- ((k10 (v7) |
- (LetCont |
- ((k11 () |
- (LetPrim (v8 (Constant (Bool true))) |
- (InvokeContinuation k6 (v8)))) |
- (k12 () |
- (LetPrim (v9 (Constant (Bool false))) |
- (InvokeContinuation k6 (v9))))) |
- (Branch (IsTrue v7) k11 k12)))) |
- (InvokeMethod v0 == (v6) k10)))) |
- (k13 () |
- (LetPrim (v10 (Constant (Bool false))) |
- (InvokeContinuation k6 (v10))))) |
- (Branch (IsTrue v4) k9 k13)))))) |
- (Branch (IsTrue v3) k4 k5)))) |
- (LetCont |
- ((k14 () |
- (LetPrim (v11 (Constant (Bool true))) |
- (InvokeContinuation k3 (v11)))) |
- (k15 () |
- (LetPrim (v12 (Constant (Bool false))) |
- (LetCont |
- ((k16 () |
- (LetPrim (v13 (Constant (Bool true))) |
- (InvokeContinuation k3 (v13)))) |
- (k17 () |
- (LetPrim (v14 (Constant (Bool false))) |
- (InvokeContinuation k3 (v14))))) |
- (Branch (IsTrue v12) k16 k17))))) |
- (Branch (IsTrue v2) k14 k15)))))) |
- (LetPrim (v15 (Constant (Bool true))) |
- (Branch (IsTrue v15) k2 k1))))) |
- (InvokeContinuation k0 ())))) |
-"""; |
-String CP2_OUT = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetCont |
- ((rec k0 () |
- (LetCont |
- ((k1 () |
- (LetPrim (v1 (Constant (Int 42))) |
- (InvokeContinuation return (v1)))) |
- (k2 () |
- (LetPrim (v2 (Constant (Bool false))) |
- (LetCont |
- ((k3 (v3) |
- (LetCont |
- ((k4 () |
- (InvokeContinuation return (v0))) |
- (k5 () |
- (LetPrim (v4 (Constant (Bool true))) |
- (LetCont |
- ((k6 (v5) |
- (LetCont |
- ((k7 () |
- (InvokeContinuation return (v0))) |
- (k8 () |
- (InvokeContinuation rec k0 ()))) |
- (InvokeContinuation k7 ())))) |
- (LetCont |
- ((k9 () |
- (LetPrim (v6 (Constant (Int 1))) |
- (LetCont |
- ((k10 (v7) |
- (LetCont |
- ((k11 () |
- (LetPrim (v8 (Constant (Bool true))) |
- (InvokeContinuation k6 (v8)))) |
- (k12 () |
- (LetPrim (v9 (Constant (Bool false))) |
- (InvokeContinuation k6 (v9))))) |
- (InvokeContinuation k11 ())))) |
- (LetPrim (v10 (Constant (Bool true))) |
- (InvokeContinuation k10 (v10)))))) |
- (k13 () |
- (LetPrim (v11 (Constant (Bool false))) |
- (InvokeContinuation k6 (v11))))) |
- (InvokeContinuation k9 ())))))) |
- (InvokeContinuation k5 ())))) |
- (LetCont |
- ((k14 () |
- (LetPrim (v12 (Constant (Bool true))) |
- (InvokeContinuation k3 (v12)))) |
- (k15 () |
- (LetPrim (v13 (Constant (Bool false))) |
- (LetCont |
- ((k16 () |
- (LetPrim (v14 (Constant (Bool true))) |
- (InvokeContinuation k3 (v14)))) |
- (k17 () |
- (LetPrim (v15 (Constant (Bool false))) |
- (InvokeContinuation k3 (v15))))) |
- (InvokeContinuation k17 ()))))) |
- (InvokeContinuation k15 ())))))) |
- (LetPrim (v16 (Constant (Bool true))) |
- (InvokeContinuation k2 ()))))) |
- (InvokeContinuation k0 ())))) |
-"""; |
- |
-// CP3 represents the following incoming dart code: |
-// |
-// int main() { |
-// int i = 1; |
-// i = f(); |
-// if (i == 1) { |
-// return 42; |
-// } |
-// return i; |
-// } |
- |
-String CP3_IN = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetCont |
- ((k0 (v1) |
- (LetPrim (v2 (Constant (Int 1))) |
- (LetCont |
- ((k1 (v3) |
- (LetCont |
- ((k2 () |
- (LetPrim (v4 (Constant (Int 42))) |
- (InvokeContinuation return (v4)))) |
- (k3 () |
- (InvokeContinuation return (v1)))) |
- (Branch (IsTrue v3) k2 k3)))) |
- (InvokeMethod v1 == (v2) k1))))) |
- (InvokeStatic f () k0)))) |
-"""; |
-String CP3_OUT = CP3_IN; |
- |
-// Addition. |
- |
-String CP4_IN = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetPrim (v1 (Constant (Int 2))) |
- (LetCont |
- ((k0 (v2) |
- (InvokeContinuation return (v2)))) |
- (InvokeMethod v0 + (v1) k0))))) |
-"""; |
-String CP4_OUT = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetPrim (v1 (Constant (Int 2))) |
- (LetCont |
- ((k0 (v2) |
- (InvokeContinuation return (v2)))) |
- (LetPrim (v3 (Constant (Int 3))) |
- (InvokeContinuation k0 (v3))))))) |
-"""; |
- |
-// Array access operator (no optimization). |
- |
-String CP5_IN = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetPrim (v1 (Constant (Int 2))) |
- (LetCont |
- ((k0 (v2) |
- (InvokeContinuation return (v2)))) |
- (InvokeMethod v0 [] (v1) k0))))) |
-"""; |
-String CP5_OUT = CP5_IN; |
- |
-// Division by 0. |
- |
-String CP6_IN = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetPrim (v1 (Constant (Int 0))) |
- (LetCont |
- ((k0 (v2) |
- (InvokeContinuation return (v2)))) |
- (InvokeMethod v0 / (v1) k0))))) |
-"""; |
-String CP6_OUT = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetPrim (v1 (Constant (Int 0))) |
- (LetCont |
- ((k0 (v2) |
- (InvokeContinuation return (v2)))) |
- (LetPrim (v3 (Constant (Double Infinity))) |
- (InvokeContinuation k0 (v3))))))) |
-"""; |
- |
-// Concatenate strings. |
- |
-String CP7_IN = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (String "b"))) |
- (LetPrim (v1 (Constant (String "d"))) |
- (LetPrim (v2 (Constant (String "a"))) |
- (LetPrim (v3 (Constant (String "c"))) |
- (LetPrim (v4 (Constant (String ""))) |
- (LetCont |
- ((k0 (v5) |
- (LetCont |
- ((k1 (v6) |
- (InvokeContinuation return (v6)))) |
- (InvokeMethod v5 length () k1)))) |
- (ConcatenateStrings (v2 v0 v3 v1 v4) k0)))))))) |
-"""; |
-String CP7_OUT = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (String "b"))) |
- (LetPrim (v1 (Constant (String "d"))) |
- (LetPrim (v2 (Constant (String "a"))) |
- (LetPrim (v3 (Constant (String "c"))) |
- (LetPrim (v4 (Constant (String ""))) |
- (LetCont |
- ((k0 (v5) |
- (LetCont |
- ((k1 (v6) |
- (InvokeContinuation return (v6)))) |
- (InvokeMethod v5 length () k1)))) |
- (LetPrim (v7 (Constant (String "abcd"))) |
- (InvokeContinuation k0 (v7)))))))))) |
-"""; |
- |
-// TODO(jgruber): We can't test is-check optimization because the unstringifier |
-// does not recreate accurate types for the TypeOperator node. |
- |
-// Simple branch removal. |
- |
-String CP8_IN = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetPrim (v1 (Constant (Int 1))) |
- (LetCont |
- ((k0 (v2) |
- (LetCont |
- ((k1 () |
- (LetPrim (v3 (Constant (Int 42))) |
- (InvokeContinuation return (v3)))) |
- (k2 () |
- (InvokeContinuation return (v0)))) |
- (Branch (IsTrue v2) k1 k2)))) |
- (InvokeMethod v0 == (v1) k0))))) |
-"""; |
-String CP8_OUT = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetPrim (v1 (Constant (Int 1))) |
- (LetCont |
- ((k0 (v2) |
- (LetCont |
- ((k1 () |
- (LetPrim (v3 (Constant (Int 42))) |
- (InvokeContinuation return (v3)))) |
- (k2 () |
- (InvokeContinuation return (v0)))) |
- (InvokeContinuation k1 ())))) |
- (LetPrim (v4 (Constant (Bool true))) |
- (InvokeContinuation k0 (v4))))))) |
-"""; |
- |
-// While loop. |
- |
-String CP9_IN = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetCont |
- ((rec k0 (v1) |
- (LetCont |
- ((k1 () |
- (InvokeContinuation return (v1))) |
- (k2 () |
- (LetPrim (v2 (Constant (Int 1))) |
- (LetCont |
- ((k3 (v3) |
- (LetCont |
- ((k4 (v4) |
- (LetCont |
- ((k5 () |
- (LetPrim (v5 (Constant (Int 42))) |
- (InvokeContinuation return (v5)))) |
- (k6 () |
- (LetPrim (v6 (Constant (Int 1))) |
- (LetCont |
- ((k7 (v7) |
- (InvokeContinuation rec k0 (v7)))) |
- (InvokeMethod v1 + (v6) k7))))) |
- (Branch (IsTrue v4) k5 k6)))) |
- (LetCont |
- ((k8 () |
- (LetPrim (v8 (Constant (Bool false))) |
- (InvokeContinuation k4 (v8)))) |
- (k9 () |
- (LetPrim (v9 (Constant (Bool true))) |
- (InvokeContinuation k4 (v9))))) |
- (Branch (IsTrue v3) k8 k9))))) |
- (InvokeMethod v1 == (v2) k3))))) |
- (LetPrim (v10 (Constant (Bool true))) |
- (Branch (IsTrue v10) k2 k1))))) |
- (InvokeContinuation k0 (v0))))) |
-"""; |
-String CP9_OUT = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 1))) |
- (LetCont |
- ((rec k0 (v1) |
- (LetCont |
- ((k1 () |
- (InvokeContinuation return (v1))) |
- (k2 () |
- (LetPrim (v2 (Constant (Int 1))) |
- (LetCont |
- ((k3 (v3) |
- (LetCont |
- ((k4 (v4) |
- (LetCont |
- ((k5 () |
- (LetPrim (v5 (Constant (Int 42))) |
- (InvokeContinuation return (v5)))) |
- (k6 () |
- (LetPrim (v6 (Constant (Int 1))) |
- (LetCont |
- ((k7 (v7) |
- (InvokeContinuation rec k0 (v7)))) |
- (InvokeMethod v1 + (v6) k7))))) |
- (Branch (IsTrue v4) k5 k6)))) |
- (LetCont |
- ((k8 () |
- (LetPrim (v8 (Constant (Bool false))) |
- (InvokeContinuation k4 (v8)))) |
- (k9 () |
- (LetPrim (v9 (Constant (Bool true))) |
- (InvokeContinuation k4 (v9))))) |
- (Branch (IsTrue v3) k8 k9))))) |
- (InvokeMethod v1 == (v2) k3))))) |
- (LetPrim (v10 (Constant (Bool true))) |
- (InvokeContinuation k2 ()))))) |
- (InvokeContinuation k0 (v0))))) |
-"""; |
- |
-// While loop, from: |
-// |
-// int main() { |
-// for (int i = 0; i < 2; i++) { |
-// print(42 + i); |
-// } |
-// } |
- |
-String CP10_IN = """ |
-(FunctionDefinition main () () return |
- (LetPrim (v0 (Constant (Int 0))) |
- (LetCont |
- ((rec k0 (v1) |
- (LetCont |
- ((k1 () |
- (LetPrim (v2 (Constant (Null))) |
- (InvokeContinuation return (v2)))) |
- (k2 () |
- (LetPrim (v3 (Constant (Int 42))) |
- (LetCont |
- ((k3 (v4) |
- (LetCont |
- ((k4 (v5) |
- (LetPrim (v6 (Constant (Int 1))) |
- (LetCont |
- ((k5 (v7) |
- (InvokeContinuation rec k0 (v7)))) |
- (InvokeMethod v1 + (v6) k5))))) |
- (InvokeStatic print (v4) k4)))) |
- (InvokeMethod v3 + (v1) k3))))) |
- (LetPrim (v8 (Constant (Int 2))) |
- (LetCont |
- ((k6 (v9) |
- (Branch (IsTrue v9) k2 k1))) |
- (InvokeMethod v1 < (v8) k6)))))) |
- (InvokeContinuation k0 (v0))))) |
-"""; |
-String CP10_OUT = CP10_IN; |
- |
-/// Normalizes whitespace by replacing all whitespace sequences by a single |
-/// space and trimming leading and trailing whitespace. |
-String normalizeSExpr(String input) { |
- return input.replaceAll(new RegExp(r'[ \n\t]+'), ' ').trim(); |
-} |
- |
-/// Parses the given input IR, runs an optimization pass over it, and compares |
-/// the stringification of the result against the expected output. |
-Future testConstantPropagator(String input, String expectedOutput) { |
- final compiler = new MockCompiler.internal( |
- emitJavaScript: false, |
- enableMinification: false); |
- return compiler.init().then((_) { |
- final unstringifier = new SExpressionUnstringifier(); |
- final stringifier = new SExpressionStringifier(); |
- final optimizer = new TypePropagator( |
- compiler.types, |
- DART_CONSTANT_SYSTEM, |
- new UnitTypeSystem(), |
- compiler.internalError); |
- |
- final f = unstringifier.unstringify(input); |
- optimizer.rewrite(f); |
- |
- String expected = normalizeSExpr(expectedOutput); |
- String actual = normalizeSExpr(stringifier.visit(f)); |
- |
- Expect.equals(expected, actual); |
- }); |
-} |
- |
-void main() { |
- asyncTest(() => testConstantPropagator(CP1_IN, CP1_OUT)); |
- asyncTest(() => testConstantPropagator(CP2_IN, CP2_OUT)); |
- asyncTest(() => testConstantPropagator(CP3_IN, CP3_OUT)); |
- asyncTest(() => testConstantPropagator(CP4_IN, CP4_OUT)); |
- asyncTest(() => testConstantPropagator(CP5_IN, CP5_OUT)); |
- asyncTest(() => testConstantPropagator(CP6_IN, CP6_OUT)); |
- asyncTest(() => testConstantPropagator(CP7_IN, CP7_OUT)); |
- asyncTest(() => testConstantPropagator(CP8_IN, CP8_OUT)); |
- asyncTest(() => testConstantPropagator(CP9_IN, CP9_OUT)); |
- asyncTest(() => testConstantPropagator(CP10_IN, CP10_OUT)); |
-} |