268 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals2; RUN: opt < %s -passes='require<profile-summary>,chr' -S | FileCheck %s3 4declare void @foo()5declare void @bar()6declare void @baz(i64)7 8; Test that when we have a static alloca in an entry block that will get split,9; the alloca remains static and we preserve its lifetime annotations.10define void @test_chr_with_lifetimes(ptr %i) !prof !14 {11; CHECK-LABEL: @test_chr_with_lifetimes(12; CHECK-NEXT: entry:13; CHECK-NEXT: [[TEST:%.*]] = alloca i32, align 814; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I:%.*]], align 415; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 016; CHECK-NEXT: [[TMP9:%.*]] = freeze i1 [[TMP1]]17; CHECK-NEXT: [[TMP8:%.*]] = select i1 true, i1 [[TMP9]], i1 false, !prof [[PROF15:![0-9]+]]18; CHECK-NEXT: [[TMP11:%.*]] = freeze i1 [[TMP1]]19; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP8]], i1 [[TMP11]], i1 false, !prof [[PROF15]]20; CHECK-NEXT: br i1 [[TMP5]], label [[ENTRY_SPLIT:%.*]], label [[ENTRY_SPLIT_NONCHR:%.*]], !prof [[PROF16:![0-9]+]]21; CHECK: entry.split:22; CHECK-NEXT: [[TMP6:%.*]] = select i1 true, i64 0, i64 4, !prof [[PROF17:![0-9]+]]23; CHECK-NEXT: call void @baz(i64 [[TMP6]])24; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB0:%.*]], !prof [[PROF18:![0-9]+]]25; CHECK: bb0:26; CHECK-NEXT: call void @foo()27; CHECK-NEXT: br label [[BB1]]28; CHECK: entry.split.nonchr:29; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], i64 0, i64 4, !prof [[PROF17]]30; CHECK-NEXT: call void @baz(i64 [[TMP7]])31; CHECK-NEXT: br i1 [[TMP1]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF17]]32; CHECK: bb0.nonchr:33; CHECK-NEXT: call void @foo()34; CHECK-NEXT: br label [[BB1]]35; CHECK: bb1:36; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TEST]])37; CHECK-NEXT: store ptr [[TEST]], ptr [[I]], align 838; CHECK-NEXT: br label [[BB2:%.*]]39; CHECK: bb2:40; CHECK-NEXT: [[TMP2:%.*]] = phi ptr [ [[TMP3:%.*]], [[BB2]] ], [ null, [[BB1]] ]41; CHECK-NEXT: [[TMP3]] = getelementptr i8, ptr [[TMP2]], i64 2442; CHECK-NEXT: [[TMP4:%.*]] = icmp eq ptr [[TMP2]], [[I]]43; CHECK-NEXT: br i1 [[TMP4]], label [[BB3:%.*]], label [[BB2]]44; CHECK: bb3:45; CHECK-NEXT: ret void46;47entry:48 %1 = load i32, ptr %i49 %2 = icmp eq i32 %1, 050 %3 = select i1 %2, i64 4, i64 0, !prof !1551 %test = alloca i32, align 852 call void @baz(i64 %3)53 br i1 %2, label %bb1, label %bb0, !prof !1554 55bb0:56 call void @foo()57 br label %bb158 59bb1:60 call void @llvm.lifetime.start.p0(ptr %test)61 store ptr %test, ptr %i, align 862 br label %bb263 64bb2:65 %4 = phi ptr [ %5, %bb2 ], [ null, %bb1 ]66 %5 = getelementptr i8, ptr %4, i64 2467 %6 = icmp eq ptr %4, %i68 br i1 %6, label %bb3, label %bb269 70bb3:71 ret void72}73 74; Test that we remove lifetime markers that would otherwise refer to phi75; nodes given the dynamic allocas they referred to have been duplicated.76define void @test_chr_dynamic_alloca(ptr %i) !prof !14 {77; CHECK-LABEL: @test_chr_dynamic_alloca(78; CHECK-NEXT: entry:79; CHECK-NEXT: [[TEST1:%.*]] = load i32, ptr [[I:%.*]], align 480; CHECK-NEXT: [[TEST2:%.*]] = icmp eq i32 [[TEST1]], 581; CHECK-NEXT: br i1 [[TEST2]], label [[BB4:%.*]], label [[BB3:%.*]]82; CHECK: bb4:83; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 484; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 085; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]86; CHECK-NEXT: [[TMP3:%.*]] = select i1 true, i1 [[TMP2]], i1 false, !prof [[PROF15]]87; CHECK-NEXT: [[TMP4:%.*]] = freeze i1 [[TMP1]]88; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP3]], i1 [[TMP4]], i1 false, !prof [[PROF15]]89; CHECK-NEXT: br i1 [[TMP5]], label [[BB4_SPLIT:%.*]], label [[BB4_SPLIT_NONCHR:%.*]], !prof [[PROF16]]90; CHECK: bb4.split:91; CHECK-NEXT: [[TMP6:%.*]] = select i1 true, i64 0, i64 4, !prof [[PROF17]]92; CHECK-NEXT: [[TEST:%.*]] = alloca i32, align 893; CHECK-NEXT: call void @baz(i64 [[TMP6]])94; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB0:%.*]], !prof [[PROF18]]95; CHECK: bb0:96; CHECK-NEXT: call void @foo()97; CHECK-NEXT: store ptr [[TEST]], ptr [[I]], align 898; CHECK-NEXT: br label [[BB1]]99; CHECK: bb4.split.nonchr:100; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], i64 0, i64 4, !prof [[PROF17]]101; CHECK-NEXT: [[TEST_NONCHR:%.*]] = alloca i32, align 8102; CHECK-NEXT: call void @baz(i64 [[TMP7]])103; CHECK-NEXT: br i1 [[TMP1]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF17]]104; CHECK: bb0.nonchr:105; CHECK-NEXT: call void @foo()106; CHECK-NEXT: store ptr [[TEST_NONCHR]], ptr [[I]], align 8107; CHECK-NEXT: br label [[BB1]]108; CHECK: bb1:109; CHECK-NEXT: [[TMP8:%.*]] = phi ptr [ [[TEST]], [[BB0]] ], [ [[TEST]], [[BB4_SPLIT]] ], [ [[TEST_NONCHR]], [[BB0_NONCHR]] ], [ [[TEST_NONCHR]], [[BB4_SPLIT_NONCHR]] ]110; CHECK-NEXT: call void @bar()111; CHECK-NEXT: store ptr [[TMP8]], ptr [[I]], align 8112; CHECK-NEXT: br label [[BB2:%.*]]113; CHECK: bb2:114; CHECK-NEXT: [[TMP9:%.*]] = phi ptr [ [[TMP10:%.*]], [[BB2]] ], [ null, [[BB1]] ]115; CHECK-NEXT: [[TMP10]] = getelementptr i8, ptr [[TMP9]], i64 24116; CHECK-NEXT: [[TEST5:%.*]] = load ptr, ptr [[TMP8]], align 8117; CHECK-NEXT: [[TMP11:%.*]] = icmp eq ptr [[TMP9]], [[TEST5]]118; CHECK-NEXT: br i1 [[TMP11]], label [[BB3]], label [[BB2]]119; CHECK: bb3:120; CHECK-NEXT: ret void121;122entry:123 %test1 = load i32, ptr %i124 %test2 = icmp eq i32 %test1, 5125 br i1 %test2, label %bb4, label %bb3126 127bb4:128 %1 = load i32, ptr %i129 %2 = icmp eq i32 %1, 0130 %3 = select i1 %2, i64 4, i64 0, !prof !15131 %test = alloca i32, align 8132 call void @baz(i64 %3)133 br i1 %2, label %bb1, label %bb0, !prof !15134 135bb0:136 call void @foo()137 call void @llvm.lifetime.start.p0(ptr %test)138 store ptr %test, ptr %i, align 8139 br label %bb1140 141bb1:142 call void @bar()143 call void @llvm.lifetime.start.p0(ptr %test)144 store ptr %test, ptr %i, align 8145 br label %bb2146 147bb2:148 %4 = phi ptr [ %5, %bb2 ], [ null, %bb1 ]149 %5 = getelementptr i8, ptr %4, i64 24150 %test5 = load ptr, ptr %test151 call void @llvm.lifetime.end.p0(ptr %test)152 %6 = icmp eq ptr %4, %test5153 br i1 %6, label %bb3, label %bb2154 155bb3:156 ret void157}158 159; Test that we do not move around allocas that occur in the entry block160; before splitting. If we accidentally sink them, we can move them after161; their users.162define void @test_no_move_allocas(ptr %i) !prof !14 {163; CHECK-LABEL: @test_no_move_allocas(164; CHECK-NEXT: entry:165; CHECK-NEXT: [[TEST:%.*]] = alloca i32, align 8166; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TEST]])167; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I:%.*]], align 4168; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0169; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]170; CHECK-NEXT: [[TMP3:%.*]] = select i1 true, i1 [[TMP2]], i1 false, !prof [[PROF15]]171; CHECK-NEXT: [[TMP4:%.*]] = freeze i1 [[TMP1]]172; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP3]], i1 [[TMP4]], i1 false, !prof [[PROF15]]173; CHECK-NEXT: br i1 [[TMP5]], label [[ENTRY_SPLIT:%.*]], label [[ENTRY_SPLIT_NONCHR:%.*]], !prof [[PROF16]]174; CHECK: entry.split:175; CHECK-NEXT: [[TMP6:%.*]] = select i1 true, i64 0, i64 4, !prof [[PROF17]]176; CHECK-NEXT: call void @baz(i64 [[TMP6]])177; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB0:%.*]], !prof [[PROF18]]178; CHECK: bb0:179; CHECK-NEXT: call void @foo()180; CHECK-NEXT: br label [[BB1]]181; CHECK: entry.split.nonchr:182; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], i64 0, i64 4, !prof [[PROF17]]183; CHECK-NEXT: call void @baz(i64 [[TMP7]])184; CHECK-NEXT: br i1 [[TMP1]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF17]]185; CHECK: bb0.nonchr:186; CHECK-NEXT: call void @foo()187; CHECK-NEXT: br label [[BB1]]188; CHECK: bb1:189; CHECK-NEXT: call void @bar()190; CHECK-NEXT: br label [[BB2:%.*]]191; CHECK: bb2:192; CHECK-NEXT: [[TMP8:%.*]] = phi ptr [ [[TMP9:%.*]], [[BB2]] ], [ null, [[BB1]] ]193; CHECK-NEXT: [[TMP9]] = getelementptr i8, ptr [[TMP8]], i64 24194; CHECK-NEXT: [[TMP10:%.*]] = icmp eq ptr [[TMP8]], [[I]]195; CHECK-NEXT: br i1 [[TMP10]], label [[BB3:%.*]], label [[BB2]]196; CHECK: bb3:197; CHECK-NEXT: ret void198;199entry:200 %test = alloca i32, align 8201 call void @llvm.lifetime.start.p0(ptr %test)202 %1 = load i32, ptr %i203 %2 = icmp eq i32 %1, 0204 %3 = select i1 %2, i64 4, i64 0, !prof !15205 call void @baz(i64 %3)206 br i1 %2, label %bb1, label %bb0, !prof !15207 208bb0:209 call void @foo()210 br label %bb1211 212bb1:213 call void @bar()214 br label %bb2215 216bb2:217 %4 = phi ptr [ %5, %bb2 ], [ null, %bb1 ]218 %5 = getelementptr i8, ptr %4, i64 24219 %6 = icmp eq ptr %4, %i220 br i1 %6, label %bb3, label %bb2221 222bb3:223 ret void224}225 226 227!llvm.module.flags = !{!0}228!0 = !{i32 1, !"ProfileSummary", !1}229!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}230!2 = !{!"ProfileFormat", !"InstrProf"}231!3 = !{!"TotalCount", i64 10000}232!4 = !{!"MaxCount", i64 10}233!5 = !{!"MaxInternalCount", i64 1}234!6 = !{!"MaxFunctionCount", i64 1000}235!7 = !{!"NumCounts", i64 3}236!8 = !{!"NumFunctions", i64 3}237!9 = !{!"DetailedSummary", !10}238!10 = !{!11, !12, !13}239!11 = !{i32 10000, i64 100, i32 1}240!12 = !{i32 999000, i64 100, i32 1}241!13 = !{i32 999999, i64 1, i32 2}242 243!14 = !{!"function_entry_count", i64 100}244!15 = !{!"branch_weights", i32 0, i32 1}245;.246; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }247;.248; CHECK: [[META0:![0-9]+]] = !{i32 1, !"ProfileSummary", [[META1:![0-9]+]]}249; CHECK: [[META1]] = !{[[META2:![0-9]+]], [[META3:![0-9]+]], [[META4:![0-9]+]], [[META5:![0-9]+]], [[META6:![0-9]+]], [[META7:![0-9]+]], [[META8:![0-9]+]], [[META9:![0-9]+]]}250; CHECK: [[META2]] = !{!"ProfileFormat", !"InstrProf"}251; CHECK: [[META3]] = !{!"TotalCount", i64 10000}252; CHECK: [[META4]] = !{!"MaxCount", i64 10}253; CHECK: [[META5]] = !{!"MaxInternalCount", i64 1}254; CHECK: [[META6]] = !{!"MaxFunctionCount", i64 1000}255; CHECK: [[META7]] = !{!"NumCounts", i64 3}256; CHECK: [[META8]] = !{!"NumFunctions", i64 3}257; CHECK: [[META9]] = !{!"DetailedSummary", [[META10:![0-9]+]]}258; CHECK: [[META10]] = !{[[META11:![0-9]+]], [[META12:![0-9]+]], [[META13:![0-9]+]]}259; CHECK: [[META11]] = !{i32 10000, i64 100, i32 1}260; CHECK: [[META12]] = !{i32 999000, i64 100, i32 1}261; CHECK: [[META13]] = !{i32 999999, i64 1, i32 2}262; CHECK: [[META14:![0-9]+]] = !{!"function_entry_count", i64 100}263; CHECK: [[PROF15]] = !{!"unknown", !"chr"}264; CHECK: [[PROF16]] = !{!"branch_weights", i32 1000, i32 0}265; CHECK: [[PROF17]] = !{!"branch_weights", i32 1, i32 0}266; CHECK: [[PROF18]] = !{!"branch_weights", i32 0, i32 1}267;.268