Tests exercizing TBAA metadata (both purposefully and not), and previously generated via UTC, have been regenerated and updated to version 6.
273 lines
15 KiB
C++
273 lines
15 KiB
C++
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 6
|
|
// RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu -verify
|
|
// RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s
|
|
|
|
// CHECK-LABEL: define dso_local void @_Z2wli(
|
|
// CHECK-SAME: i32 noundef [[E:%.*]]) #[[ATTR0:[0-9]+]] {
|
|
// CHECK-NEXT: [[ENTRY:.*:]]
|
|
// CHECK-NEXT: [[E_ADDR:%.*]] = alloca i32, align 4
|
|
// CHECK-NEXT: store i32 [[E]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2:![0-9]+]]
|
|
// CHECK-NEXT: br label %[[WHILE_COND:.*]]
|
|
// CHECK: [[WHILE_COND]]:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0
|
|
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 true)
|
|
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label %[[WHILE_BODY:.*]], label %[[WHILE_END:.*]]
|
|
// CHECK: [[WHILE_BODY]]:
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP1]], 1
|
|
// CHECK-NEXT: store i32 [[INC]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: br label %[[WHILE_COND]], !llvm.loop [[LOOP6:![0-9]+]]
|
|
// CHECK: [[WHILE_END]]:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void wl(int e){
|
|
while(e) [[likely]] ++e;
|
|
}
|
|
|
|
// CHECK-LABEL: define dso_local void @_Z2wui(
|
|
// CHECK-SAME: i32 noundef [[E:%.*]]) #[[ATTR0]] {
|
|
// CHECK-NEXT: [[ENTRY:.*:]]
|
|
// CHECK-NEXT: [[E_ADDR:%.*]] = alloca i32, align 4
|
|
// CHECK-NEXT: store i32 [[E]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: br label %[[WHILE_COND:.*]]
|
|
// CHECK: [[WHILE_COND]]:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0
|
|
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)
|
|
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label %[[WHILE_BODY:.*]], label %[[WHILE_END:.*]]
|
|
// CHECK: [[WHILE_BODY]]:
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP1]], 1
|
|
// CHECK-NEXT: store i32 [[INC]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: br label %[[WHILE_COND]], !llvm.loop [[LOOP9:![0-9]+]]
|
|
// CHECK: [[WHILE_END]]:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void wu(int e){
|
|
while(e) [[unlikely]] ++e;
|
|
}
|
|
|
|
// CHECK-LABEL: define dso_local void @_Z15w_branch_elidedj(
|
|
// CHECK-SAME: i32 noundef [[E:%.*]]) #[[ATTR0]] {
|
|
// CHECK-NEXT: [[ENTRY:.*:]]
|
|
// CHECK-NEXT: [[E_ADDR:%.*]] = alloca i32, align 4
|
|
// CHECK-NEXT: store i32 [[E]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: br label %[[WHILE_BODY:.*]]
|
|
// CHECK: [[WHILE_BODY]]:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: [[INC:%.*]] = add i32 [[TMP0]], 1
|
|
// CHECK-NEXT: store i32 [[INC]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: br label %[[WHILE_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
|
|
//
|
|
void w_branch_elided(unsigned e){
|
|
// expected-warning@+2 {{attribute 'likely' has no effect when annotating an infinite loop}}
|
|
// expected-note@+1 {{annotating the infinite loop here}}
|
|
while(1) [[likely]] ++e;
|
|
}
|
|
|
|
// CHECK-LABEL: define dso_local void @_Z2flj(
|
|
// CHECK-SAME: i32 noundef [[E:%.*]]) #[[ATTR0]] {
|
|
// CHECK-NEXT: [[ENTRY:.*:]]
|
|
// CHECK-NEXT: [[E_ADDR:%.*]] = alloca i32, align 4
|
|
// CHECK-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// CHECK-NEXT: store i32 [[E]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I]]) #[[ATTR3:[0-9]+]]
|
|
// CHECK-NEXT: store i32 0, ptr [[I]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: br label %[[FOR_COND:.*]]
|
|
// CHECK: [[FOR_COND]]:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 true)
|
|
// CHECK-NEXT: br i1 [[CMP_EXPVAL]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]]
|
|
// CHECK: [[FOR_COND_CLEANUP]]:
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[I]]) #[[ATTR3]]
|
|
// CHECK-NEXT: br label %[[FOR_END:.*]]
|
|
// CHECK: [[FOR_BODY]]:
|
|
// CHECK-NEXT: br label %[[FOR_INC:.*]]
|
|
// CHECK: [[FOR_INC]]:
|
|
// CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: [[INC:%.*]] = add i32 [[TMP2]], 1
|
|
// CHECK-NEXT: store i32 [[INC]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP11:![0-9]+]]
|
|
// CHECK: [[FOR_END]]:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void fl(unsigned e)
|
|
{
|
|
for(int i = 0; i != e; ++e) [[likely]];
|
|
}
|
|
|
|
// CHECK-LABEL: define dso_local void @_Z2fui(
|
|
// CHECK-SAME: i32 noundef [[E:%.*]]) #[[ATTR0]] {
|
|
// CHECK-NEXT: [[ENTRY:.*:]]
|
|
// CHECK-NEXT: [[E_ADDR:%.*]] = alloca i32, align 4
|
|
// CHECK-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// CHECK-NEXT: store i32 [[E]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I]]) #[[ATTR3]]
|
|
// CHECK-NEXT: store i32 0, ptr [[I]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: br label %[[FOR_COND:.*]]
|
|
// CHECK: [[FOR_COND]]:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 false)
|
|
// CHECK-NEXT: br i1 [[CMP_EXPVAL]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]]
|
|
// CHECK: [[FOR_COND_CLEANUP]]:
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[I]]) #[[ATTR3]]
|
|
// CHECK-NEXT: br label %[[FOR_END:.*]]
|
|
// CHECK: [[FOR_BODY]]:
|
|
// CHECK-NEXT: br label %[[FOR_INC:.*]]
|
|
// CHECK: [[FOR_INC]]:
|
|
// CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP2]], 1
|
|
// CHECK-NEXT: store i32 [[INC]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP12:![0-9]+]]
|
|
// CHECK: [[FOR_END]]:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void fu(int e)
|
|
{
|
|
for(int i = 0; i != e; ++e) [[unlikely]];
|
|
}
|
|
|
|
// CHECK-LABEL: define dso_local void @_Z15f_branch_elidedv(
|
|
// CHECK-SAME: ) #[[ATTR0]] {
|
|
// CHECK-NEXT: [[ENTRY:.*:]]
|
|
// CHECK-NEXT: br label %[[FOR_COND:.*]]
|
|
// CHECK: [[FOR_COND]]:
|
|
// CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP13:![0-9]+]]
|
|
//
|
|
void f_branch_elided()
|
|
{
|
|
for(;;) [[likely]];
|
|
}
|
|
|
|
// CHECK-LABEL: define dso_local void @_Z3frlOA4_i(
|
|
// CHECK-SAME: ptr noundef nonnull align 4 dereferenceable(16) [[E:%.*]]) #[[ATTR0]] {
|
|
// CHECK-NEXT: [[ENTRY:.*:]]
|
|
// CHECK-NEXT: [[E_ADDR:%.*]] = alloca ptr, align 8
|
|
// CHECK-NEXT: [[__RANGE1:%.*]] = alloca ptr, align 8
|
|
// CHECK-NEXT: [[__BEGIN1:%.*]] = alloca ptr, align 8
|
|
// CHECK-NEXT: [[__END1:%.*]] = alloca ptr, align 8
|
|
// CHECK-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// CHECK-NEXT: store ptr [[E]], ptr [[E_ADDR]], align 8, !tbaa [[INTPTR_TBAA14:![0-9]+]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__RANGE1]]) #[[ATTR3]]
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 8, !tbaa [[INTPTR_TBAA14]], !nonnull [[META17:![0-9]+]], !align [[META18:![0-9]+]]
|
|
// CHECK-NEXT: store ptr [[TMP0]], ptr [[__RANGE1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__BEGIN1]]) #[[ATTR3]]
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[__RANGE1]], align 8, !tbaa [[INTPTR_TBAA14]], !nonnull [[META17]], !align [[META18]]
|
|
// CHECK-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [4 x i32], ptr [[TMP1]], i64 0, i64 0
|
|
// CHECK-NEXT: store ptr [[ARRAYDECAY]], ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__END1]]) #[[ATTR3]]
|
|
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[__RANGE1]], align 8, !tbaa [[INTPTR_TBAA14]], !nonnull [[META17]], !align [[META18]]
|
|
// CHECK-NEXT: [[ARRAYDECAY1:%.*]] = getelementptr inbounds [4 x i32], ptr [[TMP2]], i64 0, i64 0
|
|
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAYDECAY1]], i64 4
|
|
// CHECK-NEXT: store ptr [[ADD_PTR]], ptr [[__END1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: br label %[[FOR_COND:.*]]
|
|
// CHECK: [[FOR_COND]]:
|
|
// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[__END1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[TMP3]], [[TMP4]]
|
|
// CHECK-NEXT: [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 true)
|
|
// CHECK-NEXT: br i1 [[CMP_EXPVAL]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]]
|
|
// CHECK: [[FOR_COND_CLEANUP]]:
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__END1]]) #[[ATTR3]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__BEGIN1]]) #[[ATTR3]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__RANGE1]]) #[[ATTR3]]
|
|
// CHECK-NEXT: br label %[[FOR_END:.*]]
|
|
// CHECK: [[FOR_BODY]]:
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I]]) #[[ATTR3]]
|
|
// CHECK-NEXT: [[TMP5:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: store i32 [[TMP6]], ptr [[I]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[I]]) #[[ATTR3]]
|
|
// CHECK-NEXT: br label %[[FOR_INC:.*]]
|
|
// CHECK: [[FOR_INC]]:
|
|
// CHECK-NEXT: [[TMP7:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: [[INCDEC_PTR:%.*]] = getelementptr inbounds nuw i32, ptr [[TMP7]], i32 1
|
|
// CHECK-NEXT: store ptr [[INCDEC_PTR]], ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP19:![0-9]+]]
|
|
// CHECK: [[FOR_END]]:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void frl(int (&&e) [4])
|
|
{
|
|
for(int i : e) [[likely]];
|
|
}
|
|
|
|
// CHECK-LABEL: define dso_local void @_Z3fruOA4_i(
|
|
// CHECK-SAME: ptr noundef nonnull align 4 dereferenceable(16) [[E:%.*]]) #[[ATTR0]] {
|
|
// CHECK-NEXT: [[ENTRY:.*:]]
|
|
// CHECK-NEXT: [[E_ADDR:%.*]] = alloca ptr, align 8
|
|
// CHECK-NEXT: [[__RANGE1:%.*]] = alloca ptr, align 8
|
|
// CHECK-NEXT: [[__BEGIN1:%.*]] = alloca ptr, align 8
|
|
// CHECK-NEXT: [[__END1:%.*]] = alloca ptr, align 8
|
|
// CHECK-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// CHECK-NEXT: store ptr [[E]], ptr [[E_ADDR]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__RANGE1]]) #[[ATTR3]]
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 8, !tbaa [[INTPTR_TBAA14]], !nonnull [[META17]], !align [[META18]]
|
|
// CHECK-NEXT: store ptr [[TMP0]], ptr [[__RANGE1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__BEGIN1]]) #[[ATTR3]]
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[__RANGE1]], align 8, !tbaa [[INTPTR_TBAA14]], !nonnull [[META17]], !align [[META18]]
|
|
// CHECK-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [4 x i32], ptr [[TMP1]], i64 0, i64 0
|
|
// CHECK-NEXT: store ptr [[ARRAYDECAY]], ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__END1]]) #[[ATTR3]]
|
|
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[__RANGE1]], align 8, !tbaa [[INTPTR_TBAA14]], !nonnull [[META17]], !align [[META18]]
|
|
// CHECK-NEXT: [[ARRAYDECAY1:%.*]] = getelementptr inbounds [4 x i32], ptr [[TMP2]], i64 0, i64 0
|
|
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAYDECAY1]], i64 4
|
|
// CHECK-NEXT: store ptr [[ADD_PTR]], ptr [[__END1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: br label %[[FOR_COND:.*]]
|
|
// CHECK: [[FOR_COND]]:
|
|
// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[__END1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[TMP3]], [[TMP4]]
|
|
// CHECK-NEXT: [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 false)
|
|
// CHECK-NEXT: br i1 [[CMP_EXPVAL]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]]
|
|
// CHECK: [[FOR_COND_CLEANUP]]:
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__END1]]) #[[ATTR3]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__BEGIN1]]) #[[ATTR3]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__RANGE1]]) #[[ATTR3]]
|
|
// CHECK-NEXT: br label %[[FOR_END:.*]]
|
|
// CHECK: [[FOR_BODY]]:
|
|
// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I]]) #[[ATTR3]]
|
|
// CHECK-NEXT: [[TMP5:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: store i32 [[TMP6]], ptr [[I]], align 4, !tbaa [[INT_TBAA2]]
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[I]]) #[[ATTR3]]
|
|
// CHECK-NEXT: br label %[[FOR_INC:.*]]
|
|
// CHECK: [[FOR_INC]]:
|
|
// CHECK-NEXT: [[TMP7:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: [[INCDEC_PTR:%.*]] = getelementptr inbounds nuw i32, ptr [[TMP7]], i32 1
|
|
// CHECK-NEXT: store ptr [[INCDEC_PTR]], ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]
|
|
// CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP20:![0-9]+]]
|
|
// CHECK: [[FOR_END]]:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void fru(int (&&e) [4])
|
|
{
|
|
for(int i : e) [[unlikely]];
|
|
}
|
|
//.
|
|
// CHECK: [[INT_TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}
|
|
// CHECK: [[META3]] = !{!"int", [[META4:![0-9]+]], i64 0}
|
|
// CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0}
|
|
// CHECK: [[META5]] = !{!"Simple C++ TBAA"}
|
|
// CHECK: [[LOOP6]] = distinct !{[[LOOP6]], [[META7:![0-9]+]], [[META8:![0-9]+]]}
|
|
// CHECK: [[META7]] = !{!"llvm.loop.mustprogress"}
|
|
// CHECK: [[META8]] = !{!"llvm.loop.unroll.disable"}
|
|
// CHECK: [[LOOP9]] = distinct !{[[LOOP9]], [[META7]], [[META8]]}
|
|
// CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[META7]], [[META8]]}
|
|
// CHECK: [[LOOP11]] = distinct !{[[LOOP11]], [[META7]], [[META8]]}
|
|
// CHECK: [[LOOP12]] = distinct !{[[LOOP12]], [[META7]], [[META8]]}
|
|
// CHECK: [[LOOP13]] = distinct !{[[LOOP13]], [[META7]], [[META8]]}
|
|
// CHECK: [[INTPTR_TBAA14]] = !{[[META15:![0-9]+]], [[META15]], i64 0}
|
|
// CHECK: [[META15]] = !{!"p1 int", [[META16:![0-9]+]], i64 0}
|
|
// CHECK: [[META16]] = !{!"any pointer", [[META4]], i64 0}
|
|
// CHECK: [[META17]] = !{}
|
|
// CHECK: [[META18]] = !{i64 4}
|
|
// CHECK: [[LOOP19]] = distinct !{[[LOOP19]], [[META8]]}
|
|
// CHECK: [[LOOP20]] = distinct !{[[LOOP20]], [[META8]]}
|
|
//.
|