// Copyright (c) 2018, 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.9

// Test canonicalization of integer shift operations.
// This is a regression test for dartbug.com/34288.

// VMOptions=--no_background_compilation --optimization_counter_threshold=10

import "package:expect/expect.dart";

int _shl_63(int x) => x << 63;
int _shl_64(int x) => x << 64;
int _shl_65(int x) => x << 65;
int _shl_m1(int x) => x << -1;

int _shr_63(int x) => x >> 63;
int _shr_64(int x) => x >> 64;
int _shr_65(int x) => x >> 65;
int _shr_m1(int x) => x >> -1;

// Non-constant values.
int one = 1;
int minusOne = -1;

doTests() {
  Expect.equals(0x8000000000000000, _shl_63(one));
  Expect.equals(0x8000000000000000, _shl_63(minusOne));
  Expect.equals(0, _shl_64(one));
  Expect.equals(0, _shl_64(minusOne));
  Expect.equals(0, _shl_65(one));
  Expect.equals(0, _shl_65(minusOne));

  Expect.throws<ArgumentError>(() {
    _shl_m1(one);
  });

  Expect.equals(0, _shr_63(one));
  Expect.equals(-1, _shr_63(minusOne));
  Expect.equals(0, _shr_64(one));
  Expect.equals(-1, _shr_64(minusOne));
  Expect.equals(0, _shr_65(one));
  Expect.equals(-1, _shr_65(minusOne));

  Expect.throws<ArgumentError>(() {
    _shr_m1(one);
  });
}

void main() {
  for (int i = 0; i < 20; ++i) {
    doTests();
  }
}
