Files
sdk/pkg/compiler/test/codegen/data_2/tdiv1.dart
T
Stephen Adams 08f90cad84 [dart2js] Use 'num(ber)' wherever possible instead of 'double'
JSDouble represents doubles that are not integers. It is usually wrong
to use JSDouble, so use JSNumber instead where we mean 'all double
values'.

This fixes #44818 by not mistakenly pretending that division cannot
have an integral result.

Will follow up with a CL to rename JSDouble.

Fixed: 44818
Change-Id: Ic324df2ee1f2c7434bc0b064c0dbd7b6800ad93b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/183360
Commit-Queue: Stephen Adams <sra@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
2021-02-08 22:06:54 +00:00

119 lines
3.5 KiB
Dart

// 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.member: foo1:function(param) {
return (H.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.member: foo2:function(param) {
return (H.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.member: foo3:function(param) {
return C.JSInt_methods._tdivFast$1(H.boolConversionCheck(param) ? 4294967295 : -1, 2);
}*/
/*prod.member: foo3:function(param) {
return C.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.member: foo4:function(param1, param2) {
return C.JSInt_methods.$tdiv(H.boolConversionCheck(param1) ? 4294967295 : 0, param2);
}*/
/*prod.member: foo4:function(param1, param2) {
return C.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.member: foo5:function(param1, param2) {
var a = H.boolConversionCheck(param1) ? 4294967295 : 0;
return C.JSInt_methods.$tdiv(a, H.boolConversionCheck(param2) ? 3 : 4);
}*/
/*prod.member: foo5:function(param1, param2) {
var a = param1 ? 4294967295 : 0;
return C.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.member: foo_regress_37502:function(param1, param2) {
var a = H.boolConversionCheck(param1) ? 1.2 : 12.3;
return C.JSInt_methods.gcd$1(C.JSNumber_methods.$tdiv(a, H.boolConversionCheck(param2) ? 3.14 : 2.81), 2);
}*/
/*prod.member: foo_regress_37502:function(param1, param2) {
var a = param1 ? 1.2 : 12.3;
return C.JSInt_methods.gcd$1(C.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'
}