| // Copyright (c) 2023, 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. | |
| /*member: and2v1:function(a, b) { | |
| return a && b; | |
| }*/ | |
| bool and2v1(bool a, bool b) => a && b; | |
| /*member: and2v2:function(a, b) { | |
| return a && b; | |
| }*/ | |
| bool and2v2(bool a, bool b) => a ? b : false; | |
| /*member: and2v3:function(a, b) { | |
| return a && b; | |
| }*/ | |
| bool and2v3(bool a, bool b) => a && b; | |
| /*member: or2v1:function(a, b) { | |
| return a || b; | |
| }*/ | |
| bool or2v1(bool a, bool b) => a || b; | |
| /*member: or2v3:function(a, b) { | |
| return a || b; | |
| }*/ | |
| bool or2v3(bool a, bool b) => !a ? b : true; | |
| /*member: and3:function(a, b, c) { | |
| return a && b && c; | |
| }*/ | |
| bool and3(bool a, bool b, bool c) => a && b && c; | |
| /*member: or3:function(a, b, c) { | |
| return a || b || c; | |
| }*/ | |
| bool or3(bool a, bool b, bool c) => a || b || c; | |
| /*member: range1:function(i) { | |
| if (0 <= i && i < 10) | |
| A.print(i); | |
| }*/ | |
| void range1(int i) { | |
| if (0 <= i && i < 10) print(i); | |
| } | |
| /*member: noopAnd:function(a, b, c) { | |
| return 100; | |
| }*/ | |
| int noopAnd(int a, int b, int c) { | |
| return (a < 10 && b < 10 && a == b && b == c && c == a) ? 100 : 100; | |
| } | |
| /*member: noopOr:function(a) { | |
| return 100; | |
| }*/ | |
| int noopOr(int a) { | |
| return (a == 1 || a == 3 || a == 5 || a == 7 || a == 9) ? 100 : 100; | |
| } | |
| /*member: constantFoldedControlFlow3:function(a) { | |
| return a; | |
| }*/ | |
| bool constantFoldedControlFlow3(bool a) { | |
| return a && 1 == 1 && 2 == 2; | |
| } | |
| /*member: constantFoldedControlFlow4:function(a) { | |
| return a; | |
| }*/ | |
| bool constantFoldedControlFlow4(bool a) { | |
| return 1 == 1 && a && 2 == 2; | |
| } | |
| // Problem cases. | |
| // | |
| // Move the following cases above this comment when the code quality improves. | |
| // | |
| // TODO(http://dartbug.com/29475): Cases with partially constant-folded | |
| // control-flow would benefit from an ability to delete parts of the CFG. | |
| // | |
| // TODO(http://dartbug.com/17027): `||` causes spurious negations. | |
| // `a || b` would be better. | |
| /*member: or2v2:function(a, b) { | |
| return a ? true : b; | |
| }*/ | |
| bool or2v2(bool a, bool b) => a ? true : b; | |
| // Fix the spurious negations. | |
| /*member: orGvn:function(a, b, c) { | |
| var t1 = !a; | |
| if (!t1 || b) | |
| A.print(1); | |
| if (!t1 || c) | |
| A.print(2); | |
| }*/ | |
| void orGvn(bool a, bool b, bool c) { | |
| if (a || b) print(1); | |
| if (a || c) print(2); | |
| } | |
| // This could be a lot better. codegen does a poor job of generating nested | |
| // control-flow expressions. | |
| /*member: range2:function(i) { | |
| var t1; | |
| if (!(64 <= i && i <= 90)) | |
| t1 = 97 <= i && i <= 122; | |
| else | |
| t1 = true; | |
| if (t1) | |
| A.print("letter"); | |
| }*/ | |
| void range2(int i) { | |
| if ((64 <= i && i <= 90) || (97 <= i && i <= 122)) print('letter'); | |
| } | |
| // This could be a lot better. codegen does a poor job of generating nested | |
| // control-flow expressions. | |
| /*member: range3:function(i, j) { | |
| var t1; | |
| if (i === 1 || i === 11) | |
| t1 = j === 1 || j === 11; | |
| else | |
| t1 = false; | |
| if (t1) | |
| A.print("yes"); | |
| }*/ | |
| void range3(int i, int j) { | |
| if ((i == 1 || i == 11) && (j == 1 || j == 11)) print('yes'); | |
| } | |
| /*member: constantFoldedControlFlow1:function(a, b) { | |
| var t1; | |
| if (a) | |
| t1 = b; | |
| else | |
| t1 = false; | |
| return t1; | |
| }*/ | |
| bool constantFoldedControlFlow1(bool a, bool b) { | |
| return a && 1 == 1 && b; | |
| } | |
| /*member: constantFoldedControlFlow2:function(a, b) { | |
| var t1 = false; | |
| if (a) | |
| t1 = b; | |
| return t1; | |
| }*/ | |
| bool constantFoldedControlFlow2(bool a, bool b) { | |
| return 1 == 1 && a && 2 == 2 && b && 3 == 3; | |
| } | |
| @pragma('dart2js:disable-inlining') | |
| /*member: main:ignore*/ | |
| main() { | |
| for (final v1 in [false, true]) { | |
| constantFoldedControlFlow3(v1); | |
| constantFoldedControlFlow4(v1); | |
| for (final v2 in [false, true]) { | |
| print(and2v1(v1, v2)); | |
| print(and2v2(v1, v2)); | |
| print(and2v3(v1, v2)); | |
| print(or2v1(v1, v2)); | |
| print(or2v2(v1, v2)); | |
| print(or2v3(v1, v2)); | |
| constantFoldedControlFlow1(v1, v2); | |
| constantFoldedControlFlow2(v1, v2); | |
| for (final v3 in [false, true]) { | |
| print(and3(v1, v2, v3)); | |
| print(or3(v1, v2, v3)); | |
| orGvn(v1, v2, v3); | |
| } | |
| } | |
| } | |
| for (int i = -100; i < 100; i++) { | |
| range1(i); | |
| range2(i); | |
| range3(i, i); | |
| noopAnd(i, 0 - i, i & 15); | |
| noopOr(i); | |
| } | |
| } |