llvm/clang/test/CodeGenCXX/debug-info-line-if.cpp
Atmn Patel ac73b73c16 [clang] Add mustprogress and llvm.loop.mustprogress attribute deduction
Since C++11, the C++ standard has a forward progress guarantee
[intro.progress], so all such functions must have the `mustprogress`
requirement. In addition, from C11 and onwards, loops without a non-zero
constant conditional or no conditional are also required to make
progress (C11 6.8.5p6). This patch implements these attribute deductions
so they can be used by the optimization passes.

Differential Revision: https://reviews.llvm.org/D86841
2020-11-04 22:03:14 -05:00

72 lines
2.4 KiB
C++

// RUN: %clang_cc1 -debug-info-kind=limited -gno-column-info -std=c++11 -S -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s
// PR19864
extern int v[2];
int a = 0, b = 0;
int main() {
#line 100
for (int x : v)
if (x)
++b; // CHECK: add nsw{{.*}}, 1
else
++a; // CHECK: add nsw{{.*}}, 1
// The continuation block if the if statement should not share the
// location of the ++a statement. The branch back to the start of the loop
// should be attributed to the loop header line.
// CHECK: br label
// CHECK: br label
// CHECK: br label {{.*}}, !dbg [[DBG1:![0-9]*]], !llvm.loop [[L1:![0-9]*]]
#line 200
while (a)
if (b)
++b; // CHECK: add nsw{{.*}}, 1
else
++a; // CHECK: add nsw{{.*}}, 1
// CHECK: br label
// CHECK: br label {{.*}}, !dbg [[DBG2:![0-9]*]], !llvm.loop [[L2:![0-9]*]]
#line 300
for (; a; )
if (b)
++b; // CHECK: add nsw{{.*}}, 1
else
++a; // CHECK: add nsw{{.*}}, 1
// CHECK: br label
// CHECK: br label {{.*}}, !dbg [[DBG3:![0-9]*]], !llvm.loop [[L3:![0-9]*]]
#line 400
int x[] = {1, 2};
for (int y : x)
if (b)
++b; // CHECK: add nsw{{.*}}, 1
else
++a; // CHECK: add nsw{{.*}}, 1
// CHECK: br label
// CHECK: br label {{.*}}, !dbg [[DBG4:![0-9]*]], !llvm.loop [[L4:![0-9]*]]
// CHECK-DAG: [[DBG1]] = !DILocation(line: 100, scope: !{{.*}})
// CHECK-DAG: [[DBG2]] = !DILocation(line: 200, scope: !{{.*}})
// CHECK-DAG: [[DBG3]] = !DILocation(line: 300, scope: !{{.*}})
// CHECK-DAG: [[DBG4]] = !DILocation(line: 401, scope: !{{.*}})
// CHECK-DAG: [[L1]] = distinct !{[[L1]], [[SLDBG1:![0-9]*]], [[ELDBG1:![0-9]*]]}
// CHECK-DAG: [[SLDBG1]] = !DILocation(line: 100, scope: !{{.*}})
// CHECK-DAG: [[ELDBG1]] = !DILocation(line: 104, scope: !{{.*}})
// CHECK-DAG: [[L2]] = distinct !{[[L2]], [[SLDBG2:![0-9]*]], [[ELDBG2:![0-9]*]], [[MP:![0-9]+]]}
// CHECK-DAG: [[SLDBG2]] = !DILocation(line: 200, scope: !{{.*}})
// CHECK-DAG: [[ELDBG2]] = !DILocation(line: 204, scope: !{{.*}})
// CHECK-DAG: [[L3]] = distinct !{[[L3]], [[SLDBG3:![0-9]*]], [[ELDBG3:![0-9]*]], [[MP]]}
// CHECK-DAG: [[SLDBG3]] = !DILocation(line: 300, scope: !{{.*}})
// CHECK-DAG: [[ELDBG3]] = !DILocation(line: 304, scope: !{{.*}})
// CHECK-DAG: [[L4]] = distinct !{[[L4]], [[SLDBG4:![0-9]*]], [[ELDBG4:![0-9]*]]}
// CHECK-DAG: [[SLDBG4]] = !DILocation(line: 401, scope: !{{.*}})
// CHECK-DAG: [[ELDBG4]] = !DILocation(line: 405, scope: !{{.*}})
}