blob: 27d6c650687a124cfb32a3ff696041474b1acfc6 [file] [log] [blame]
// Copyright (c) 2020, 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.
// @dart = 2.7
/*member: main:ignore*/
void main() {
for (var a in [false, true]) {
sink = foo1(a);
sink = foo2(a);
sink = foo3(a);
sink = foo4(a, 2);
sink = foo4(a, 10);
for (var b in [false, true]) {
sink = foo5(a, b);
sink = foo_regress_37502(a, b);
}
}
}
Object sink;
@pragma('dart2js:noInline')
/*spec|canary.member: foo1:function(param) {
return (A.boolConversionCheck(param) ? 4294967295 : 1) / 2 | 0;
}*/
/*prod.member: foo1:function(param) {
return (param ? 4294967295 : 1) / 2 | 0;
}*/
int foo1(bool param) {
var a = param ? 0xFFFFFFFF : 1;
return a ~/ 2;
// Above can be compiled to division followed by truncate.
// present: ' / 2 | 0'
}
@pragma('dart2js:noInline')
/*spec|canary.member: foo2:function(param) {
return (A.boolConversionCheck(param) ? 4294967295 : 1) / 3 | 0;
}*/
/*prod.member: foo2:function(param) {
return (param ? 4294967295 : 1) / 3 | 0;
}*/
int foo2(bool param) {
var a = param ? 0xFFFFFFFF : 1;
return a ~/ 3;
// Above can be compiled to division followed by truncate.
// present: ' / 3 | 0'
}
@pragma('dart2js:noInline')
/*spec|canary.member: foo3:function(param) {
return B.JSInt_methods._tdivFast$1(A.boolConversionCheck(param) ? 4294967295 : -1, 2);
}*/
/*prod.member: foo3:function(param) {
return B.JSInt_methods._tdivFast$1(param ? 4294967295 : -1, 2);
}*/
int foo3(bool param) {
var a = param ? 0xFFFFFFFF : -1;
return a ~/ 2;
// Potentially negative inputs go via '_tdivFast' fast helper.
// present: '_tdivFast'
}
@pragma('dart2js:noInline')
/*spec|canary.member: foo4:function(param1, param2) {
return B.JSInt_methods.$tdiv(A.boolConversionCheck(param1) ? 4294967295 : 0, param2);
}*/
/*prod.member: foo4:function(param1, param2) {
return B.JSInt_methods.$tdiv(param1 ? 4294967295 : 0, param2);
}*/
int foo4(bool param1, int param2) {
var a = param1 ? 0xFFFFFFFF : 0;
return a ~/ param2;
// Unknown divisor goes via full implementation.
// present: '$tdiv'
// absent: '/'
}
@pragma('dart2js:noInline')
/*spec|canary.member: foo5:function(param1, param2) {
var a = A.boolConversionCheck(param1) ? 4294967295 : 0;
return B.JSInt_methods.$tdiv(a, A.boolConversionCheck(param2) ? 3 : 4);
}*/
/*prod.member: foo5:function(param1, param2) {
var a = param1 ? 4294967295 : 0;
return B.JSInt_methods.$tdiv(a, param2 ? 3 : 4);
}*/
int foo5(bool param1, bool param2) {
var a = param1 ? 0xFFFFFFFF : 0;
var b = param2 ? 3 : 4;
return a ~/ b;
// We could optimize this with range analysis, but type inference summarizes
// '3 or 4' to uint31, which is not >= 2.
// present: '$tdiv'
// absent: '/'
}
@pragma('dart2js:noInline')
/*spec|canary.member: foo_regress_37502:function(param1, param2) {
var a = A.boolConversionCheck(param1) ? 1.2 : 12.3;
return B.JSInt_methods.gcd$1(B.JSNumber_methods.$tdiv(a, A.boolConversionCheck(param2) ? 3.14 : 2.81), 2);
}*/
/*prod.member: foo_regress_37502:function(param1, param2) {
var a = param1 ? 1.2 : 12.3;
return B.JSInt_methods.gcd$1(B.JSNumber_methods.$tdiv(a, param2 ? 3.14 : 2.81), 2);
}*/
foo_regress_37502(param1, param2) {
var a = param1 ? 1.2 : 12.3;
var b = param2 ? 3.14 : 2.81;
return (a ~/ b).gcd(2);
// The result of ~/ is int; gcd is defined only on int and is too complex
// to be inlined.
//
// present: 'JSInt_methods.gcd'
}