Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / nomerge.ll
blob04e98124c2cad0f7109bbf330e6852240117e029
1 ; RUN: opt < %s -O1 -S | FileCheck %s
3 ; The attribute nomerge prevents the 3 bar() calls from being sunk/hoisted into
4 ; one inside a function. Check that there are still 3 tail calls.
6 ; Test case for preventing sinking
7 ; CHECK-LABEL: define void @sink
8 ; CHECK: if.then:
9 ; CHECK-NEXT: tail call void @bar()
10 ; CHECK: if.then2:
11 ; CHECK-NEXT: tail call void @bar()
12 ; CHECK: if.end3:
13 ; CHECK-NEXT: tail call void @bar()
14 define void @sink(i32 %i) {
15 entry:
16   switch i32 %i, label %if.end3 [
17     i32 5, label %if.then
18     i32 7, label %if.then2
19   ]
21 if.then:
22   tail call void @bar() #0
23   br label %if.end3
25 if.then2:
26   tail call void @bar() #0
27   br label %if.end3
29 if.end3:
30   tail call void @bar() #0
31   ret void
34 ; Test case for preventing hoisting
35 ; CHECK-LABEL: define void @hoist
36 ; CHECK: if.then:
37 ; CHECK-NEXT: tail call void @bar()
38 ; CHECK: if.then2:
39 ; CHECK-NEXT: tail call void @bar()
40 ; CHECK: if.end:
41 ; CHECK-NEXT: tail call void @bar()
42 define void @hoist(i32 %i) {
43 entry:
44   %i.addr = alloca i32, align 4
45   store i32 %i, ptr %i.addr, align 4
46   %0 = load i32, ptr %i.addr, align 4
47   %cmp = icmp eq i32 %0, 5
48   br i1 %cmp, label %if.then, label %if.else
50 if.then:
51   tail call void @bar() #1
52   unreachable
54 if.else:
55   %1 = load i32, ptr %i.addr, align 4
56   %cmp1 = icmp eq i32 %i, 7
57   br i1 %cmp1, label %if.then2, label %if.end
59 if.then2:
60   tail call void @bar() #1
61   unreachable
63 if.end:
64   tail call void @bar() #1
65   unreachable
68 declare void @bar()
70 attributes #0 = { nomerge }
71 attributes #1 = { noreturn nomerge }