// 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.

// Regression test for https://github.com/dart-lang/sdk/issues/51790.
// Verifies that compiler can recognize int operation in the inlined
// callee when operand is generic.

import 'package:expect/expect.dart';
import 'package:vm/testing/il_matchers.dart';

@pragma('vm:prefer-inline')
int add(int a, int b) => a + b;

@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
int sumAll(List<int> list) {
  int sum = 0;
  for (var e in list) {
    sum = add(sum, e);
  }
  return sum;
}

void main() {
  Expect.equals(6, sumAll(<int>[1, 2, 3]));
  Expect.equals(9, sumAll(<int>[4, 5]));
}

void matchIL$sumAll(FlowGraph graph) {
  graph.dump();
  graph.match([
    match.block('Graph'),
    match.block('Function', [
      'v2' << match.Parameter(index: 0),
      'v99' << match.LoadField('v2', slot: 'GrowableObjectArray.length'),
      if (!is32BitConfiguration) 'v120' << match.UnboxInt64('v99'),
      'v114' << match.LoadField('v2', slot: 'GrowableObjectArray.data'),
      match.Goto('B16'),
    ]),
    'B16' <<
        match.block('Join', [
          'v5' << match.Phi(match.any, 'v28'),
          'v130' << match.Phi(match.any, 'v45'),
          match.CheckStackOverflow(),
          if (is32BitConfiguration)
            // Not moved out of the loop due to the current pass
            // ordering (LICM is performed before RangeAnalysis).
            'v120' << match.UnboxInt32('v99'),
          match.Branch(match.RelationalOp('v130', 'v120', kind: '>='),
              ifTrue: 'B4', ifFalse: 'B3'),
        ]),
    'B4' <<
        match.block('Target', [
          match.DartReturn('v5'),
        ]),
    'B3' <<
        match.block('Target', [
          'v135' << match.LoadIndexed('v114', match.any),
          if (is32BitConfiguration)
            'v45' << match.BinaryInt32Op('v130', match.any)
          else
            'v45' << match.BinaryInt64Op('v130', match.any),
          'v125' << match.UnboxInt64('v135'),
          'v28' << match.BinaryInt64Op('v5', 'v125'),
          match.Goto('B16'),
        ]),
  ]);
}
