| // 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. | 
 | // | 
 | // This test checks that late constant folding passes don't violate | 
 | // representation requirements for uses of a definition that is being | 
 | // folded away. | 
 |  | 
 | // @dart = 2.9 | 
 |  | 
 | import 'dart:ffi'; | 
 |  | 
 | import 'package:expect/expect.dart'; | 
 | import 'package:ffi/ffi.dart'; | 
 |  | 
 | class X { | 
 |   int field; | 
 |   X(this.field); | 
 | } | 
 |  | 
 | @pragma('vm:never-inline') | 
 | int loadFrom(Pointer<Int32> p) { | 
 |   final x = X(0); | 
 |   x.field = 1; | 
 |   if ((x.field + 1) == 2) { | 
 |     x.field = 0; | 
 |   } | 
 |  | 
 |   // The code above tries to delay folding of x.field into a constant | 
 |   // until later passes. Inside p[...] there will be an unboxed Int64 | 
 |   // arithmetic used to compute an index which will get constant folded | 
 |   // as soon as x.field is constant folded. CP should insert unboxed constant | 
 |   // or an unbox of a constant as a result of constant folding. If it does | 
 |   // not - then we will get an incorrect graph where a tagged value is flowing | 
 |   // into a LoadIndexed instruction without a deopt-id. | 
 |   return p[x.field]; | 
 | } | 
 |  | 
 | void main() { | 
 |   final p = calloc<Int32>(128); | 
 |   p[0] = 42; | 
 |   Expect.equals(42, loadFrom(p)); | 
 |   calloc.free(p); | 
 | } |