brintos

brintos / llvm-project-archived public Read only

0
0
Text · 23.2 KiB · 4ac4675 Raw
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