Follow up to d0858bffa11, add missing REQUIRES x86
[llvm-project.git] / llvm / test / Transforms / HotColdSplit / lifetime-markers-on-inputs-2.ll
blob8d99c80546ad9e500c3a4725fd14a8328132c41a
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -passes=hotcoldsplit -hotcoldsplit-threshold=0 < %s 2>&1 | FileCheck %s
4 declare void @llvm.lifetime.start.p0(i64, ptr nocapture)
6 declare void @llvm.lifetime.end.p0(i64, ptr nocapture)
8 declare void @cold_use(ptr) cold
10 declare void @use(ptr)
12 ; In this CFG, splitting will extract the blocks extract{1,2}. I.e., it will
13 ; extract a lifetime.start marker, but not the corresponding lifetime.end
14 ; marker. Make sure that a lifetime.start marker is emitted before the call to
15 ; the split function, and *only* that marker.
17 ;            entry
18 ;          /       \
19 ;      extract1  no-extract1
20 ;     (lt.start)    |
21 ;    /              |
22 ; extract2          |
23 ;    \_____         |
24 ;          \      /
25 ;            exit
26 ;          (lt.end)
28 ; After splitting, we should see:
30 ;            entry
31 ;          /       \
32 ;      codeRepl  no-extract1
33 ;     (lt.start)   |
34 ;          \      /
35 ;            exit
36 ;          (lt.end)
37 define void @only_lifetime_start_is_cold() {
38 ; CHECK-LABEL: @only_lifetime_start_is_cold(
39 ; CHECK-NEXT:  entry:
40 ; CHECK-NEXT:    [[LOCAL1:%.*]] = alloca i256
41 ; CHECK-NEXT:    br i1 undef, label [[CODEREPL:%.*]], label [[NO_EXTRACT1:%.*]]
42 ; CHECK:       codeRepl:
43 ; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[LOCAL1]])
44 ; CHECK-NEXT:    [[TARGETBLOCK:%.*]] = call i1 @only_lifetime_start_is_cold.cold.1(ptr [[LOCAL1]]) #3
45 ; CHECK-NEXT:    br i1 [[TARGETBLOCK]], label [[NO_EXTRACT1]], label [[EXIT:%.*]]
46 ; CHECK:       no-extract1:
47 ; CHECK-NEXT:    br label [[EXIT]]
48 ; CHECK:       exit:
49 ; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 1, ptr [[LOCAL1]])
50 ; CHECK-NEXT:    ret void
52 entry:
53   %local1 = alloca i256
54   br i1 undef, label %extract1, label %no-extract1
56 extract1:
57   ; lt.start
58   call void @llvm.lifetime.start.p0(i64 1, ptr %local1)
59   call void @cold_use(ptr %local1)
60   br i1 undef, label %extract2, label %no-extract1
62 extract2:
63   br label %exit
65 no-extract1:
66   br label %exit
68 exit:
69   ; lt.end
70   call void @llvm.lifetime.end.p0(i64 1, ptr %local1)
71   ret void
74 ; In this CFG, splitting will extract the block extract1. I.e., it will extract
75 ; a lifetime.end marker, but not the corresponding lifetime.start marker. Do
76 ; not emit a lifetime.end marker after the call to the split function.
78 ;            entry
79 ;         (lt.start)
80 ;        /          \
81 ;   no-extract1  extract1
82 ;    (lt.end)    (lt.end)
83 ;        \         /
84 ;            exit
86 ; After splitting, we should see:
88 ;            entry
89 ;         (lt.start)
90 ;        /          \
91 ;   no-extract1  codeRepl
92 ;    (lt.end)
93 ;        \         /
94 ;            exit
95 define void @only_lifetime_end_is_cold() {
96 ; CHECK-LABEL: @only_lifetime_end_is_cold(
97 ; CHECK-NEXT:  entry:
98 ; CHECK-NEXT:    [[LOCAL1:%.*]] = alloca i256
99 ; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 1, ptr [[LOCAL1]])
100 ; CHECK-NEXT:    br i1 undef, label [[NO_EXTRACT1:%.*]], label [[CODEREPL:%.*]]
101 ; CHECK:       no-extract1:
102 ; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 1, ptr [[LOCAL1]])
103 ; CHECK-NEXT:    br label [[EXIT:%.*]]
104 ; CHECK:       codeRepl:
105 ; CHECK-NEXT:    call void @only_lifetime_end_is_cold.cold.1(ptr [[LOCAL1]]) #3
106 ; CHECK-NEXT:    br label [[EXIT]]
107 ; CHECK:       exit:
108 ; CHECK-NEXT:    ret void
110 entry:
111   ; lt.start
112   %local1 = alloca i256
113   call void @llvm.lifetime.start.p0(i64 1, ptr %local1)
114   br i1 undef, label %no-extract1, label %extract1
116 no-extract1:
117   ; lt.end
118   call void @llvm.lifetime.end.p0(i64 1, ptr %local1)
119   br label %exit
121 extract1:
122   ; lt.end
123   call void @cold_use(ptr %local1)
124   call void @llvm.lifetime.end.p0(i64 1, ptr %local1)
125   br label %exit
127 exit:
128   ret void
131 ; In this CFG, splitting will extract the blocks extract{1,2,3}. Lifting the
132 ; lifetime.end marker would be a miscompile.
133 define void @do_not_lift_lifetime_end() {
134 ; CHECK-LABEL: @do_not_lift_lifetime_end(
135 ; CHECK-NEXT:  entry:
136 ; CHECK-NEXT:    [[LOCAL1:%.*]] = alloca i256
137 ; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 1, ptr [[LOCAL1]])
138 ; CHECK-NEXT:    br label [[HEADER:%.*]]
139 ; CHECK:       header:
140 ; CHECK-NEXT:    call void @use(ptr [[LOCAL1]])
141 ; CHECK-NEXT:    br i1 undef, label [[EXIT:%.*]], label [[CODEREPL:%.*]]
142 ; CHECK:       codeRepl:
143 ; CHECK-NEXT:    [[TARGETBLOCK:%.*]] = call i1 @do_not_lift_lifetime_end.cold.1(ptr [[LOCAL1]]) #3
144 ; CHECK-NEXT:    br i1 [[TARGETBLOCK]], label [[HEADER]], label [[EXIT]]
145 ; CHECK:       exit:
146 ; CHECK-NEXT:    ret void
148 entry:
149   ; lt.start
150   %local1 = alloca i256
151   call void @llvm.lifetime.start.p0(i64 1, ptr %local1)
152   br label %header
154 header:
155   ; If the lifetime.end marker is lifted, this use becomes dead the second time
156   ; the header block is executed.
157   call void @use(ptr %local1)
158   br i1 undef, label %exit, label %extract1
160 extract1:
161   call void @cold_use(ptr %local1)
162   br i1 undef, label %extract2, label %extract3
164 extract2:
165   ; Backedge.
166   br label %header
168 extract3:
169   ; lt.end
170   call void @llvm.lifetime.end.p0(i64 1, ptr %local1)
171   br label %exit
173 exit:
174   ret void