273 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 62// RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu -verify3// RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s4 5// CHECK-LABEL: define dso_local void @_Z2wli(6// CHECK-SAME: i32 noundef [[E:%.*]]) #[[ATTR0:[0-9]+]] {7// CHECK-NEXT: [[ENTRY:.*:]]8// CHECK-NEXT: [[E_ADDR:%.*]] = alloca i32, align 49// CHECK-NEXT: store i32 [[E]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2:![0-9]+]]10// CHECK-NEXT: br label %[[WHILE_COND:.*]]11// CHECK: [[WHILE_COND]]:12// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]13// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 014// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 true)15// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label %[[WHILE_BODY:.*]], label %[[WHILE_END:.*]]16// CHECK: [[WHILE_BODY]]:17// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]18// CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP1]], 119// CHECK-NEXT: store i32 [[INC]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]20// CHECK-NEXT: br label %[[WHILE_COND]], !llvm.loop [[LOOP6:![0-9]+]]21// CHECK: [[WHILE_END]]:22// CHECK-NEXT: ret void23//24void wl(int e){25 while(e) [[likely]] ++e;26}27 28// CHECK-LABEL: define dso_local void @_Z2wui(29// CHECK-SAME: i32 noundef [[E:%.*]]) #[[ATTR0]] {30// CHECK-NEXT: [[ENTRY:.*:]]31// CHECK-NEXT: [[E_ADDR:%.*]] = alloca i32, align 432// CHECK-NEXT: store i32 [[E]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]33// CHECK-NEXT: br label %[[WHILE_COND:.*]]34// CHECK: [[WHILE_COND]]:35// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]36// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 037// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)38// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label %[[WHILE_BODY:.*]], label %[[WHILE_END:.*]]39// CHECK: [[WHILE_BODY]]:40// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]41// CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP1]], 142// CHECK-NEXT: store i32 [[INC]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]43// CHECK-NEXT: br label %[[WHILE_COND]], !llvm.loop [[LOOP9:![0-9]+]]44// CHECK: [[WHILE_END]]:45// CHECK-NEXT: ret void46//47void wu(int e){48 while(e) [[unlikely]] ++e;49}50 51// CHECK-LABEL: define dso_local void @_Z15w_branch_elidedj(52// CHECK-SAME: i32 noundef [[E:%.*]]) #[[ATTR0]] {53// CHECK-NEXT: [[ENTRY:.*:]]54// CHECK-NEXT: [[E_ADDR:%.*]] = alloca i32, align 455// CHECK-NEXT: store i32 [[E]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]56// CHECK-NEXT: br label %[[WHILE_BODY:.*]]57// CHECK: [[WHILE_BODY]]:58// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]59// CHECK-NEXT: [[INC:%.*]] = add i32 [[TMP0]], 160// CHECK-NEXT: store i32 [[INC]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]61// CHECK-NEXT: br label %[[WHILE_BODY]], !llvm.loop [[LOOP10:![0-9]+]]62//63void w_branch_elided(unsigned e){64 // expected-warning@+2 {{attribute 'likely' has no effect when annotating an infinite loop}}65 // expected-note@+1 {{annotating the infinite loop here}}66 while(1) [[likely]] ++e;67}68 69// CHECK-LABEL: define dso_local void @_Z2flj(70// CHECK-SAME: i32 noundef [[E:%.*]]) #[[ATTR0]] {71// CHECK-NEXT: [[ENTRY:.*:]]72// CHECK-NEXT: [[E_ADDR:%.*]] = alloca i32, align 473// CHECK-NEXT: [[I:%.*]] = alloca i32, align 474// CHECK-NEXT: store i32 [[E]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]75// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I]]) #[[ATTR3:[0-9]+]]76// CHECK-NEXT: store i32 0, ptr [[I]], align 4, !tbaa [[INT_TBAA2]]77// CHECK-NEXT: br label %[[FOR_COND:.*]]78// CHECK: [[FOR_COND]]:79// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !tbaa [[INT_TBAA2]]80// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]81// CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP0]], [[TMP1]]82// CHECK-NEXT: [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 true)83// CHECK-NEXT: br i1 [[CMP_EXPVAL]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]]84// CHECK: [[FOR_COND_CLEANUP]]:85// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[I]]) #[[ATTR3]]86// CHECK-NEXT: br label %[[FOR_END:.*]]87// CHECK: [[FOR_BODY]]:88// CHECK-NEXT: br label %[[FOR_INC:.*]]89// CHECK: [[FOR_INC]]:90// CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]91// CHECK-NEXT: [[INC:%.*]] = add i32 [[TMP2]], 192// CHECK-NEXT: store i32 [[INC]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]93// CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP11:![0-9]+]]94// CHECK: [[FOR_END]]:95// CHECK-NEXT: ret void96//97void fl(unsigned e)98{99 for(int i = 0; i != e; ++e) [[likely]];100}101 102// CHECK-LABEL: define dso_local void @_Z2fui(103// CHECK-SAME: i32 noundef [[E:%.*]]) #[[ATTR0]] {104// CHECK-NEXT: [[ENTRY:.*:]]105// CHECK-NEXT: [[E_ADDR:%.*]] = alloca i32, align 4106// CHECK-NEXT: [[I:%.*]] = alloca i32, align 4107// CHECK-NEXT: store i32 [[E]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]108// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I]]) #[[ATTR3]]109// CHECK-NEXT: store i32 0, ptr [[I]], align 4, !tbaa [[INT_TBAA2]]110// CHECK-NEXT: br label %[[FOR_COND:.*]]111// CHECK: [[FOR_COND]]:112// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !tbaa [[INT_TBAA2]]113// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]114// CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP0]], [[TMP1]]115// CHECK-NEXT: [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 false)116// CHECK-NEXT: br i1 [[CMP_EXPVAL]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]]117// CHECK: [[FOR_COND_CLEANUP]]:118// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[I]]) #[[ATTR3]]119// CHECK-NEXT: br label %[[FOR_END:.*]]120// CHECK: [[FOR_BODY]]:121// CHECK-NEXT: br label %[[FOR_INC:.*]]122// CHECK: [[FOR_INC]]:123// CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]124// CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP2]], 1125// CHECK-NEXT: store i32 [[INC]], ptr [[E_ADDR]], align 4, !tbaa [[INT_TBAA2]]126// CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP12:![0-9]+]]127// CHECK: [[FOR_END]]:128// CHECK-NEXT: ret void129//130void fu(int e)131{132 for(int i = 0; i != e; ++e) [[unlikely]];133}134 135// CHECK-LABEL: define dso_local void @_Z15f_branch_elidedv(136// CHECK-SAME: ) #[[ATTR0]] {137// CHECK-NEXT: [[ENTRY:.*:]]138// CHECK-NEXT: br label %[[FOR_COND:.*]]139// CHECK: [[FOR_COND]]:140// CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP13:![0-9]+]]141//142void f_branch_elided()143{144 for(;;) [[likely]];145}146 147// CHECK-LABEL: define dso_local void @_Z3frlOA4_i(148// CHECK-SAME: ptr noundef nonnull align 4 dereferenceable(16) [[E:%.*]]) #[[ATTR0]] {149// CHECK-NEXT: [[ENTRY:.*:]]150// CHECK-NEXT: [[E_ADDR:%.*]] = alloca ptr, align 8151// CHECK-NEXT: [[__RANGE1:%.*]] = alloca ptr, align 8152// CHECK-NEXT: [[__BEGIN1:%.*]] = alloca ptr, align 8153// CHECK-NEXT: [[__END1:%.*]] = alloca ptr, align 8154// CHECK-NEXT: [[I:%.*]] = alloca i32, align 4155// CHECK-NEXT: store ptr [[E]], ptr [[E_ADDR]], align 8, !tbaa [[INTPTR_TBAA14:![0-9]+]]156// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__RANGE1]]) #[[ATTR3]]157// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 8, !tbaa [[INTPTR_TBAA14]], !nonnull [[META17:![0-9]+]], !align [[META18:![0-9]+]]158// CHECK-NEXT: store ptr [[TMP0]], ptr [[__RANGE1]], align 8, !tbaa [[INTPTR_TBAA14]]159// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__BEGIN1]]) #[[ATTR3]]160// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[__RANGE1]], align 8, !tbaa [[INTPTR_TBAA14]], !nonnull [[META17]], !align [[META18]]161// CHECK-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [4 x i32], ptr [[TMP1]], i64 0, i64 0162// CHECK-NEXT: store ptr [[ARRAYDECAY]], ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]163// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__END1]]) #[[ATTR3]]164// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[__RANGE1]], align 8, !tbaa [[INTPTR_TBAA14]], !nonnull [[META17]], !align [[META18]]165// CHECK-NEXT: [[ARRAYDECAY1:%.*]] = getelementptr inbounds [4 x i32], ptr [[TMP2]], i64 0, i64 0166// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAYDECAY1]], i64 4167// CHECK-NEXT: store ptr [[ADD_PTR]], ptr [[__END1]], align 8, !tbaa [[INTPTR_TBAA14]]168// CHECK-NEXT: br label %[[FOR_COND:.*]]169// CHECK: [[FOR_COND]]:170// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]171// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[__END1]], align 8, !tbaa [[INTPTR_TBAA14]]172// CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[TMP3]], [[TMP4]]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: call void @llvm.lifetime.end.p0(ptr [[__END1]]) #[[ATTR3]]177// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__BEGIN1]]) #[[ATTR3]]178// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__RANGE1]]) #[[ATTR3]]179// CHECK-NEXT: br label %[[FOR_END:.*]]180// CHECK: [[FOR_BODY]]:181// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I]]) #[[ATTR3]]182// CHECK-NEXT: [[TMP5:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]183// CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4, !tbaa [[INT_TBAA2]]184// CHECK-NEXT: store i32 [[TMP6]], ptr [[I]], align 4, !tbaa [[INT_TBAA2]]185// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[I]]) #[[ATTR3]]186// CHECK-NEXT: br label %[[FOR_INC:.*]]187// CHECK: [[FOR_INC]]:188// CHECK-NEXT: [[TMP7:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]189// CHECK-NEXT: [[INCDEC_PTR:%.*]] = getelementptr inbounds nuw i32, ptr [[TMP7]], i32 1190// CHECK-NEXT: store ptr [[INCDEC_PTR]], ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]191// CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP19:![0-9]+]]192// CHECK: [[FOR_END]]:193// CHECK-NEXT: ret void194//195void frl(int (&&e) [4])196{197 for(int i : e) [[likely]];198}199 200// CHECK-LABEL: define dso_local void @_Z3fruOA4_i(201// CHECK-SAME: ptr noundef nonnull align 4 dereferenceable(16) [[E:%.*]]) #[[ATTR0]] {202// CHECK-NEXT: [[ENTRY:.*:]]203// CHECK-NEXT: [[E_ADDR:%.*]] = alloca ptr, align 8204// CHECK-NEXT: [[__RANGE1:%.*]] = alloca ptr, align 8205// CHECK-NEXT: [[__BEGIN1:%.*]] = alloca ptr, align 8206// CHECK-NEXT: [[__END1:%.*]] = alloca ptr, align 8207// CHECK-NEXT: [[I:%.*]] = alloca i32, align 4208// CHECK-NEXT: store ptr [[E]], ptr [[E_ADDR]], align 8, !tbaa [[INTPTR_TBAA14]]209// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__RANGE1]]) #[[ATTR3]]210// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 8, !tbaa [[INTPTR_TBAA14]], !nonnull [[META17]], !align [[META18]]211// CHECK-NEXT: store ptr [[TMP0]], ptr [[__RANGE1]], align 8, !tbaa [[INTPTR_TBAA14]]212// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__BEGIN1]]) #[[ATTR3]]213// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[__RANGE1]], align 8, !tbaa [[INTPTR_TBAA14]], !nonnull [[META17]], !align [[META18]]214// CHECK-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [4 x i32], ptr [[TMP1]], i64 0, i64 0215// CHECK-NEXT: store ptr [[ARRAYDECAY]], ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]216// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__END1]]) #[[ATTR3]]217// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[__RANGE1]], align 8, !tbaa [[INTPTR_TBAA14]], !nonnull [[META17]], !align [[META18]]218// CHECK-NEXT: [[ARRAYDECAY1:%.*]] = getelementptr inbounds [4 x i32], ptr [[TMP2]], i64 0, i64 0219// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAYDECAY1]], i64 4220// CHECK-NEXT: store ptr [[ADD_PTR]], ptr [[__END1]], align 8, !tbaa [[INTPTR_TBAA14]]221// CHECK-NEXT: br label %[[FOR_COND:.*]]222// CHECK: [[FOR_COND]]:223// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]224// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[__END1]], align 8, !tbaa [[INTPTR_TBAA14]]225// CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[TMP3]], [[TMP4]]226// CHECK-NEXT: [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 false)227// CHECK-NEXT: br i1 [[CMP_EXPVAL]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]]228// CHECK: [[FOR_COND_CLEANUP]]:229// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__END1]]) #[[ATTR3]]230// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__BEGIN1]]) #[[ATTR3]]231// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__RANGE1]]) #[[ATTR3]]232// CHECK-NEXT: br label %[[FOR_END:.*]]233// CHECK: [[FOR_BODY]]:234// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I]]) #[[ATTR3]]235// CHECK-NEXT: [[TMP5:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]236// CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4, !tbaa [[INT_TBAA2]]237// CHECK-NEXT: store i32 [[TMP6]], ptr [[I]], align 4, !tbaa [[INT_TBAA2]]238// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[I]]) #[[ATTR3]]239// CHECK-NEXT: br label %[[FOR_INC:.*]]240// CHECK: [[FOR_INC]]:241// CHECK-NEXT: [[TMP7:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]242// CHECK-NEXT: [[INCDEC_PTR:%.*]] = getelementptr inbounds nuw i32, ptr [[TMP7]], i32 1243// CHECK-NEXT: store ptr [[INCDEC_PTR]], ptr [[__BEGIN1]], align 8, !tbaa [[INTPTR_TBAA14]]244// CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP20:![0-9]+]]245// CHECK: [[FOR_END]]:246// CHECK-NEXT: ret void247//248void fru(int (&&e) [4])249{250 for(int i : e) [[unlikely]];251}252//.253// CHECK: [[INT_TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}254// CHECK: [[META3]] = !{!"int", [[META4:![0-9]+]], i64 0}255// CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0}256// CHECK: [[META5]] = !{!"Simple C++ TBAA"}257// CHECK: [[LOOP6]] = distinct !{[[LOOP6]], [[META7:![0-9]+]], [[META8:![0-9]+]]}258// CHECK: [[META7]] = !{!"llvm.loop.mustprogress"}259// CHECK: [[META8]] = !{!"llvm.loop.unroll.disable"}260// CHECK: [[LOOP9]] = distinct !{[[LOOP9]], [[META7]], [[META8]]}261// CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[META7]], [[META8]]}262// CHECK: [[LOOP11]] = distinct !{[[LOOP11]], [[META7]], [[META8]]}263// CHECK: [[LOOP12]] = distinct !{[[LOOP12]], [[META7]], [[META8]]}264// CHECK: [[LOOP13]] = distinct !{[[LOOP13]], [[META7]], [[META8]]}265// CHECK: [[INTPTR_TBAA14]] = !{[[META15:![0-9]+]], [[META15]], i64 0}266// CHECK: [[META15]] = !{!"p1 int", [[META16:![0-9]+]], i64 0}267// CHECK: [[META16]] = !{!"any pointer", [[META4]], i64 0}268// CHECK: [[META17]] = !{}269// CHECK: [[META18]] = !{i64 4}270// CHECK: [[LOOP19]] = distinct !{[[LOOP19]], [[META8]]}271// CHECK: [[LOOP20]] = distinct !{[[LOOP20]], [[META8]]}272//.273