1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2 // RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu -verify
3 // RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s
4 
5 // CHECK-LABEL: @_Z2wli(
6 // CHECK-NEXT:  entry:
7 // CHECK-NEXT:    [[E_ADDR:%.*]] = alloca i32, align 4
8 // CHECK-NEXT:    store i32 [[E:%.*]], i32* [[E_ADDR]], align 4, !tbaa [[TBAA2:![0-9]+]]
9 // CHECK-NEXT:    br label [[WHILE_COND:%.*]]
10 // CHECK:       while.cond:
11 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
12 // CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0
13 // CHECK-NEXT:    [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 true)
14 // CHECK-NEXT:    br i1 [[TOBOOL_EXPVAL]], label [[WHILE_BODY:%.*]], label [[WHILE_END:%.*]]
15 // CHECK:       while.body:
16 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
17 // CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP1]], 1
18 // CHECK-NEXT:    store i32 [[INC]], i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
19 // CHECK-NEXT:    br label [[WHILE_COND]], !llvm.loop [[LOOP6:![0-9]+]]
20 // CHECK:       while.end:
21 // CHECK-NEXT:    ret void
22 //
wl(int e)23 void wl(int e){
24   while(e) [[likely]] ++e;
25 }
26 
27 // CHECK-LABEL: @_Z2wui(
28 // CHECK-NEXT:  entry:
29 // CHECK-NEXT:    [[E_ADDR:%.*]] = alloca i32, align 4
30 // CHECK-NEXT:    store i32 [[E:%.*]], i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
31 // CHECK-NEXT:    br label [[WHILE_COND:%.*]]
32 // CHECK:       while.cond:
33 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
34 // CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0
35 // CHECK-NEXT:    [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)
36 // CHECK-NEXT:    br i1 [[TOBOOL_EXPVAL]], label [[WHILE_BODY:%.*]], label [[WHILE_END:%.*]]
37 // CHECK:       while.body:
38 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
39 // CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP1]], 1
40 // CHECK-NEXT:    store i32 [[INC]], i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
41 // CHECK-NEXT:    br label [[WHILE_COND]], !llvm.loop [[LOOP9:![0-9]+]]
42 // CHECK:       while.end:
43 // CHECK-NEXT:    ret void
44 //
wu(int e)45 void wu(int e){
46   while(e) [[unlikely]] ++e;
47 }
48 
49 // CHECK-LABEL: @_Z15w_branch_elidedj(
50 // CHECK-NEXT:  entry:
51 // CHECK-NEXT:    [[E_ADDR:%.*]] = alloca i32, align 4
52 // CHECK-NEXT:    store i32 [[E:%.*]], i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
53 // CHECK-NEXT:    br label [[WHILE_BODY:%.*]]
54 // CHECK:       while.body:
55 // CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
56 // CHECK-NEXT:    [[INC:%.*]] = add i32 [[TMP0]], 1
57 // CHECK-NEXT:    store i32 [[INC]], i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
58 // CHECK-NEXT:    br label [[WHILE_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
59 //
w_branch_elided(unsigned e)60 void w_branch_elided(unsigned e){
61   // expected-warning@+2 {{attribute 'likely' has no effect when annotating an infinite loop}}
62   // expected-note@+1 {{annotating the infinite loop here}}
63   while(1) [[likely]] ++e;
64 }
65 
66 // CHECK-LABEL: @_Z2flj(
67 // CHECK-NEXT:  entry:
68 // CHECK-NEXT:    [[E_ADDR:%.*]] = alloca i32, align 4
69 // CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4
70 // CHECK-NEXT:    store i32 [[E:%.*]], i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
71 // CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[I]] to i8*
72 // CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP0]]) #[[ATTR4:[0-9]+]]
73 // CHECK-NEXT:    store i32 0, i32* [[I]], align 4, !tbaa [[TBAA2]]
74 // CHECK-NEXT:    br label [[FOR_COND:%.*]]
75 // CHECK:       for.cond:
76 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[I]], align 4, !tbaa [[TBAA2]]
77 // CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
78 // CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[TMP1]], [[TMP2]]
79 // CHECK-NEXT:    [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 true)
80 // CHECK-NEXT:    br i1 [[CMP_EXPVAL]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]
81 // CHECK:       for.cond.cleanup:
82 // CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[I]] to i8*
83 // CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP3]]) #[[ATTR4]]
84 // CHECK-NEXT:    br label [[FOR_END:%.*]]
85 // CHECK:       for.body:
86 // CHECK-NEXT:    br label [[FOR_INC:%.*]]
87 // CHECK:       for.inc:
88 // CHECK-NEXT:    [[TMP4:%.*]] = load i32, i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
89 // CHECK-NEXT:    [[INC:%.*]] = add i32 [[TMP4]], 1
90 // CHECK-NEXT:    store i32 [[INC]], i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
91 // CHECK-NEXT:    br label [[FOR_COND]], !llvm.loop [[LOOP11:![0-9]+]]
92 // CHECK:       for.end:
93 // CHECK-NEXT:    ret void
94 //
fl(unsigned e)95 void fl(unsigned e)
96 {
97   for(int i = 0; i != e; ++e) [[likely]];
98 }
99 
100 // CHECK-LABEL: @_Z2fui(
101 // CHECK-NEXT:  entry:
102 // CHECK-NEXT:    [[E_ADDR:%.*]] = alloca i32, align 4
103 // CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4
104 // CHECK-NEXT:    store i32 [[E:%.*]], i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
105 // CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[I]] to i8*
106 // CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP0]]) #[[ATTR4]]
107 // CHECK-NEXT:    store i32 0, i32* [[I]], align 4, !tbaa [[TBAA2]]
108 // CHECK-NEXT:    br label [[FOR_COND:%.*]]
109 // CHECK:       for.cond:
110 // CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[I]], align 4, !tbaa [[TBAA2]]
111 // CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
112 // CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[TMP1]], [[TMP2]]
113 // CHECK-NEXT:    [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 false)
114 // CHECK-NEXT:    br i1 [[CMP_EXPVAL]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]
115 // CHECK:       for.cond.cleanup:
116 // CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[I]] to i8*
117 // CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP3]]) #[[ATTR4]]
118 // CHECK-NEXT:    br label [[FOR_END:%.*]]
119 // CHECK:       for.body:
120 // CHECK-NEXT:    br label [[FOR_INC:%.*]]
121 // CHECK:       for.inc:
122 // CHECK-NEXT:    [[TMP4:%.*]] = load i32, i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
123 // CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP4]], 1
124 // CHECK-NEXT:    store i32 [[INC]], i32* [[E_ADDR]], align 4, !tbaa [[TBAA2]]
125 // CHECK-NEXT:    br label [[FOR_COND]], !llvm.loop [[LOOP12:![0-9]+]]
126 // CHECK:       for.end:
127 // CHECK-NEXT:    ret void
128 //
fu(int e)129 void fu(int e)
130 {
131   for(int i = 0; i != e; ++e) [[unlikely]];
132 }
133 
134 // CHECK-LABEL: @_Z15f_branch_elidedv(
135 // CHECK-NEXT:  entry:
136 // CHECK-NEXT:    br label [[FOR_COND:%.*]]
137 // CHECK:       for.cond:
138 // CHECK-NEXT:    br label [[FOR_COND]], !llvm.loop [[LOOP13:![0-9]+]]
139 //
f_branch_elided()140 void f_branch_elided()
141 {
142   for(;;) [[likely]];
143 }
144 
145 // CHECK-LABEL: @_Z3frlOA4_i(
146 // CHECK-NEXT:  entry:
147 // CHECK-NEXT:    [[E_ADDR:%.*]] = alloca [4 x i32]*, align 8
148 // CHECK-NEXT:    [[__RANGE1:%.*]] = alloca [4 x i32]*, align 8
149 // CHECK-NEXT:    [[__BEGIN1:%.*]] = alloca i32*, align 8
150 // CHECK-NEXT:    [[__END1:%.*]] = alloca i32*, align 8
151 // CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4
152 // CHECK-NEXT:    store [4 x i32]* [[E:%.*]], [4 x i32]** [[E_ADDR]], align 8, !tbaa [[TBAA14:![0-9]+]]
153 // CHECK-NEXT:    [[TMP0:%.*]] = bitcast [4 x i32]** [[__RANGE1]] to i8*
154 // CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP0]]) #[[ATTR4]]
155 // CHECK-NEXT:    [[TMP1:%.*]] = load [4 x i32]*, [4 x i32]** [[E_ADDR]], align 8, !tbaa [[TBAA14]]
156 // CHECK-NEXT:    store [4 x i32]* [[TMP1]], [4 x i32]** [[__RANGE1]], align 8, !tbaa [[TBAA14]]
157 // CHECK-NEXT:    [[TMP2:%.*]] = bitcast i32** [[__BEGIN1]] to i8*
158 // CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP2]]) #[[ATTR4]]
159 // CHECK-NEXT:    [[TMP3:%.*]] = load [4 x i32]*, [4 x i32]** [[__RANGE1]], align 8, !tbaa [[TBAA14]]
160 // CHECK-NEXT:    [[ARRAYDECAY:%.*]] = getelementptr inbounds [4 x i32], [4 x i32]* [[TMP3]], i64 0, i64 0
161 // CHECK-NEXT:    store i32* [[ARRAYDECAY]], i32** [[__BEGIN1]], align 8, !tbaa [[TBAA14]]
162 // CHECK-NEXT:    [[TMP4:%.*]] = bitcast i32** [[__END1]] to i8*
163 // CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP4]]) #[[ATTR4]]
164 // CHECK-NEXT:    [[TMP5:%.*]] = load [4 x i32]*, [4 x i32]** [[__RANGE1]], align 8, !tbaa [[TBAA14]]
165 // CHECK-NEXT:    [[ARRAYDECAY1:%.*]] = getelementptr inbounds [4 x i32], [4 x i32]* [[TMP5]], i64 0, i64 0
166 // CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds i32, i32* [[ARRAYDECAY1]], i64 4
167 // CHECK-NEXT:    store i32* [[ADD_PTR]], i32** [[__END1]], align 8, !tbaa [[TBAA14]]
168 // CHECK-NEXT:    br label [[FOR_COND:%.*]]
169 // CHECK:       for.cond:
170 // CHECK-NEXT:    [[TMP6:%.*]] = load i32*, i32** [[__BEGIN1]], align 8, !tbaa [[TBAA14]]
171 // CHECK-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[__END1]], align 8, !tbaa [[TBAA14]]
172 // CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32* [[TMP6]], [[TMP7]]
173 // CHECK-NEXT:    [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 true)
174 // CHECK-NEXT:    br i1 [[CMP_EXPVAL]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]
175 // CHECK:       for.cond.cleanup:
176 // CHECK-NEXT:    [[TMP8:%.*]] = bitcast i32** [[__END1]] to i8*
177 // CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP8]]) #[[ATTR4]]
178 // CHECK-NEXT:    [[TMP9:%.*]] = bitcast i32** [[__BEGIN1]] to i8*
179 // CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP9]]) #[[ATTR4]]
180 // CHECK-NEXT:    [[TMP10:%.*]] = bitcast [4 x i32]** [[__RANGE1]] to i8*
181 // CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP10]]) #[[ATTR4]]
182 // CHECK-NEXT:    br label [[FOR_END:%.*]]
183 // CHECK:       for.body:
184 // CHECK-NEXT:    [[TMP11:%.*]] = bitcast i32* [[I]] to i8*
185 // CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP11]]) #[[ATTR4]]
186 // CHECK-NEXT:    [[TMP12:%.*]] = load i32*, i32** [[__BEGIN1]], align 8, !tbaa [[TBAA14]]
187 // CHECK-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4, !tbaa [[TBAA2]]
188 // CHECK-NEXT:    store i32 [[TMP13]], i32* [[I]], align 4, !tbaa [[TBAA2]]
189 // CHECK-NEXT:    [[TMP14:%.*]] = bitcast i32* [[I]] to i8*
190 // CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP14]]) #[[ATTR4]]
191 // CHECK-NEXT:    br label [[FOR_INC:%.*]]
192 // CHECK:       for.inc:
193 // CHECK-NEXT:    [[TMP15:%.*]] = load i32*, i32** [[__BEGIN1]], align 8, !tbaa [[TBAA14]]
194 // CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, i32* [[TMP15]], i32 1
195 // CHECK-NEXT:    store i32* [[INCDEC_PTR]], i32** [[__BEGIN1]], align 8, !tbaa [[TBAA14]]
196 // CHECK-NEXT:    br label [[FOR_COND]], !llvm.loop [[LOOP16:![0-9]+]]
197 // CHECK:       for.end:
198 // CHECK-NEXT:    ret void
199 //
200 void frl(int (&&e) [4])
201 {
202   for(int i : e) [[likely]];
203 }
204 
205 // CHECK-LABEL: @_Z3fruOA4_i(
206 // CHECK-NEXT:  entry:
207 // CHECK-NEXT:    [[E_ADDR:%.*]] = alloca [4 x i32]*, align 8
208 // CHECK-NEXT:    [[__RANGE1:%.*]] = alloca [4 x i32]*, align 8
209 // CHECK-NEXT:    [[__BEGIN1:%.*]] = alloca i32*, align 8
210 // CHECK-NEXT:    [[__END1:%.*]] = alloca i32*, align 8
211 // CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4
212 // CHECK-NEXT:    store [4 x i32]* [[E:%.*]], [4 x i32]** [[E_ADDR]], align 8, !tbaa [[TBAA14]]
213 // CHECK-NEXT:    [[TMP0:%.*]] = bitcast [4 x i32]** [[__RANGE1]] to i8*
214 // CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP0]]) #[[ATTR4]]
215 // CHECK-NEXT:    [[TMP1:%.*]] = load [4 x i32]*, [4 x i32]** [[E_ADDR]], align 8, !tbaa [[TBAA14]]
216 // CHECK-NEXT:    store [4 x i32]* [[TMP1]], [4 x i32]** [[__RANGE1]], align 8, !tbaa [[TBAA14]]
217 // CHECK-NEXT:    [[TMP2:%.*]] = bitcast i32** [[__BEGIN1]] to i8*
218 // CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP2]]) #[[ATTR4]]
219 // CHECK-NEXT:    [[TMP3:%.*]] = load [4 x i32]*, [4 x i32]** [[__RANGE1]], align 8, !tbaa [[TBAA14]]
220 // CHECK-NEXT:    [[ARRAYDECAY:%.*]] = getelementptr inbounds [4 x i32], [4 x i32]* [[TMP3]], i64 0, i64 0
221 // CHECK-NEXT:    store i32* [[ARRAYDECAY]], i32** [[__BEGIN1]], align 8, !tbaa [[TBAA14]]
222 // CHECK-NEXT:    [[TMP4:%.*]] = bitcast i32** [[__END1]] to i8*
223 // CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP4]]) #[[ATTR4]]
224 // CHECK-NEXT:    [[TMP5:%.*]] = load [4 x i32]*, [4 x i32]** [[__RANGE1]], align 8, !tbaa [[TBAA14]]
225 // CHECK-NEXT:    [[ARRAYDECAY1:%.*]] = getelementptr inbounds [4 x i32], [4 x i32]* [[TMP5]], i64 0, i64 0
226 // CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds i32, i32* [[ARRAYDECAY1]], i64 4
227 // CHECK-NEXT:    store i32* [[ADD_PTR]], i32** [[__END1]], align 8, !tbaa [[TBAA14]]
228 // CHECK-NEXT:    br label [[FOR_COND:%.*]]
229 // CHECK:       for.cond:
230 // CHECK-NEXT:    [[TMP6:%.*]] = load i32*, i32** [[__BEGIN1]], align 8, !tbaa [[TBAA14]]
231 // CHECK-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[__END1]], align 8, !tbaa [[TBAA14]]
232 // CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32* [[TMP6]], [[TMP7]]
233 // CHECK-NEXT:    [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 false)
234 // CHECK-NEXT:    br i1 [[CMP_EXPVAL]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]
235 // CHECK:       for.cond.cleanup:
236 // CHECK-NEXT:    [[TMP8:%.*]] = bitcast i32** [[__END1]] to i8*
237 // CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP8]]) #[[ATTR4]]
238 // CHECK-NEXT:    [[TMP9:%.*]] = bitcast i32** [[__BEGIN1]] to i8*
239 // CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP9]]) #[[ATTR4]]
240 // CHECK-NEXT:    [[TMP10:%.*]] = bitcast [4 x i32]** [[__RANGE1]] to i8*
241 // CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP10]]) #[[ATTR4]]
242 // CHECK-NEXT:    br label [[FOR_END:%.*]]
243 // CHECK:       for.body:
244 // CHECK-NEXT:    [[TMP11:%.*]] = bitcast i32* [[I]] to i8*
245 // CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP11]]) #[[ATTR4]]
246 // CHECK-NEXT:    [[TMP12:%.*]] = load i32*, i32** [[__BEGIN1]], align 8, !tbaa [[TBAA14]]
247 // CHECK-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4, !tbaa [[TBAA2]]
248 // CHECK-NEXT:    store i32 [[TMP13]], i32* [[I]], align 4, !tbaa [[TBAA2]]
249 // CHECK-NEXT:    [[TMP14:%.*]] = bitcast i32* [[I]] to i8*
250 // CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP14]]) #[[ATTR4]]
251 // CHECK-NEXT:    br label [[FOR_INC:%.*]]
252 // CHECK:       for.inc:
253 // CHECK-NEXT:    [[TMP15:%.*]] = load i32*, i32** [[__BEGIN1]], align 8, !tbaa [[TBAA14]]
254 // CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, i32* [[TMP15]], i32 1
255 // CHECK-NEXT:    store i32* [[INCDEC_PTR]], i32** [[__BEGIN1]], align 8, !tbaa [[TBAA14]]
256 // CHECK-NEXT:    br label [[FOR_COND]], !llvm.loop [[LOOP17:![0-9]+]]
257 // CHECK:       for.end:
258 // CHECK-NEXT:    ret void
259 //
260 void fru(int (&&e) [4])
261 {
262   for(int i : e) [[unlikely]];
263 }
264