145a40c16SStephen Tozer // RUN: %clang++ -std=gnu++11 -O2 -g %s -o %t
21364750dSJames Henderson // RUN: %dexter --fail-lt 1.0 -w \
345a40c16SStephen Tozer // RUN:     --binary %t --debugger 'lldb' -v -- %s
445a40c16SStephen Tozer // RUN: %clang++ -std=gnu++11 -O0 -g %s -o %t
51364750dSJames Henderson // RUN: %dexter --fail-lt 1.0 -w \
645a40c16SStephen Tozer // RUN:     --binary %t --debugger 'lldb' -- %s
71364750dSJames Henderson 
81364750dSJames Henderson // REQUIRES: lldb
9*43d70e46SStephen Tozer // Currently getting intermittent failures on darwin.
10*43d70e46SStephen Tozer // UNSUPPORTED: system-windows, system-darwin
111364750dSJames Henderson 
121364750dSJames Henderson //// Check that the debugging experience with __attribute__((optnone)) at O2
131364750dSJames Henderson //// matches O0. Test simple template functions performing simple arithmetic
141364750dSJames Henderson //// vector operations and trivial loops.
151364750dSJames Henderson 
161364750dSJames Henderson typedef int int4 __attribute__((ext_vector_type(4)));
171364750dSJames Henderson template<typename T> struct TypeTraits {};
181364750dSJames Henderson 
191364750dSJames Henderson template<>
201364750dSJames Henderson struct TypeTraits<int4> {
211364750dSJames Henderson   static const unsigned NumElements = 4;
221364750dSJames Henderson   static const unsigned UnusedField = 0xDEADBEEFU;
231364750dSJames Henderson   static unsigned MysteryNumber;
241364750dSJames Henderson };
251364750dSJames Henderson unsigned TypeTraits<int4>::MysteryNumber = 3U;
261364750dSJames Henderson 
271364750dSJames Henderson template<typename T>
281364750dSJames Henderson __attribute__((optnone))
test1(T x,T y)291364750dSJames Henderson T test1(T x, T y) {
301364750dSJames Henderson   T tmp = x + y; // DexLabel('break_0')
311364750dSJames Henderson   T tmp2 = tmp + y;
321364750dSJames Henderson   return tmp; // DexLabel('break_1')
331364750dSJames Henderson }
341364750dSJames Henderson // DexLimitSteps('1', '1', from_line=ref('break_0'), to_line=ref('break_1'))
351364750dSJames Henderson //// FIXME: gdb can print this but lldb cannot. Perhaps PR42920?
361364750dSJames Henderson //     \DexExpectWatchValue('TypeTraits<int __attribute__((ext_vector_type(4)))>::NumElements', 4, on_line=ref('break_0'))
371364750dSJames Henderson //     \DexExpectWatchValue('TypeTraits<int __attribute__((ext_vector_type(4)))>::UnusedField', 0xdeadbeef, on_line=ref('break_0'))
381364750dSJames Henderson //   DexExpectWatchValue('x[0]', 1, on_line=ref('break_0'))
391364750dSJames Henderson //   DexExpectWatchValue('x[1]', 2, on_line=ref('break_0'))
401364750dSJames Henderson //   DexExpectWatchValue('x[2]', 3, on_line=ref('break_0'))
411364750dSJames Henderson //   DexExpectWatchValue('x[3]', 4, on_line=ref('break_0'))
421364750dSJames Henderson //   DexExpectWatchValue('y[0]', 5, on_line=ref('break_0'))
431364750dSJames Henderson //   DexExpectWatchValue('y[1]', 6, on_line=ref('break_0'))
441364750dSJames Henderson //   DexExpectWatchValue('y[2]', 7, on_line=ref('break_0'))
451364750dSJames Henderson //   DexExpectWatchValue('y[3]', 8, on_line=ref('break_0'))
461364750dSJames Henderson //   DexExpectWatchValue('tmp[0]', 6, on_line=ref('break_1'))
471364750dSJames Henderson //   DexExpectWatchValue('tmp[1]', 8, on_line=ref('break_1'))
481364750dSJames Henderson //   DexExpectWatchValue('tmp[2]', 10, on_line=ref('break_1'))
491364750dSJames Henderson //   DexExpectWatchValue('tmp[3]', 12, on_line=ref('break_1'))
501364750dSJames Henderson //   DexExpectWatchValue('tmp2[0]', 11, on_line=ref('break_1'))
511364750dSJames Henderson //   DexExpectWatchValue('tmp2[1]', 14, on_line=ref('break_1'))
521364750dSJames Henderson //   DexExpectWatchValue('tmp2[2]', 17, on_line=ref('break_1'))
531364750dSJames Henderson //   DexExpectWatchValue('tmp2[3]', 20, on_line=ref('break_1'))
541364750dSJames Henderson 
551364750dSJames Henderson template<typename T>
561364750dSJames Henderson __attribute__((optnone))
test2(T x,T y)571364750dSJames Henderson T test2(T x, T y) {
581364750dSJames Henderson   T tmp = x;
591364750dSJames Henderson   int break_2 = 0; // DexLabel('break_2')
601364750dSJames Henderson   for (unsigned i = 0; i != TypeTraits<T>::NumElements; ++i) {
611364750dSJames Henderson     tmp <<= 1; // DexLabel('break_3')
621364750dSJames Henderson     tmp |= y;
631364750dSJames Henderson   }
641364750dSJames Henderson 
651364750dSJames Henderson   tmp[0] >>= TypeTraits<T>::MysteryNumber;
661364750dSJames Henderson   return tmp; // DexLabel('break_5')
671364750dSJames Henderson }
681364750dSJames Henderson // DexLimitSteps('1', '1', on_line=ref('break_2'))
691364750dSJames Henderson //   DexExpectWatchValue('x[0]', 6, on_line=ref('break_2'))
701364750dSJames Henderson //   DexExpectWatchValue('x[1]', 8, on_line=ref('break_2'))
711364750dSJames Henderson //   DexExpectWatchValue('x[2]', 10, on_line=ref('break_2'))
721364750dSJames Henderson //   DexExpectWatchValue('x[3]', 12, on_line=ref('break_2'))
731364750dSJames Henderson //   DexExpectWatchValue('y[0]', 5, on_line=ref('break_2'))
741364750dSJames Henderson //   DexExpectWatchValue('y[1]', 6, on_line=ref('break_2'))
751364750dSJames Henderson //   DexExpectWatchValue('y[2]', 7, on_line=ref('break_2'))
761364750dSJames Henderson //   DexExpectWatchValue('y[3]', 8, on_line=ref('break_2'))
771364750dSJames Henderson //   DexExpectWatchValue('tmp[0]', 6, on_line=ref('break_2'))
781364750dSJames Henderson //   DexExpectWatchValue('tmp[1]', 8, on_line=ref('break_2'))
791364750dSJames Henderson //   DexExpectWatchValue('tmp[2]', 10, on_line=ref('break_2'))
801364750dSJames Henderson //   DexExpectWatchValue('tmp[3]', 12, on_line=ref('break_2'))
8145a40c16SStephen Tozer // DexLimitSteps('i', 3, from_line=ref('break_3'), to_line=ref('break_5'))
821364750dSJames Henderson //   DexExpectWatchValue('tmp[0]', 63, on_line=ref('break_3'))
831364750dSJames Henderson //   DexExpectWatchValue('tmp[1]', 94, on_line=ref('break_3'))
841364750dSJames Henderson //   DexExpectWatchValue('tmp[2]', 95, on_line=ref('break_3'))
851364750dSJames Henderson //   DexExpectWatchValue('tmp[3]', 120, on_line=ref('break_3'))
861364750dSJames Henderson //   DexExpectWatchValue('tmp[0]', 15, on_line=ref('break_5'))
871364750dSJames Henderson 
881364750dSJames Henderson template<typename T>
891364750dSJames Henderson __attribute__((optnone))
test3(T InVec)901364750dSJames Henderson T test3(T InVec) {
911364750dSJames Henderson   T result;
921364750dSJames Henderson   for (unsigned i=0; i != TypeTraits<T>::NumElements; ++i)
931364750dSJames Henderson     result[i] = InVec[i]; // DexLabel('break_6')
941364750dSJames Henderson   return result; // DexLabel('break_7')
951364750dSJames Henderson }
961364750dSJames Henderson // DexLimitSteps('i', '3', from_line=ref('break_6'), to_line=ref('break_7'))
971364750dSJames Henderson //   DexExpectWatchValue('InVec[0]', 15, from_line=ref('break_6'), to_line=ref('break_7'))
981364750dSJames Henderson //   DexExpectWatchValue('InVec[1]', 190, from_line=ref('break_6'), to_line=ref('break_7'))
991364750dSJames Henderson //   DexExpectWatchValue('InVec[2]', 191, from_line=ref('break_6'), to_line=ref('break_7'))
1001364750dSJames Henderson //   DexExpectWatchValue('InVec[3]', 248, from_line=ref('break_6'), to_line=ref('break_7'))
1011364750dSJames Henderson //   DexExpectWatchValue('result[0]', 15, from_line=ref('break_6'), to_line=ref('break_7'))
1021364750dSJames Henderson //   DexExpectWatchValue('result[1]', 190, from_line=ref('break_6'), to_line=ref('break_7'))
1031364750dSJames Henderson //   DexExpectWatchValue('result[2]', 191, from_line=ref('break_6'), to_line=ref('break_7'))
1041364750dSJames Henderson //   DexExpectWatchValue('result[3]', 248, on_line=ref('break_7'))
1051364750dSJames Henderson 
1061364750dSJames Henderson template<typename T>
1071364750dSJames Henderson __attribute__((optnone))
test4(T x,T y)1081364750dSJames Henderson T test4(T x, T y) {
1091364750dSJames Henderson   for (unsigned i=0; i != TypeTraits<T>::NumElements; ++i)
1101364750dSJames Henderson     x[i] = (x[i] > y[i])? x[i] : y[i] + TypeTraits<T>::MysteryNumber; // DexLabel('break_11')
1111364750dSJames Henderson   return x; // DexLabel('break_12')
1121364750dSJames Henderson }
1131364750dSJames Henderson // DexLimitSteps('1', '1', from_line=ref('break_11'), to_line=ref('break_12'))
1141364750dSJames Henderson //// FIXME: lldb won't print this but gdb unexpectedly says it's optimized out, even at O0.
1151364750dSJames Henderson //     \DexExpectWatchValue('TypeTraits<int __attribute__((ext_vector_type(4)))>::MysteryNumber', 3, on_line=ref('break_11'))
1161364750dSJames Henderson //   DexExpectWatchValue('i', 0, 1, 2, 3, on_line=ref('break_11'))
1171364750dSJames Henderson //   DexExpectWatchValue('x[0]', 1, 8, from_line=ref('break_11'), to_line=ref('break_12'))
1181364750dSJames Henderson //   DexExpectWatchValue('x[1]', 2, 9, from_line=ref('break_11'), to_line=ref('break_12'))
1191364750dSJames Henderson //   DexExpectWatchValue('x[2]', 3, 10, from_line=ref('break_11'), to_line=ref('break_12'))
1201364750dSJames Henderson //   DexExpectWatchValue('x[3]', 4, 11, from_line=ref('break_11'), to_line=ref('break_12'))
1211364750dSJames Henderson //   DexExpectWatchValue('y[0]', 5, from_line=ref('break_11'), to_line=ref('break_12'))
1221364750dSJames Henderson //   DexExpectWatchValue('y[1]', 6, from_line=ref('break_11'), to_line=ref('break_12'))
1231364750dSJames Henderson //   DexExpectWatchValue('y[2]', 7, from_line=ref('break_11'), to_line=ref('break_12'))
1241364750dSJames Henderson //   DexExpectWatchValue('y[3]', 8, from_line=ref('break_11'), to_line=ref('break_12'))
1251364750dSJames Henderson 
main()1261364750dSJames Henderson int main() {
1271364750dSJames Henderson   int4 a = (int4){1,2,3,4};
1281364750dSJames Henderson   int4 b = (int4){5,6,7,8};
1291364750dSJames Henderson 
1301364750dSJames Henderson   int4 tmp = test1(a,b);
1311364750dSJames Henderson   tmp = test2(tmp,b);
1321364750dSJames Henderson   tmp = test3(tmp);
1331364750dSJames Henderson   tmp += test4(a,b);
1341364750dSJames Henderson   return tmp[0];
1351364750dSJames Henderson }
136