blob: c7aa27c4ddbd004b79715e2bbb7c8b17f46b00df [file] [log] [blame]
// Copyright (c) 2024, 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.
// This test verifies fusing of (a & b) == 0 patterns.
import 'package:expect/expect.dart';
import 'package:vm/testing/il_matchers.dart';
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
String testValue0(int value) => (value & 1) == 0 ? "f" : "t";
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
String testValue1(int value) => (value & 3) == 0 ? "f" : "t";
final List<String Function(int)> tests = [
testValue0,
testValue1,
];
void main() {
for (var j = 0; j < tests.length; j++) {
Expect.equals("f", tests[j](0), "mismatch at input 0 test $j");
Expect.equals("f", tests[j](4), "mismatch at input 4 test $j");
Expect.equals("t", tests[j](1), "mismatch at input 1 test $j");
Expect.equals("t", tests[j](3), "mismatch at input 3 test $j");
}
}
void matchIL$testValue0(FlowGraph graph) {
if (!isX64 && !isArm64) {
return;
}
graph.match([
match.block('Graph', [
'int64(1)' << match.UnboxedConstant(value: 1),
]),
match.block('Function', [
'value' << match.Parameter(index: 0),
'unbox(value)' << match.UnboxInt64('value'),
match.Branch(match.TestInt('unbox(value)', 'int64(1)')),
])
]);
}
void matchIL$testValue1(FlowGraph graph) {
if (!isX64 && !isArm64) {
return;
}
graph.match([
match.block('Graph', [
'int64(3)' << match.UnboxedConstant(value: 3),
]),
match.block('Function', [
'value' << match.Parameter(index: 0),
'unbox(value)' << match.UnboxInt64('value'),
match.Branch(match.TestInt('unbox(value)', 'int64(3)')),
])
]);
}