648 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --version 52; RUN: opt < %s -S -passes="inline" | FileCheck %s3 4define void @callee(i32 %a, i32 %b) #0 {5; CHECK: Function Attrs: mustprogress6; CHECK-LABEL: define void @callee(7; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0:[0-9]+]] {8; CHECK-NEXT: [[ENTRY:.*:]]9; CHECK-NEXT: br label %[[FOR_COND:.*]]10; CHECK: [[FOR_COND]]:11; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]12; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_END:.*]]13; CHECK: [[FOR_BODY]]:14; CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP0:![0-9]+]]15; CHECK: [[FOR_END]]:16; CHECK-NEXT: br label %[[WHILE_BODY:.*]]17; CHECK: [[WHILE_BODY]]:18; CHECK-NEXT: br label %[[WHILE_BODY]]19;20entry:21 br label %for.cond22for.cond:23 %cmp = icmp slt i32 %a, %b24 br i1 %cmp, label %for.body, label %for.end25for.body:26 br label %for.cond, !llvm.loop !027for.end:28 br label %while.body29while.body:30 br label %while.body31}32 33define void @caller(i32 %a, i32 %b) #1 {34; CHECK: Function Attrs: noinline35; CHECK-LABEL: define void @caller(36; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR1:[0-9]+]] {37; CHECK-NEXT: [[ENTRY:.*:]]38; CHECK-NEXT: br label %[[FOR_COND:.*]]39; CHECK: [[FOR_COND]]:40; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]41; CHECK-NEXT: br i1 [[CMP]], label %[[CALLEE_EXIT:.*]], label %[[FOR_END:.*]]42; CHECK: [[CALLEE_EXIT]]:43; CHECK-NEXT: br label %[[FOR_COND]]44; CHECK: [[FOR_END]]:45; CHECK-NEXT: br label %[[FOR_COND_I:.*]]46; CHECK: [[FOR_COND_I]]:47; CHECK-NEXT: br label %[[FOR_COND_I]], !llvm.loop [[LOOP0]]48; CHECK: [[CALLEE_EXIT1:.*:]]49; CHECK-NEXT: ret void50;51entry:52 br label %for.cond53for.cond:54 %cmp = icmp slt i32 %a, %b55 br i1 %cmp, label %for.body, label %for.end56for.body:57 br label %for.cond58for.end:59 call void @callee(i32 0, i32 5)60 ret void61}62 63define void @callee_no_metadata(i32 %a, i32 %b) {64; CHECK-LABEL: define void @callee_no_metadata(65; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {66; CHECK-NEXT: [[ENTRY:.*:]]67; CHECK-NEXT: br label %[[FOR_COND:.*]]68; CHECK: [[FOR_COND]]:69; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]70; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_END:.*]]71; CHECK: [[FOR_BODY]]:72; CHECK-NEXT: br label %[[FOR_COND]]73; CHECK: [[FOR_END]]:74; CHECK-NEXT: br label %[[WHILE_BODY:.*]]75; CHECK: [[WHILE_BODY]]:76; CHECK-NEXT: br label %[[WHILE_BODY]]77;78entry:79 br label %for.cond80for.cond:81 %cmp = icmp slt i32 %a, %b82 br i1 %cmp, label %for.body, label %for.end83for.body:84 br label %for.cond85for.end:86 br label %while.body87while.body:88 br label %while.body89}90 91define void @caller_no_metadata(i32 %a, i32 %b) {92; CHECK-LABEL: define void @caller_no_metadata(93; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {94; CHECK-NEXT: [[ENTRY:.*:]]95; CHECK-NEXT: br label %[[FOR_COND:.*]]96; CHECK: [[FOR_COND]]:97; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]98; CHECK-NEXT: br i1 [[CMP]], label %[[CALLEE_NO_METADATA_EXIT:.*]], label %[[FOR_END:.*]]99; CHECK: [[CALLEE_NO_METADATA_EXIT]]:100; CHECK-NEXT: br label %[[FOR_COND]]101; CHECK: [[FOR_END]]:102; CHECK-NEXT: br label %[[FOR_COND_I:.*]]103; CHECK: [[FOR_COND_I]]:104; CHECK-NEXT: br label %[[FOR_COND_I]]105; CHECK: [[CALLEE_NO_METADATA_EXIT1:.*:]]106; CHECK-NEXT: ret void107;108entry:109 br label %for.cond110for.cond:111 %cmp = icmp slt i32 %a, %b112 br i1 %cmp, label %for.body, label %for.end113for.body:114 br label %for.cond115for.end:116 call void @callee_no_metadata(i32 0, i32 5)117 ret void118}119 120define void @callee_mustprogress(i32 %a, i32 %b) #0 {121; CHECK: Function Attrs: mustprogress122; CHECK-LABEL: define void @callee_mustprogress(123; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {124; CHECK-NEXT: [[ENTRY:.*:]]125; CHECK-NEXT: br label %[[FOR_COND:.*]]126; CHECK: [[FOR_COND]]:127; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]128; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_END:.*]]129; CHECK: [[FOR_BODY]]:130; CHECK-NEXT: br label %[[FOR_COND]]131; CHECK: [[FOR_END]]:132; CHECK-NEXT: br label %[[WHILE_BODY:.*]]133; CHECK: [[WHILE_BODY]]:134; CHECK-NEXT: br label %[[WHILE_BODY]]135;136entry:137 br label %for.cond138for.cond:139 %cmp = icmp slt i32 %a, %b140 br i1 %cmp, label %for.body, label %for.end141for.body:142 br label %for.cond143for.end:144 br label %while.body145while.body:146 br label %while.body147}148 149define void @caller_mustprogress(i32 %a, i32 %b) #0 {150; CHECK: Function Attrs: mustprogress151; CHECK-LABEL: define void @caller_mustprogress(152; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {153; CHECK-NEXT: [[ENTRY:.*:]]154; CHECK-NEXT: br label %[[FOR_COND:.*]]155; CHECK: [[FOR_COND]]:156; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]157; CHECK-NEXT: br i1 [[CMP]], label %[[CALLEE_MUSTPROGRESS_EXIT:.*]], label %[[FOR_END:.*]]158; CHECK: [[CALLEE_MUSTPROGRESS_EXIT]]:159; CHECK-NEXT: br label %[[FOR_COND]]160; CHECK: [[FOR_END]]:161; CHECK-NEXT: br label %[[FOR_COND_I:.*]]162; CHECK: [[FOR_COND_I]]:163; CHECK-NEXT: br label %[[FOR_COND_I]]164; CHECK: [[CALLEE_MUSTPROGRESS_EXIT1:.*:]]165; CHECK-NEXT: ret void166;167entry:168 br label %for.cond169for.cond:170 %cmp = icmp slt i32 %a, %b171 br i1 %cmp, label %for.body, label %for.end172for.body:173 br label %for.cond174for.end:175 call void @callee_mustprogress(i32 0, i32 5)176 ret void177}178 179define void @caller_mustprogress_callee_no_metadata(i32 %a, i32 %b) #0 {180; CHECK-LABEL: define void @caller_mustprogress_callee_no_metadata(181; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {182; CHECK-NEXT: [[ENTRY:.*:]]183; CHECK-NEXT: br label %[[FOR_COND:.*]]184; CHECK: [[FOR_COND]]:185; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]186; CHECK-NEXT: br i1 [[CMP]], label %[[CALLEE_NO_METADATA_EXIT:.*]], label %[[FOR_END:.*]]187; CHECK: [[CALLEE_NO_METADATA_EXIT]]:188; CHECK-NEXT: br label %[[FOR_COND]]189; CHECK: [[FOR_END]]:190; CHECK-NEXT: br label %[[FOR_COND_I:.*]]191; CHECK: [[FOR_COND_I]]:192; CHECK-NEXT: br label %[[FOR_COND_I]]193; CHECK: [[CALLEE_NO_METADATA_EXIT1:.*:]]194; CHECK-NEXT: ret void195;196entry:197 br label %for.cond198for.cond:199 %cmp = icmp slt i32 %a, %b200 br i1 %cmp, label %for.body, label %for.end201for.body:202 br label %for.cond203for.end:204 call void @callee_no_metadata(i32 0, i32 5)205 ret void206}207 208define void @callee_multiple(i32 %a, i32 %b) #0 {209; CHECK: Function Attrs: mustprogress210; CHECK-LABEL: define void @callee_multiple(211; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {212; CHECK-NEXT: [[ENTRY:.*:]]213; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4214; CHECK-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4215; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4216; CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4217; CHECK-NEXT: store i32 [[B]], ptr [[B_ADDR]], align 4218; CHECK-NEXT: br label %[[FOR_COND:.*]]219; CHECK: [[FOR_COND]]:220; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4221; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR]], align 4222; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP1]]223; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_END:.*]]224; CHECK: [[FOR_BODY]]:225; CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP2:![0-9]+]]226; CHECK: [[FOR_END]]:227; CHECK-NEXT: store i32 0, ptr [[I]], align 4228; CHECK-NEXT: br label %[[FOR_COND1:.*]]229; CHECK: [[FOR_COND1]]:230; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4231; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[TMP2]], 10232; CHECK-NEXT: br i1 [[CMP2]], label %[[FOR_BODY3:.*]], label %[[FOR_END4:.*]]233; CHECK: [[FOR_BODY3]]:234; CHECK-NEXT: br label %[[FOR_INC:.*]]235; CHECK: [[FOR_INC]]:236; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[I]], align 4237; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP3]], 1238; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4239; CHECK-NEXT: br label %[[FOR_COND1]], !llvm.loop [[LOOP3:![0-9]+]]240; CHECK: [[FOR_END4]]:241; CHECK-NEXT: br label %[[WHILE_BODY:.*]]242; CHECK: [[WHILE_BODY]]:243; CHECK-NEXT: br label %[[WHILE_BODY]]244;245entry:246 %a.addr = alloca i32, align 4247 %b.addr = alloca i32, align 4248 %i = alloca i32, align 4249 store i32 %a, ptr %a.addr, align 4250 store i32 %b, ptr %b.addr, align 4251 br label %for.cond252for.cond:253 %0 = load i32, ptr %a.addr, align 4254 %1 = load i32, ptr %b.addr, align 4255 %cmp = icmp slt i32 %0, %1256 br i1 %cmp, label %for.body, label %for.end257for.body:258 br label %for.cond, !llvm.loop !2259for.end:260 store i32 0, ptr %i, align 4261 br label %for.cond1262for.cond1:263 %2 = load i32, ptr %i, align 4264 %cmp2 = icmp slt i32 %2, 10265 br i1 %cmp2, label %for.body3, label %for.end4266for.body3:267 br label %for.inc268for.inc:269 %3 = load i32, ptr %i, align 4270 %inc = add nsw i32 %3, 1271 store i32 %inc, ptr %i, align 4272 br label %for.cond1, !llvm.loop !4273for.end4:274 br label %while.body275while.body:276 br label %while.body277}278 279define void @caller_multiple(i32 %a, i32 %b) #1 {280; CHECK: Function Attrs: noinline281; CHECK-LABEL: define void @caller_multiple(282; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR1]] {283; CHECK-NEXT: [[ENTRY:.*:]]284; CHECK-NEXT: [[A_ADDR_I:%.*]] = alloca i32, align 4285; CHECK-NEXT: [[B_ADDR_I:%.*]] = alloca i32, align 4286; CHECK-NEXT: [[I_I:%.*]] = alloca i32, align 4287; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4288; CHECK-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4289; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4290; CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4291; CHECK-NEXT: store i32 [[B]], ptr [[B_ADDR]], align 4292; CHECK-NEXT: br label %[[FOR_COND:.*]]293; CHECK: [[FOR_COND]]:294; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4295; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR]], align 4296; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP1]]297; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_END:.*]]298; CHECK: [[FOR_BODY]]:299; CHECK-NEXT: br label %[[FOR_COND]]300; CHECK: [[FOR_END]]:301; CHECK-NEXT: store i32 0, ptr [[I]], align 4302; CHECK-NEXT: br label %[[FOR_COND1:.*]]303; CHECK: [[FOR_COND1]]:304; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4305; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[TMP2]], 10306; CHECK-NEXT: br i1 [[CMP2]], label %[[FOR_BODY3:.*]], label %[[FOR_END4:.*]]307; CHECK: [[FOR_BODY3]]:308; CHECK-NEXT: br label %[[FOR_INC:.*]]309; CHECK: [[FOR_INC]]:310; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[I]], align 4311; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP3]], 1312; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4313; CHECK-NEXT: br label %[[FOR_COND1]]314; CHECK: [[FOR_END4]]:315; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[A_ADDR_I]])316; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[B_ADDR_I]])317; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I_I]])318; CHECK-NEXT: store i32 0, ptr [[A_ADDR_I]], align 4319; CHECK-NEXT: store i32 5, ptr [[B_ADDR_I]], align 4320; CHECK-NEXT: br label %[[FOR_COND_I:.*]]321; CHECK: [[FOR_COND_I]]:322; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[A_ADDR_I]], align 4323; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[B_ADDR_I]], align 4324; CHECK-NEXT: [[CMP_I:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]]325; CHECK-NEXT: br i1 [[CMP_I]], label %[[FOR_BODY_I:.*]], label %[[FOR_END_I:.*]]326; CHECK: [[FOR_BODY_I]]:327; CHECK-NEXT: br label %[[FOR_COND_I]], !llvm.loop [[LOOP2]]328; CHECK: [[FOR_END_I]]:329; CHECK-NEXT: store i32 0, ptr [[I_I]], align 4330; CHECK-NEXT: br label %[[FOR_COND1_I:.*]]331; CHECK: [[FOR_COND1_I]]:332; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[I_I]], align 4333; CHECK-NEXT: [[CMP2_I:%.*]] = icmp slt i32 [[TMP6]], 10334; CHECK-NEXT: br i1 [[CMP2_I]], label %[[FOR_BODY3_I:.*]], label %[[CALLEE_MULTIPLE_EXIT:.*]]335; CHECK: [[FOR_BODY3_I]]:336; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[I_I]], align 4337; CHECK-NEXT: [[INC_I:%.*]] = add nsw i32 [[TMP7]], 1338; CHECK-NEXT: store i32 [[INC_I]], ptr [[I_I]], align 4339; CHECK-NEXT: br label %[[FOR_COND1_I]], !llvm.loop [[LOOP3]]340; CHECK: [[CALLEE_MULTIPLE_EXIT]]:341; CHECK-NEXT: br label %[[WHILE_BODY_I:.*]]342; CHECK: [[WHILE_BODY_I]]:343; CHECK-NEXT: br label %[[WHILE_BODY_I]]344; CHECK: [[CALLEE_MULTIPLE_EXIT1:.*:]]345; CHECK-NEXT: ret void346;347entry:348 %a.addr = alloca i32, align 4349 %b.addr = alloca i32, align 4350 %i = alloca i32, align 4351 store i32 %a, ptr %a.addr, align 4352 store i32 %b, ptr %b.addr, align 4353 br label %for.cond354for.cond:355 %0 = load i32, ptr %a.addr, align 4356 %1 = load i32, ptr %b.addr, align 4357 %cmp = icmp slt i32 %0, %1358 br i1 %cmp, label %for.body, label %for.end359for.body:360 br label %for.cond361for.end:362 store i32 0, ptr %i, align 4363 br label %for.cond1364for.cond1:365 %2 = load i32, ptr %i, align 4366 %cmp2 = icmp slt i32 %2, 10367 br i1 %cmp2, label %for.body3, label %for.end4368for.body3:369 br label %for.inc370for.inc:371 %3 = load i32, ptr %i, align 4372 %inc = add nsw i32 %3, 1373 store i32 %inc, ptr %i, align 4374 br label %for.cond1375for.end4:376 call void @callee_multiple(i32 0, i32 5)377 ret void378}379 380define void @callee_nested(i32 %a, i32 %b) #0 {381; CHECK: Function Attrs: mustprogress382; CHECK-LABEL: define void @callee_nested(383; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {384; CHECK-NEXT: [[ENTRY:.*:]]385; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4386; CHECK-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4387; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4388; CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4389; CHECK-NEXT: store i32 [[B]], ptr [[B_ADDR]], align 4390; CHECK-NEXT: br label %[[FOR_COND:.*]]391; CHECK: [[FOR_COND]]:392; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4393; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR]], align 4394; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP1]]395; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_END:.*]]396; CHECK: [[FOR_BODY]]:397; CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP0]]398; CHECK: [[FOR_END]]:399; CHECK-NEXT: store i32 0, ptr [[I]], align 4400; CHECK-NEXT: br label %[[FOR_COND1:.*]]401; CHECK: [[FOR_COND1]]:402; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4403; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[TMP2]], 10404; CHECK-NEXT: br i1 [[CMP2]], label %[[FOR_BODY3:.*]], label %[[FOR_END8:.*]]405; CHECK: [[FOR_BODY3]]:406; CHECK-NEXT: br label %[[FOR_COND4:.*]]407; CHECK: [[FOR_COND4]]:408; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[B_ADDR]], align 4409; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[A_ADDR]], align 4410; CHECK-NEXT: [[CMP5:%.*]] = icmp slt i32 [[TMP3]], [[TMP4]]411; CHECK-NEXT: br i1 [[CMP5]], label %[[FOR_BODY6:.*]], label %[[FOR_END7:.*]]412; CHECK: [[FOR_BODY6]]:413; CHECK-NEXT: br label %[[FOR_COND4]], !llvm.loop [[LOOP2]]414; CHECK: [[FOR_END7]]:415; CHECK-NEXT: br label %[[FOR_INC:.*]]416; CHECK: [[FOR_INC]]:417; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4418; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1419; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4420; CHECK-NEXT: br label %[[FOR_COND1]], !llvm.loop [[LOOP4:![0-9]+]]421; CHECK: [[FOR_END8]]:422; CHECK-NEXT: br label %[[WHILE_BODY:.*]]423; CHECK: [[WHILE_BODY]]:424; CHECK-NEXT: br label %[[WHILE_BODY]]425;426entry:427 %a.addr = alloca i32, align 4428 %b.addr = alloca i32, align 4429 %i = alloca i32, align 4430 store i32 %a, ptr %a.addr, align 4431 store i32 %b, ptr %b.addr, align 4432 br label %for.cond433for.cond:434 %0 = load i32, ptr %a.addr, align 4435 %1 = load i32, ptr %b.addr, align 4436 %cmp = icmp slt i32 %0, %1437 br i1 %cmp, label %for.body, label %for.end438for.body:439 br label %for.cond, !llvm.loop !0440for.end:441 store i32 0, ptr %i, align 4442 br label %for.cond1443for.cond1:444 %2 = load i32, ptr %i, align 4445 %cmp2 = icmp slt i32 %2, 10446 br i1 %cmp2, label %for.body3, label %for.end8447for.body3:448 br label %for.cond4449for.cond4:450 %3 = load i32, ptr %b.addr, align 4451 %4 = load i32, ptr %a.addr, align 4452 %cmp5 = icmp slt i32 %3, %4453 br i1 %cmp5, label %for.body6, label %for.end7454for.body6:455 br label %for.cond4, !llvm.loop !2456for.end7:457 br label %for.inc458for.inc:459 %5 = load i32, ptr %i, align 4460 %inc = add nsw i32 %5, 1461 store i32 %inc, ptr %i, align 4462 br label %for.cond1, !llvm.loop !3463for.end8:464 br label %while.body465while.body:466 br label %while.body467}468 469define void @caller_nested(i32 %a, i32 %b) #1 {470; CHECK: Function Attrs: noinline471; CHECK-LABEL: define void @caller_nested(472; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) #[[ATTR1]] {473; CHECK-NEXT: [[ENTRY:.*:]]474; CHECK-NEXT: [[A_ADDR_I:%.*]] = alloca i32, align 4475; CHECK-NEXT: [[B_ADDR_I:%.*]] = alloca i32, align 4476; CHECK-NEXT: [[I_I:%.*]] = alloca i32, align 4477; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4478; CHECK-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4479; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4480; CHECK-NEXT: [[I9:%.*]] = alloca i32, align 4481; CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4482; CHECK-NEXT: store i32 [[B]], ptr [[B_ADDR]], align 4483; CHECK-NEXT: br label %[[FOR_COND:.*]]484; CHECK: [[FOR_COND]]:485; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4486; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR]], align 4487; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP1]]488; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_END8:.*]]489; CHECK: [[FOR_BODY]]:490; CHECK-NEXT: store i32 0, ptr [[I]], align 4491; CHECK-NEXT: br label %[[FOR_COND1:.*]]492; CHECK: [[FOR_COND1]]:493; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4494; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[TMP2]], 10495; CHECK-NEXT: br i1 [[CMP2]], label %[[FOR_BODY3:.*]], label %[[FOR_END7:.*]]496; CHECK: [[FOR_BODY3]]:497; CHECK-NEXT: br label %[[FOR_COND4:.*]]498; CHECK: [[FOR_COND4]]:499; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[B_ADDR]], align 4500; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[A_ADDR]], align 4501; CHECK-NEXT: [[CMP5:%.*]] = icmp slt i32 [[TMP3]], [[TMP4]]502; CHECK-NEXT: br i1 [[CMP5]], label %[[FOR_BODY6:.*]], label %[[FOR_END:.*]]503; CHECK: [[FOR_BODY6]]:504; CHECK-NEXT: br label %[[FOR_COND4]]505; CHECK: [[FOR_END]]:506; CHECK-NEXT: br label %[[FOR_INC:.*]]507; CHECK: [[FOR_INC]]:508; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4509; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1510; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4511; CHECK-NEXT: br label %[[FOR_COND1]]512; CHECK: [[FOR_END7]]:513; CHECK-NEXT: br label %[[FOR_COND]]514; CHECK: [[FOR_END8]]:515; CHECK-NEXT: store i32 0, ptr [[I9]], align 4516; CHECK-NEXT: br label %[[FOR_COND10:.*]]517; CHECK: [[FOR_COND10]]:518; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[I9]], align 4519; CHECK-NEXT: [[CMP11:%.*]] = icmp slt i32 [[TMP6]], 10520; CHECK-NEXT: br i1 [[CMP11]], label %[[FOR_BODY12:.*]], label %[[FOR_END15:.*]]521; CHECK: [[FOR_BODY12]]:522; CHECK-NEXT: br label %[[FOR_INC13:.*]]523; CHECK: [[FOR_INC13]]:524; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[I9]], align 4525; CHECK-NEXT: [[INC14:%.*]] = add nsw i32 [[TMP7]], 1526; CHECK-NEXT: store i32 [[INC14]], ptr [[I9]], align 4527; CHECK-NEXT: br label %[[FOR_COND10]]528; CHECK: [[FOR_END15]]:529; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[A_ADDR_I]])530; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[B_ADDR_I]])531; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I_I]])532; CHECK-NEXT: store i32 0, ptr [[A_ADDR_I]], align 4533; CHECK-NEXT: store i32 5, ptr [[B_ADDR_I]], align 4534; CHECK-NEXT: br label %[[FOR_COND_I:.*]]535; CHECK: [[FOR_COND_I]]:536; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR_I]], align 4537; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[B_ADDR_I]], align 4538; CHECK-NEXT: [[CMP_I:%.*]] = icmp slt i32 [[TMP8]], [[TMP9]]539; CHECK-NEXT: br i1 [[CMP_I]], label %[[FOR_BODY_I:.*]], label %[[FOR_END_I:.*]]540; CHECK: [[FOR_BODY_I]]:541; CHECK-NEXT: br label %[[FOR_COND_I]], !llvm.loop [[LOOP0]]542; CHECK: [[FOR_END_I]]:543; CHECK-NEXT: store i32 0, ptr [[I_I]], align 4544; CHECK-NEXT: br label %[[FOR_COND1_I:.*]]545; CHECK: [[FOR_COND1_I]]:546; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[I_I]], align 4547; CHECK-NEXT: [[CMP2_I:%.*]] = icmp slt i32 [[TMP10]], 10548; CHECK-NEXT: br i1 [[CMP2_I]], label %[[FOR_BODY3_I:.*]], label %[[CALLEE_NESTED_EXIT:.*]]549; CHECK: [[FOR_BODY3_I]]:550; CHECK-NEXT: br label %[[FOR_COND4_I:.*]]551; CHECK: [[FOR_COND4_I]]:552; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[B_ADDR_I]], align 4553; CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[A_ADDR_I]], align 4554; CHECK-NEXT: [[CMP5_I:%.*]] = icmp slt i32 [[TMP11]], [[TMP12]]555; CHECK-NEXT: br i1 [[CMP5_I]], label %[[FOR_BODY6_I:.*]], label %[[FOR_END7_I:.*]]556; CHECK: [[FOR_BODY6_I]]:557; CHECK-NEXT: br label %[[FOR_COND4_I]], !llvm.loop [[LOOP2]]558; CHECK: [[FOR_END7_I]]:559; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[I_I]], align 4560; CHECK-NEXT: [[INC_I:%.*]] = add nsw i32 [[TMP13]], 1561; CHECK-NEXT: store i32 [[INC_I]], ptr [[I_I]], align 4562; CHECK-NEXT: br label %[[FOR_COND1_I]], !llvm.loop [[LOOP4]]563; CHECK: [[CALLEE_NESTED_EXIT]]:564; CHECK-NEXT: br label %[[WHILE_BODY_I:.*]]565; CHECK: [[WHILE_BODY_I]]:566; CHECK-NEXT: br label %[[WHILE_BODY_I]]567; CHECK: [[CALLEE_NESTED_EXIT1:.*:]]568; CHECK-NEXT: ret void569;570entry:571 %a.addr = alloca i32, align 4572 %b.addr = alloca i32, align 4573 %i = alloca i32, align 4574 %i9 = alloca i32, align 4575 store i32 %a, ptr %a.addr, align 4576 store i32 %b, ptr %b.addr, align 4577 br label %for.cond578for.cond:579 %0 = load i32, ptr %a.addr, align 4580 %1 = load i32, ptr %b.addr, align 4581 %cmp = icmp slt i32 %0, %1582 br i1 %cmp, label %for.body, label %for.end8583for.body:584 store i32 0, ptr %i, align 4585 br label %for.cond1586for.cond1:587 %2 = load i32, ptr %i, align 4588 %cmp2 = icmp slt i32 %2, 10589 br i1 %cmp2, label %for.body3, label %for.end7590for.body3:591 br label %for.cond4592for.cond4:593 %3 = load i32, ptr %b.addr, align 4594 %4 = load i32, ptr %a.addr, align 4595 %cmp5 = icmp slt i32 %3, %4596 br i1 %cmp5, label %for.body6, label %for.end597for.body6:598 br label %for.cond4599for.end:600 br label %for.inc601for.inc:602 %5 = load i32, ptr %i, align 4603 %inc = add nsw i32 %5, 1604 store i32 %inc, ptr %i, align 4605 br label %for.cond1606for.end7:607 br label %for.cond608for.end8:609 store i32 0, ptr %i9, align 4610 br label %for.cond10611for.cond10:612 %6 = load i32, ptr %i9, align 4613 %cmp11 = icmp slt i32 %6, 10614 br i1 %cmp11, label %for.body12, label %for.end15615for.body12:616 br label %for.inc13617for.inc13:618 %7 = load i32, ptr %i9, align 4619 %inc14 = add nsw i32 %7, 1620 store i32 %inc14, ptr %i9, align 4621 br label %for.cond10622for.end15:623 call void @callee_nested(i32 0, i32 5)624 ret void625}626 627 628 629attributes #0 = { mustprogress }630attributes #1 = { noinline }631attributes #2 = { noinline mustprogress }632 633!0 = distinct !{!0, !1}634!1 = !{!"llvm.loop.mustprogress"}635!2 = distinct !{!2, !1}636!3 = distinct !{!3, !1}637!4 = distinct !{!4, !1}638!5 = distinct !{!5, !1}639!6 = distinct !{!6, !1}640!7 = distinct !{!7, !1}641;.642; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]]}643; CHECK: [[META1]] = !{!"llvm.loop.mustprogress"}644; CHECK: [[LOOP2]] = distinct !{[[LOOP2]], [[META1]]}645; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META1]]}646; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]]}647;.648