// RUN: %dexter --fail-lt 1.0 -w \
// RUN:     --builder 'clang' --debugger 'lldb' \
// RUN:     --cflags "-g -O2" -v -- %s
// RUN: %dexter --fail-lt 1.0 -w \
// RUN:     --builder 'clang' --debugger 'lldb' \
// RUN:     --cflags "-g -O0" -- %s

// REQUIRES: lldb
// UNSUPPORTED: system-windows

//// Check that the debugging experience with __attribute__((optnone)) at O2
//// matches O0. Test simple template functions performing simple arithmetic
//// vector operations and trivial loops.

typedef int int4 __attribute__((ext_vector_type(4)));
template<typename T> struct TypeTraits {};

template<>
struct TypeTraits<int4> {
  static const unsigned NumElements = 4;
  static const unsigned UnusedField = 0xDEADBEEFU;
  static unsigned MysteryNumber;
};
unsigned TypeTraits<int4>::MysteryNumber = 3U;

template<typename T>
__attribute__((optnone))
T test1(T x, T y) {
  T tmp = x + y; // DexLabel('break_0')
  T tmp2 = tmp + y;
  return tmp; // DexLabel('break_1')
}
// DexLimitSteps('1', '1', from_line='break_0', to_line='break_1')
//// FIXME: gdb can print this but lldb cannot. Perhaps PR42920?
//     \DexExpectWatchValue('TypeTraits<int __attribute__((ext_vector_type(4)))>::NumElements', 4, on_line='break_0')
//     \DexExpectWatchValue('TypeTraits<int __attribute__((ext_vector_type(4)))>::UnusedField', 0xdeadbeef, on_line='break_0')
//   DexExpectWatchValue('x[0]', 1, on_line='break_0')
//   DexExpectWatchValue('x[1]', 2, on_line='break_0')
//   DexExpectWatchValue('x[2]', 3, on_line='break_0')
//   DexExpectWatchValue('x[3]', 4, on_line='break_0')
//   DexExpectWatchValue('y[0]', 5, on_line='break_0')
//   DexExpectWatchValue('y[1]', 6, on_line='break_0')
//   DexExpectWatchValue('y[2]', 7, on_line='break_0')
//   DexExpectWatchValue('y[3]', 8, on_line='break_0')
//   DexExpectWatchValue('tmp[0]', 6, on_line='break_1')
//   DexExpectWatchValue('tmp[1]', 8, on_line='break_1')
//   DexExpectWatchValue('tmp[2]', 10, on_line='break_1')
//   DexExpectWatchValue('tmp[3]', 12, on_line='break_1')
//   DexExpectWatchValue('tmp2[0]', 11, on_line='break_1')
//   DexExpectWatchValue('tmp2[1]', 14, on_line='break_1')
//   DexExpectWatchValue('tmp2[2]', 17, on_line='break_1')
//   DexExpectWatchValue('tmp2[3]', 20, on_line='break_1')

template<typename T>
__attribute__((optnone))
T test2(T x, T y) {
  T tmp = x;
  int break_2 = 0; // DexLabel('break_2')
  for (unsigned i = 0; i != TypeTraits<T>::NumElements; ++i) {
    tmp <<= 1; // DexLabel('break_3')
    tmp |= y;
  }

  tmp[0] >>= TypeTraits<T>::MysteryNumber;
  return tmp; // DexLabel('break_5')
}
// DexLimitSteps('1', '1', on_line='break_2')
//   DexExpectWatchValue('x[0]', 6, on_line='break_2')
//   DexExpectWatchValue('x[1]', 8, on_line='break_2')
//   DexExpectWatchValue('x[2]', 10, on_line='break_2')
//   DexExpectWatchValue('x[3]', 12, on_line='break_2')
//   DexExpectWatchValue('y[0]', 5, on_line='break_2')
//   DexExpectWatchValue('y[1]', 6, on_line='break_2')
//   DexExpectWatchValue('y[2]', 7, on_line='break_2')
//   DexExpectWatchValue('y[3]', 8, on_line='break_2')
//   DexExpectWatchValue('tmp[0]', 6, on_line='break_2')
//   DexExpectWatchValue('tmp[1]', 8, on_line='break_2')
//   DexExpectWatchValue('tmp[2]', 10, on_line='break_2')
//   DexExpectWatchValue('tmp[3]', 12, on_line='break_2')
// DexLimitSteps('i', 3, on_line='break_3')
//   DexExpectWatchValue('tmp[0]', 63, on_line='break_3')
//   DexExpectWatchValue('tmp[1]', 94, on_line='break_3')
//   DexExpectWatchValue('tmp[2]', 95, on_line='break_3')
//   DexExpectWatchValue('tmp[3]', 120, on_line='break_3')
// DexLimitSteps('i', 3, on_line='break_5')
//   DexExpectWatchValue('tmp[0]', 15, on_line='break_5')

template<typename T>
__attribute__((optnone))
T test3(T InVec) {
  T result;
  for (unsigned i=0; i != TypeTraits<T>::NumElements; ++i)
    result[i] = InVec[i]; // DexLabel('break_6')
  return result; // DexLabel('break_7')
}
// DexLimitSteps('i', '3', from_line='break_6', to_line='break_7')
//   DexExpectWatchValue('InVec[0]', 15, from_line='break_6', to_line='break_7')
//   DexExpectWatchValue('InVec[1]', 190, from_line='break_6', to_line='break_7')
//   DexExpectWatchValue('InVec[2]', 191, from_line='break_6', to_line='break_7')
//   DexExpectWatchValue('InVec[3]', 248, from_line='break_6', to_line='break_7')
//   DexExpectWatchValue('result[0]', 15, from_line='break_6', to_line='break_7')
//   DexExpectWatchValue('result[1]', 190, from_line='break_6', to_line='break_7')
//   DexExpectWatchValue('result[2]', 191, from_line='break_6', to_line='break_7')
//   DexExpectWatchValue('result[3]', 248, on_line='break_7')

template<typename T>
__attribute__((optnone))
T test4(T x, T y) {
  for (unsigned i=0; i != TypeTraits<T>::NumElements; ++i)
    x[i] = (x[i] > y[i])? x[i] : y[i] + TypeTraits<T>::MysteryNumber; // DexLabel('break_11')
  return x; // DexLabel('break_12')
}
// DexLimitSteps('1', '1', from_line='break_11', to_line='break_12')
//// FIXME: lldb won't print this but gdb unexpectedly says it's optimized out, even at O0.
//     \DexExpectWatchValue('TypeTraits<int __attribute__((ext_vector_type(4)))>::MysteryNumber', 3, on_line='break_11')
//   DexExpectWatchValue('i', 0, 1, 2, 3, on_line='break_11')
//   DexExpectWatchValue('x[0]', 1, 8, from_line='break_11', to_line='break_12')
//   DexExpectWatchValue('x[1]', 2, 9, from_line='break_11', to_line='break_12')
//   DexExpectWatchValue('x[2]', 3, 10, from_line='break_11', to_line='break_12')
//   DexExpectWatchValue('x[3]', 4, 11, from_line='break_11', to_line='break_12')
//   DexExpectWatchValue('y[0]', 5, from_line='break_11', to_line='break_12')
//   DexExpectWatchValue('y[1]', 6, from_line='break_11', to_line='break_12')
//   DexExpectWatchValue('y[2]', 7, from_line='break_11', to_line='break_12')
//   DexExpectWatchValue('y[3]', 8, from_line='break_11', to_line='break_12')

int main() {
  int4 a = (int4){1,2,3,4};
  int4 b = (int4){5,6,7,8};

  int4 tmp = test1(a,b);
  tmp = test2(tmp,b);
  tmp = test3(tmp);
  tmp += test4(a,b);
  return tmp[0];
}
