xref: /llvm-project/llvm/test/Transforms/StructurizeCFG/infinite-loop.ll (revision bf6f82a9df6a1693a5399039dcadd7fc00dab65e)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -o - -structurizecfg -verify-dom-info < %s | FileCheck %s
3
4; This test hits a limitation in StructurizeCFG: it doesn't handle infinite-loops.
5; In this case, the IR remains unchanged.
6
7define void @infinite_loop_false(ptr addrspace(1) %out, i1 %cond) {
8; CHECK-LABEL: @infinite_loop_false(
9; CHECK-NEXT:  entry:
10; CHECK-NEXT:    br i1 [[COND:%.*]], label [[FOR_END:%.*]], label [[FOR_BODY:%.*]]
11; CHECK:       for.body:
12; CHECK-NEXT:    store volatile i32 999, ptr addrspace(1) [[OUT:%.*]], align 4
13; CHECK-NEXT:    br label [[FOR_BODY]]
14; CHECK:       for.end:
15; CHECK-NEXT:    ret void
16;
17entry:
18  br i1 %cond, label %for.end, label %for.body
19
20for.body:
21  store volatile i32 999, ptr addrspace(1) %out, align 4
22  br label %for.body
23
24for.end:
25  ret void
26}
27
28define void @infinite_loop_on_branch(ptr addrspace(1) %out, i1 %cond) {
29; CHECK-LABEL: @infinite_loop_on_branch(
30; CHECK-NEXT:  entry:
31; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
32; CHECK:       if.then:
33; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
34; CHECK:       for.body:
35; CHECK-NEXT:    store volatile i32 999, ptr addrspace(1) [[OUT:%.*]], align 4
36; CHECK-NEXT:    br label [[FOR_BODY]]
37; CHECK:       if.else:
38; CHECK-NEXT:    store volatile i32 111, ptr addrspace(1) [[OUT]], align 4
39; CHECK-NEXT:    br label [[EXIT:%.*]]
40; CHECK:       exit:
41; CHECK-NEXT:    ret void
42;
43entry:
44  br i1 %cond, label %if.then, label %if.else
45
46if.then:
47  br label %for.body
48
49for.body:
50  store volatile i32 999, ptr addrspace(1) %out, align 4
51  br label %for.body
52
53if.else:
54  store volatile i32 111, ptr addrspace(1) %out, align 4
55  br label %exit
56
57exit:
58  ret void
59}
60