blob: 9e315ec8320191bbfdb9c132622175674a5046e0 [file] [log] [blame]
// 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);
}
}