brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.5 KiB · a205fbd Raw
881 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals --version 22; RUN: opt -passes=function-attrs -S < %s | FileCheck --check-prefixes=COMMON,FNATTRS %s3; RUN: opt -passes=attributor-light -S < %s | FileCheck --check-prefixes=COMMON,ATTRIBUTOR %s4 5declare i32 @get_val()6 7declare void @cold0() cold8declare void @cold1() cold9declare void @cold_at_cb()10 11declare void @not_cold0()12declare void @not_cold1()13declare void @not_cold2()14 15define void @test_no_exit_fail() {16; COMMON: Function Attrs: nofree norecurse noreturn nosync nounwind memory(none)17; COMMON-LABEL: define void @test_no_exit_fail18; COMMON-SAME: () #[[ATTR1:[0-9]+]] {19; COMMON-NEXT:  entry:20; COMMON-NEXT:    br label [[WHILE_BODY:%.*]]21; COMMON:       while.body:22; COMMON-NEXT:    br label [[WHILE_BODY]]23;24entry:25  br label %while.body26 27while.body:28  br label %while.body29}30 31define void @test_no_exit_fail2() {32; COMMON: Function Attrs: noreturn33; COMMON-LABEL: define void @test_no_exit_fail234; COMMON-SAME: () #[[ATTR2:[0-9]+]] {35; COMMON-NEXT:  entry:36; COMMON-NEXT:    br label [[WHILE_BODY:%.*]]37; COMMON:       while.body:38; COMMON-NEXT:    call void @not_cold0()39; COMMON-NEXT:    br label [[WHILE_BODY2:%.*]]40; COMMON:       while.body2:41; COMMON-NEXT:    call void @not_cold1()42; COMMON-NEXT:    br label [[WHILE_BODY]]43;44entry:45  br label %while.body46 47while.body:48  call void @not_cold0()49  br label %while.body250 51while.body2:52  call void @not_cold1()53  br label %while.body54}55 56define void @test_no_exit() {57; FNATTRS: Function Attrs: cold noreturn58; FNATTRS-LABEL: define void @test_no_exit59; FNATTRS-SAME: () #[[ATTR3:[0-9]+]] {60; FNATTRS-NEXT:  entry:61; FNATTRS-NEXT:    br label [[WHILE_BODY:%.*]]62; FNATTRS:       while.body:63; FNATTRS-NEXT:    call void @cold0()64; FNATTRS-NEXT:    br label [[WHILE_BODY]]65;66; ATTRIBUTOR: Function Attrs: noreturn67; ATTRIBUTOR-LABEL: define void @test_no_exit68; ATTRIBUTOR-SAME: () #[[ATTR2]] {69; ATTRIBUTOR-NEXT:  entry:70; ATTRIBUTOR-NEXT:    br label [[WHILE_BODY:%.*]]71; ATTRIBUTOR:       while.body:72; ATTRIBUTOR-NEXT:    call void @cold0()73; ATTRIBUTOR-NEXT:    br label [[WHILE_BODY]]74;75entry:76  br label %while.body77 78while.body:79  call void @cold0()80  br label %while.body81}82 83define void @test_no_exit2() {84; FNATTRS: Function Attrs: cold noreturn85; FNATTRS-LABEL: define void @test_no_exit286; FNATTRS-SAME: () #[[ATTR3]] {87; FNATTRS-NEXT:  entry:88; FNATTRS-NEXT:    br label [[WHILE_BODY:%.*]]89; FNATTRS:       while.body:90; FNATTRS-NEXT:    call void @not_cold0()91; FNATTRS-NEXT:    br label [[WHILE_BODY2:%.*]]92; FNATTRS:       while.body2:93; FNATTRS-NEXT:    call void @cold1()94; FNATTRS-NEXT:    br label [[WHILE_BODY]]95;96; ATTRIBUTOR: Function Attrs: noreturn97; ATTRIBUTOR-LABEL: define void @test_no_exit298; ATTRIBUTOR-SAME: () #[[ATTR2]] {99; ATTRIBUTOR-NEXT:  entry:100; ATTRIBUTOR-NEXT:    br label [[WHILE_BODY:%.*]]101; ATTRIBUTOR:       while.body:102; ATTRIBUTOR-NEXT:    call void @not_cold0()103; ATTRIBUTOR-NEXT:    br label [[WHILE_BODY2:%.*]]104; ATTRIBUTOR:       while.body2:105; ATTRIBUTOR-NEXT:    call void @cold1()106; ATTRIBUTOR-NEXT:    br label [[WHILE_BODY]]107;108entry:109  br label %while.body110 111while.body:112  call void @not_cold0()113  br label %while.body2114 115while.body2:116  call void @cold1()117  br label %while.body118}119 120define dso_local void @test_entry(i32 noundef %x) {121; FNATTRS: Function Attrs: cold122; FNATTRS-LABEL: define dso_local void @test_entry123; FNATTRS-SAME: (i32 noundef [[X:%.*]]) #[[ATTR0:[0-9]+]] {124; FNATTRS-NEXT:  entry:125; FNATTRS-NEXT:    tail call void @cold0()126; FNATTRS-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0127; FNATTRS-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]128; FNATTRS:       if.then:129; FNATTRS-NEXT:    tail call void @not_cold0()130; FNATTRS-NEXT:    br label [[IF_END]]131; FNATTRS:       if.end:132; FNATTRS-NEXT:    tail call void @not_cold1()133; FNATTRS-NEXT:    ret void134;135; ATTRIBUTOR-LABEL: define dso_local void @test_entry136; ATTRIBUTOR-SAME: (i32 noundef [[X:%.*]]) {137; ATTRIBUTOR-NEXT:  entry:138; ATTRIBUTOR-NEXT:    tail call void @cold0()139; ATTRIBUTOR-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0140; ATTRIBUTOR-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]141; ATTRIBUTOR:       if.then:142; ATTRIBUTOR-NEXT:    tail call void @not_cold0()143; ATTRIBUTOR-NEXT:    br label [[IF_END]]144; ATTRIBUTOR:       if.end:145; ATTRIBUTOR-NEXT:    tail call void @not_cold1()146; ATTRIBUTOR-NEXT:    ret void147;148entry:149  tail call void @cold0()150  %tobool.not = icmp eq i32 %x, 0151  br i1 %tobool.not, label %if.end, label %if.then152 153if.then:154  tail call void @not_cold0()155  br label %if.end156 157if.end:158  tail call void @not_cold1()159  ret void160}161 162define dso_local void @test_hot_fail(i32 noundef %x) hot {163; FNATTRS: Function Attrs: hot164; FNATTRS-LABEL: define dso_local void @test_hot_fail165; FNATTRS-SAME: (i32 noundef [[X:%.*]]) #[[ATTR4:[0-9]+]] {166; FNATTRS-NEXT:  entry:167; FNATTRS-NEXT:    tail call void @cold0()168; FNATTRS-NEXT:    ret void169;170; ATTRIBUTOR: Function Attrs: hot171; ATTRIBUTOR-LABEL: define dso_local void @test_hot_fail172; ATTRIBUTOR-SAME: (i32 noundef [[X:%.*]]) #[[ATTR3:[0-9]+]] {173; ATTRIBUTOR-NEXT:  entry:174; ATTRIBUTOR-NEXT:    tail call void @cold0()175; ATTRIBUTOR-NEXT:    ret void176;177entry:178  tail call void @cold0()179  ret void180}181 182define dso_local void @test_br2(i32 noundef %x) {183; FNATTRS: Function Attrs: cold184; FNATTRS-LABEL: define dso_local void @test_br2185; FNATTRS-SAME: (i32 noundef [[X:%.*]]) #[[ATTR0]] {186; FNATTRS-NEXT:  entry:187; FNATTRS-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0188; FNATTRS-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]189; FNATTRS:       if.then:190; FNATTRS-NEXT:    tail call void @cold0()191; FNATTRS-NEXT:    br label [[IF_END:%.*]]192; FNATTRS:       if.else:193; FNATTRS-NEXT:    tail call void @cold1()194; FNATTRS-NEXT:    br label [[IF_END]]195; FNATTRS:       if.end:196; FNATTRS-NEXT:    ret void197;198; ATTRIBUTOR-LABEL: define dso_local void @test_br2199; ATTRIBUTOR-SAME: (i32 noundef [[X:%.*]]) {200; ATTRIBUTOR-NEXT:  entry:201; ATTRIBUTOR-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0202; ATTRIBUTOR-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]203; ATTRIBUTOR:       if.then:204; ATTRIBUTOR-NEXT:    tail call void @cold0()205; ATTRIBUTOR-NEXT:    br label [[IF_END:%.*]]206; ATTRIBUTOR:       if.else:207; ATTRIBUTOR-NEXT:    tail call void @cold1()208; ATTRIBUTOR-NEXT:    br label [[IF_END]]209; ATTRIBUTOR:       if.end:210; ATTRIBUTOR-NEXT:    ret void211;212entry:213  %tobool.not = icmp eq i32 %x, 0214  br i1 %tobool.not, label %if.else, label %if.then215 216if.then:217  tail call void @cold0()218  br label %if.end219 220if.else:221  tail call void @cold1()222  br label %if.end223 224if.end:225  ret void226}227 228define dso_local void @test_exit(i32 noundef %x) {229; FNATTRS: Function Attrs: cold230; FNATTRS-LABEL: define dso_local void @test_exit231; FNATTRS-SAME: (i32 noundef [[X:%.*]]) #[[ATTR0]] {232; FNATTRS-NEXT:  entry:233; FNATTRS-NEXT:    tail call void @not_cold0()234; FNATTRS-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0235; FNATTRS-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]236; FNATTRS:       if.then:237; FNATTRS-NEXT:    tail call void @not_cold1()238; FNATTRS-NEXT:    br label [[IF_END:%.*]]239; FNATTRS:       if.else:240; FNATTRS-NEXT:    tail call void @not_cold2()241; FNATTRS-NEXT:    br label [[IF_END]]242; FNATTRS:       if.end:243; FNATTRS-NEXT:    tail call void @cold0()244; FNATTRS-NEXT:    ret void245;246; ATTRIBUTOR-LABEL: define dso_local void @test_exit247; ATTRIBUTOR-SAME: (i32 noundef [[X:%.*]]) {248; ATTRIBUTOR-NEXT:  entry:249; ATTRIBUTOR-NEXT:    tail call void @not_cold0()250; ATTRIBUTOR-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0251; ATTRIBUTOR-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]252; ATTRIBUTOR:       if.then:253; ATTRIBUTOR-NEXT:    tail call void @not_cold1()254; ATTRIBUTOR-NEXT:    br label [[IF_END:%.*]]255; ATTRIBUTOR:       if.else:256; ATTRIBUTOR-NEXT:    tail call void @not_cold2()257; ATTRIBUTOR-NEXT:    br label [[IF_END]]258; ATTRIBUTOR:       if.end:259; ATTRIBUTOR-NEXT:    tail call void @cold0()260; ATTRIBUTOR-NEXT:    ret void261;262entry:263  tail call void @not_cold0()264  %tobool.not = icmp eq i32 %x, 0265  br i1 %tobool.not, label %if.else, label %if.then266 267if.then:268  tail call void @not_cold1()269  br label %if.end270 271if.else:272  tail call void @not_cold2()273  br label %if.end274 275if.end:276  tail call void @cold0()277  ret void278}279 280define dso_local void @test_complex(i32 noundef %x) {281; FNATTRS: Function Attrs: cold282; FNATTRS-LABEL: define dso_local void @test_complex283; FNATTRS-SAME: (i32 noundef [[X:%.*]]) #[[ATTR0]] {284; FNATTRS-NEXT:  entry:285; FNATTRS-NEXT:    tail call void @not_cold0()286; FNATTRS-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0287; FNATTRS-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE11:%.*]], label [[IF_THEN:%.*]]288; FNATTRS:       if.then:289; FNATTRS-NEXT:    [[CALL:%.*]] = tail call i32 @get_val()290; FNATTRS-NEXT:    [[TOBOOL1_NOT:%.*]] = icmp eq i32 [[CALL]], 0291; FNATTRS-NEXT:    br i1 [[TOBOOL1_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN2:%.*]]292; FNATTRS:       if.then2:293; FNATTRS-NEXT:    tail call void @cold1()294; FNATTRS-NEXT:    br label [[IF_END12:%.*]]295; FNATTRS:       if.else:296; FNATTRS-NEXT:    [[CALL3:%.*]] = tail call i32 @get_val()297; FNATTRS-NEXT:    [[TOBOOL4_NOT:%.*]] = icmp eq i32 [[CALL3]], 0298; FNATTRS-NEXT:    br i1 [[TOBOOL4_NOT]], label [[IF_ELSE6:%.*]], label [[IF_THEN5:%.*]]299; FNATTRS:       if.then5:300; FNATTRS-NEXT:    tail call void @cold0()301; FNATTRS-NEXT:    br label [[IF_END12]]302; FNATTRS:       if.else6:303; FNATTRS-NEXT:    tail call void @not_cold0()304; FNATTRS-NEXT:    [[CALL7:%.*]] = tail call i32 @get_val()305; FNATTRS-NEXT:    switch i32 [[CALL7]], label [[SW_DEFAULT:%.*]] [306; FNATTRS-NEXT:      i32 0, label [[SW_BB:%.*]]307; FNATTRS-NEXT:      i32 1, label [[SW_BB8:%.*]]308; FNATTRS-NEXT:      i32 2, label [[SW_BB9:%.*]]309; FNATTRS-NEXT:    ]310; FNATTRS:       sw.bb:311; FNATTRS-NEXT:    tail call void @not_cold0()312; FNATTRS-NEXT:    br label [[CALL_COLD:%.*]]313; FNATTRS:       sw.bb8:314; FNATTRS-NEXT:    tail call void @not_cold1()315; FNATTRS-NEXT:    br label [[CALL_COLD]]316; FNATTRS:       sw.bb9:317; FNATTRS-NEXT:    tail call void @not_cold2()318; FNATTRS-NEXT:    br label [[CALL_COLD]]319; FNATTRS:       sw.default:320; FNATTRS-NEXT:    tail call void @cold0()321; FNATTRS-NEXT:    br label [[IF_END12]]322; FNATTRS:       call_cold:323; FNATTRS-NEXT:    tail call void @cold_at_cb() #[[ATTR0]]324; FNATTRS-NEXT:    br label [[IF_END12]]325; FNATTRS:       if.else11:326; FNATTRS-NEXT:    tail call void @cold0()327; FNATTRS-NEXT:    br label [[IF_END12]]328; FNATTRS:       if.end12:329; FNATTRS-NEXT:    ret void330;331; ATTRIBUTOR-LABEL: define dso_local void @test_complex332; ATTRIBUTOR-SAME: (i32 noundef [[X:%.*]]) {333; ATTRIBUTOR-NEXT:  entry:334; ATTRIBUTOR-NEXT:    tail call void @not_cold0()335; ATTRIBUTOR-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0336; ATTRIBUTOR-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE11:%.*]], label [[IF_THEN:%.*]]337; ATTRIBUTOR:       if.then:338; ATTRIBUTOR-NEXT:    [[CALL:%.*]] = tail call i32 @get_val()339; ATTRIBUTOR-NEXT:    [[TOBOOL1_NOT:%.*]] = icmp eq i32 [[CALL]], 0340; ATTRIBUTOR-NEXT:    br i1 [[TOBOOL1_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN2:%.*]]341; ATTRIBUTOR:       if.then2:342; ATTRIBUTOR-NEXT:    tail call void @cold1()343; ATTRIBUTOR-NEXT:    br label [[IF_END12:%.*]]344; ATTRIBUTOR:       if.else:345; ATTRIBUTOR-NEXT:    [[CALL3:%.*]] = tail call i32 @get_val()346; ATTRIBUTOR-NEXT:    [[TOBOOL4_NOT:%.*]] = icmp eq i32 [[CALL3]], 0347; ATTRIBUTOR-NEXT:    br i1 [[TOBOOL4_NOT]], label [[IF_ELSE6:%.*]], label [[IF_THEN5:%.*]]348; ATTRIBUTOR:       if.then5:349; ATTRIBUTOR-NEXT:    tail call void @cold0()350; ATTRIBUTOR-NEXT:    br label [[IF_END12]]351; ATTRIBUTOR:       if.else6:352; ATTRIBUTOR-NEXT:    tail call void @not_cold0()353; ATTRIBUTOR-NEXT:    [[CALL7:%.*]] = tail call i32 @get_val()354; ATTRIBUTOR-NEXT:    switch i32 [[CALL7]], label [[SW_DEFAULT:%.*]] [355; ATTRIBUTOR-NEXT:      i32 0, label [[SW_BB:%.*]]356; ATTRIBUTOR-NEXT:      i32 1, label [[SW_BB8:%.*]]357; ATTRIBUTOR-NEXT:      i32 2, label [[SW_BB9:%.*]]358; ATTRIBUTOR-NEXT:    ]359; ATTRIBUTOR:       sw.bb:360; ATTRIBUTOR-NEXT:    tail call void @not_cold0()361; ATTRIBUTOR-NEXT:    br label [[CALL_COLD:%.*]]362; ATTRIBUTOR:       sw.bb8:363; ATTRIBUTOR-NEXT:    tail call void @not_cold1()364; ATTRIBUTOR-NEXT:    br label [[CALL_COLD]]365; ATTRIBUTOR:       sw.bb9:366; ATTRIBUTOR-NEXT:    tail call void @not_cold2()367; ATTRIBUTOR-NEXT:    br label [[CALL_COLD]]368; ATTRIBUTOR:       sw.default:369; ATTRIBUTOR-NEXT:    tail call void @cold0()370; ATTRIBUTOR-NEXT:    br label [[IF_END12]]371; ATTRIBUTOR:       call_cold:372; ATTRIBUTOR-NEXT:    tail call void @cold_at_cb() #[[ATTR0:[0-9]+]]373; ATTRIBUTOR-NEXT:    br label [[IF_END12]]374; ATTRIBUTOR:       if.else11:375; ATTRIBUTOR-NEXT:    tail call void @cold0()376; ATTRIBUTOR-NEXT:    br label [[IF_END12]]377; ATTRIBUTOR:       if.end12:378; ATTRIBUTOR-NEXT:    ret void379;380entry:381  tail call void @not_cold0()382  %tobool.not = icmp eq i32 %x, 0383  br i1 %tobool.not, label %if.else11, label %if.then384 385if.then:386  %call = tail call i32 @get_val()387  %tobool1.not = icmp eq i32 %call, 0388  br i1 %tobool1.not, label %if.else, label %if.then2389 390if.then2:391  tail call void @cold1()392  br label %if.end12393 394if.else:395  %call3 = tail call i32 @get_val()396  %tobool4.not = icmp eq i32 %call3, 0397  br i1 %tobool4.not, label %if.else6, label %if.then5398 399if.then5:400  tail call void @cold0()401  br label %if.end12402 403if.else6:404  tail call void @not_cold0()405  %call7 = tail call i32 @get_val()406  switch i32 %call7, label %sw.default [407  i32 0, label %sw.bb408  i32 1, label %sw.bb8409  i32 2, label %sw.bb9410  ]411 412sw.bb:413  tail call void @not_cold0()414  br label %call_cold415 416sw.bb8:417  tail call void @not_cold1()418  br label %call_cold419 420sw.bb9:421  tail call void @not_cold2()422  br label %call_cold423 424sw.default:425  tail call void @cold0()426  br label %if.end12427 428call_cold:429  tail call void @cold_at_cb() cold430  br label %if.end12431 432if.else11:433  tail call void @cold0()434  br label %if.end12435 436if.end12:437  ret void438}439 440define dso_local void @test_complex2(i32 noundef %x) {441; FNATTRS: Function Attrs: cold442; FNATTRS-LABEL: define dso_local void @test_complex2443; FNATTRS-SAME: (i32 noundef [[X:%.*]]) #[[ATTR0]] {444; FNATTRS-NEXT:  entry:445; FNATTRS-NEXT:    tail call void @not_cold0()446; FNATTRS-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0447; FNATTRS-NEXT:    [[CALL12:%.*]] = tail call i32 @get_val()448; FNATTRS-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE11:%.*]], label [[IF_THEN:%.*]]449; FNATTRS:       if.then:450; FNATTRS-NEXT:    [[TOBOOL1_NOT:%.*]] = icmp eq i32 [[CALL12]], 0451; FNATTRS-NEXT:    br i1 [[TOBOOL1_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN2:%.*]]452; FNATTRS:       if.then2:453; FNATTRS-NEXT:    tail call void @cold1()454; FNATTRS-NEXT:    br label [[IF_END16:%.*]]455; FNATTRS:       if.else:456; FNATTRS-NEXT:    [[CALL3:%.*]] = tail call i32 @get_val()457; FNATTRS-NEXT:    [[TOBOOL4_NOT:%.*]] = icmp eq i32 [[CALL3]], 0458; FNATTRS-NEXT:    br i1 [[TOBOOL4_NOT]], label [[IF_ELSE6:%.*]], label [[IF_THEN5:%.*]]459; FNATTRS:       if.then5:460; FNATTRS-NEXT:    tail call void @cold0()461; FNATTRS-NEXT:    br label [[IF_END16]]462; FNATTRS:       if.else6:463; FNATTRS-NEXT:    tail call void @not_cold0()464; FNATTRS-NEXT:    [[CALL7:%.*]] = tail call i32 @get_val()465; FNATTRS-NEXT:    switch i32 [[CALL7]], label [[SW_DEFAULT:%.*]] [466; FNATTRS-NEXT:      i32 0, label [[SW_BB:%.*]]467; FNATTRS-NEXT:      i32 1, label [[SW_BB8:%.*]]468; FNATTRS-NEXT:      i32 2, label [[SW_BB9:%.*]]469; FNATTRS-NEXT:    ]470; FNATTRS:       sw.bb:471; FNATTRS-NEXT:    tail call void @not_cold0()472; FNATTRS-NEXT:    br label [[CALL_COLD:%.*]]473; FNATTRS:       sw.bb8:474; FNATTRS-NEXT:    tail call void @not_cold1()475; FNATTRS-NEXT:    br label [[CALL_COLD]]476; FNATTRS:       sw.bb9:477; FNATTRS-NEXT:    tail call void @not_cold2()478; FNATTRS-NEXT:    br label [[CALL_COLD]]479; FNATTRS:       sw.default:480; FNATTRS-NEXT:    tail call void @cold0()481; FNATTRS-NEXT:    br label [[IF_END16]]482; FNATTRS:       call_cold:483; FNATTRS-NEXT:    tail call void @cold_at_cb() #[[ATTR0]]484; FNATTRS-NEXT:    br label [[IF_END16]]485; FNATTRS:       if.else11:486; FNATTRS-NEXT:    [[CMP:%.*]] = icmp slt i32 [[CALL12]], 1487; FNATTRS-NEXT:    br i1 [[CMP]], label [[IF_END14:%.*]], label [[FOR_BODY:%.*]]488; FNATTRS:       if.end14:489; FNATTRS-NEXT:    tail call void @cold1()490; FNATTRS-NEXT:    br label [[IF_END16]]491; FNATTRS:       for.body:492; FNATTRS-NEXT:    [[I_021:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[IF_ELSE11]] ]493; FNATTRS-NEXT:    tail call void @cold0()494; FNATTRS-NEXT:    [[INC]] = add nuw nsw i32 [[I_021]], 1495; FNATTRS-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[CALL12]]496; FNATTRS-NEXT:    br i1 [[EXITCOND_NOT]], label [[IF_END16]], label [[FOR_BODY]]497; FNATTRS:       if.end16:498; FNATTRS-NEXT:    ret void499;500; ATTRIBUTOR-LABEL: define dso_local void @test_complex2501; ATTRIBUTOR-SAME: (i32 noundef [[X:%.*]]) {502; ATTRIBUTOR-NEXT:  entry:503; ATTRIBUTOR-NEXT:    tail call void @not_cold0()504; ATTRIBUTOR-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0505; ATTRIBUTOR-NEXT:    [[CALL12:%.*]] = tail call i32 @get_val()506; ATTRIBUTOR-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE11:%.*]], label [[IF_THEN:%.*]]507; ATTRIBUTOR:       if.then:508; ATTRIBUTOR-NEXT:    [[TOBOOL1_NOT:%.*]] = icmp eq i32 [[CALL12]], 0509; ATTRIBUTOR-NEXT:    br i1 [[TOBOOL1_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN2:%.*]]510; ATTRIBUTOR:       if.then2:511; ATTRIBUTOR-NEXT:    tail call void @cold1()512; ATTRIBUTOR-NEXT:    br label [[IF_END16:%.*]]513; ATTRIBUTOR:       if.else:514; ATTRIBUTOR-NEXT:    [[CALL3:%.*]] = tail call i32 @get_val()515; ATTRIBUTOR-NEXT:    [[TOBOOL4_NOT:%.*]] = icmp eq i32 [[CALL3]], 0516; ATTRIBUTOR-NEXT:    br i1 [[TOBOOL4_NOT]], label [[IF_ELSE6:%.*]], label [[IF_THEN5:%.*]]517; ATTRIBUTOR:       if.then5:518; ATTRIBUTOR-NEXT:    tail call void @cold0()519; ATTRIBUTOR-NEXT:    br label [[IF_END16]]520; ATTRIBUTOR:       if.else6:521; ATTRIBUTOR-NEXT:    tail call void @not_cold0()522; ATTRIBUTOR-NEXT:    [[CALL7:%.*]] = tail call i32 @get_val()523; ATTRIBUTOR-NEXT:    switch i32 [[CALL7]], label [[SW_DEFAULT:%.*]] [524; ATTRIBUTOR-NEXT:      i32 0, label [[SW_BB:%.*]]525; ATTRIBUTOR-NEXT:      i32 1, label [[SW_BB8:%.*]]526; ATTRIBUTOR-NEXT:      i32 2, label [[SW_BB9:%.*]]527; ATTRIBUTOR-NEXT:    ]528; ATTRIBUTOR:       sw.bb:529; ATTRIBUTOR-NEXT:    tail call void @not_cold0()530; ATTRIBUTOR-NEXT:    br label [[CALL_COLD:%.*]]531; ATTRIBUTOR:       sw.bb8:532; ATTRIBUTOR-NEXT:    tail call void @not_cold1()533; ATTRIBUTOR-NEXT:    br label [[CALL_COLD]]534; ATTRIBUTOR:       sw.bb9:535; ATTRIBUTOR-NEXT:    tail call void @not_cold2()536; ATTRIBUTOR-NEXT:    br label [[CALL_COLD]]537; ATTRIBUTOR:       sw.default:538; ATTRIBUTOR-NEXT:    tail call void @cold0()539; ATTRIBUTOR-NEXT:    br label [[IF_END16]]540; ATTRIBUTOR:       call_cold:541; ATTRIBUTOR-NEXT:    tail call void @cold_at_cb() #[[ATTR0]]542; ATTRIBUTOR-NEXT:    br label [[IF_END16]]543; ATTRIBUTOR:       if.else11:544; ATTRIBUTOR-NEXT:    [[CMP:%.*]] = icmp slt i32 [[CALL12]], 1545; ATTRIBUTOR-NEXT:    br i1 [[CMP]], label [[IF_END14:%.*]], label [[FOR_BODY:%.*]]546; ATTRIBUTOR:       if.end14:547; ATTRIBUTOR-NEXT:    tail call void @cold1()548; ATTRIBUTOR-NEXT:    br label [[IF_END16]]549; ATTRIBUTOR:       for.body:550; ATTRIBUTOR-NEXT:    [[I_021:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[IF_ELSE11]] ]551; ATTRIBUTOR-NEXT:    tail call void @cold0()552; ATTRIBUTOR-NEXT:    [[INC]] = add nuw nsw i32 [[I_021]], 1553; ATTRIBUTOR-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[CALL12]]554; ATTRIBUTOR-NEXT:    br i1 [[EXITCOND_NOT]], label [[IF_END16]], label [[FOR_BODY]]555; ATTRIBUTOR:       if.end16:556; ATTRIBUTOR-NEXT:    ret void557;558entry:559  tail call void @not_cold0()560  %tobool.not = icmp eq i32 %x, 0561  %call12 = tail call i32 @get_val()562  br i1 %tobool.not, label %if.else11, label %if.then563 564if.then:565  %tobool1.not = icmp eq i32 %call12, 0566  br i1 %tobool1.not, label %if.else, label %if.then2567 568if.then2:569  tail call void @cold1()570  br label %if.end16571 572if.else:573  %call3 = tail call i32 @get_val()574  %tobool4.not = icmp eq i32 %call3, 0575  br i1 %tobool4.not, label %if.else6, label %if.then5576 577if.then5:578  tail call void @cold0()579  br label %if.end16580 581if.else6:582  tail call void @not_cold0()583  %call7 = tail call i32 @get_val()584  switch i32 %call7, label %sw.default [585  i32 0, label %sw.bb586  i32 1, label %sw.bb8587  i32 2, label %sw.bb9588  ]589 590sw.bb:591  tail call void @not_cold0()592  br label %call_cold593 594sw.bb8:595  tail call void @not_cold1()596  br label %call_cold597 598sw.bb9:599  tail call void @not_cold2()600  br label %call_cold601 602sw.default:603  tail call void @cold0()604  br label %if.end16605 606call_cold:607  tail call void @cold_at_cb() cold608  br label %if.end16609 610if.else11:611  %cmp = icmp slt i32 %call12, 1612  br i1 %cmp, label %if.end14, label %for.body613 614if.end14:615  tail call void @cold1()616  br label %if.end16617 618for.body:619  %i.021 = phi i32 [ %inc, %for.body ], [ 0, %if.else11 ]620  tail call void @cold0()621  %inc = add nuw nsw i32 %i.021, 1622  %exitcond.not = icmp eq i32 %inc, %call12623  br i1 %exitcond.not, label %if.end16, label %for.body624 625if.end16:626  ret void627}628 629define dso_local void @test_complex_fail(i32 noundef %x) {630; COMMON-LABEL: define dso_local void @test_complex_fail631; COMMON-SAME: (i32 noundef [[X:%.*]]) {632; COMMON-NEXT:  entry:633; COMMON-NEXT:    tail call void @not_cold0()634; COMMON-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0635; COMMON-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE11:%.*]], label [[IF_THEN:%.*]]636; COMMON:       if.then:637; COMMON-NEXT:    [[CALL:%.*]] = tail call i32 @get_val()638; COMMON-NEXT:    [[TOBOOL1_NOT:%.*]] = icmp eq i32 [[CALL]], 0639; COMMON-NEXT:    br i1 [[TOBOOL1_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN2:%.*]]640; COMMON:       if.then2:641; COMMON-NEXT:    tail call void @cold1()642; COMMON-NEXT:    br label [[IF_END12:%.*]]643; COMMON:       if.else:644; COMMON-NEXT:    [[CALL3:%.*]] = tail call i32 @get_val()645; COMMON-NEXT:    [[TOBOOL4_NOT:%.*]] = icmp eq i32 [[CALL3]], 0646; COMMON-NEXT:    br i1 [[TOBOOL4_NOT]], label [[IF_ELSE6:%.*]], label [[IF_THEN5:%.*]]647; COMMON:       if.then5:648; COMMON-NEXT:    tail call void @cold0()649; COMMON-NEXT:    br label [[IF_END12]]650; COMMON:       if.else6:651; COMMON-NEXT:    tail call void @not_cold0()652; COMMON-NEXT:    [[CALL7:%.*]] = tail call i32 @get_val()653; COMMON-NEXT:    switch i32 [[CALL7]], label [[SW_DEFAULT:%.*]] [654; COMMON-NEXT:      i32 0, label [[SW_BB:%.*]]655; COMMON-NEXT:      i32 1, label [[SW_BB8:%.*]]656; COMMON-NEXT:      i32 2, label [[SW_BB9:%.*]]657; COMMON-NEXT:    ]658; COMMON:       sw.bb:659; COMMON-NEXT:    tail call void @not_cold0()660; COMMON-NEXT:    br label [[CALL_COLD:%.*]]661; COMMON:       sw.bb8:662; COMMON-NEXT:    tail call void @not_cold1()663; COMMON-NEXT:    br label [[CALL_COLD]]664; COMMON:       sw.bb9:665; COMMON-NEXT:    tail call void @not_cold2()666; COMMON-NEXT:    br label [[IF_END12]]667; COMMON:       sw.default:668; COMMON-NEXT:    tail call void @cold0()669; COMMON-NEXT:    br label [[IF_END12]]670; COMMON:       call_cold:671; COMMON-NEXT:    tail call void @cold_at_cb() #[[ATTR0:[0-9]+]]672; COMMON-NEXT:    br label [[IF_END12]]673; COMMON:       if.else11:674; COMMON-NEXT:    tail call void @cold0()675; COMMON-NEXT:    br label [[IF_END12]]676; COMMON:       if.end12:677; COMMON-NEXT:    ret void678;679entry:680  tail call void @not_cold0()681  %tobool.not = icmp eq i32 %x, 0682  br i1 %tobool.not, label %if.else11, label %if.then683 684if.then:685  %call = tail call i32 @get_val()686  %tobool1.not = icmp eq i32 %call, 0687  br i1 %tobool1.not, label %if.else, label %if.then2688 689if.then2:690  tail call void @cold1()691  br label %if.end12692 693if.else:694  %call3 = tail call i32 @get_val()695  %tobool4.not = icmp eq i32 %call3, 0696  br i1 %tobool4.not, label %if.else6, label %if.then5697 698if.then5:699  tail call void @cold0()700  br label %if.end12701 702if.else6:703  tail call void @not_cold0()704  %call7 = tail call i32 @get_val()705  switch i32 %call7, label %sw.default [706  i32 0, label %sw.bb707  i32 1, label %sw.bb8708  i32 2, label %sw.bb9709  ]710 711sw.bb:712  tail call void @not_cold0()713  br label %call_cold714 715sw.bb8:716  tail call void @not_cold1()717  br label %call_cold718 719sw.bb9:720  tail call void @not_cold2()721  br label %if.end12722 723sw.default:724  tail call void @cold0()725  br label %if.end12726 727call_cold:728  tail call void @cold_at_cb() cold729  br label %if.end12730 731if.else11:732  tail call void @cold0()733  br label %if.end12734 735if.end12:736  ret void737}738 739define dso_local void @test_complex2_fail(i32 noundef %x) {740; COMMON-LABEL: define dso_local void @test_complex2_fail741; COMMON-SAME: (i32 noundef [[X:%.*]]) {742; COMMON-NEXT:  entry:743; COMMON-NEXT:    tail call void @not_cold0()744; COMMON-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0745; COMMON-NEXT:    [[CALL12:%.*]] = tail call i32 @get_val()746; COMMON-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE11:%.*]], label [[IF_THEN:%.*]]747; COMMON:       if.then:748; COMMON-NEXT:    [[TOBOOL1_NOT:%.*]] = icmp eq i32 [[CALL12]], 0749; COMMON-NEXT:    br i1 [[TOBOOL1_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN2:%.*]]750; COMMON:       if.then2:751; COMMON-NEXT:    tail call void @cold1()752; COMMON-NEXT:    br label [[IF_END16:%.*]]753; COMMON:       if.else:754; COMMON-NEXT:    [[CALL3:%.*]] = tail call i32 @get_val()755; COMMON-NEXT:    [[TOBOOL4_NOT:%.*]] = icmp eq i32 [[CALL3]], 0756; COMMON-NEXT:    br i1 [[TOBOOL4_NOT]], label [[IF_ELSE6:%.*]], label [[IF_THEN5:%.*]]757; COMMON:       if.then5:758; COMMON-NEXT:    tail call void @cold0()759; COMMON-NEXT:    br label [[IF_END16]]760; COMMON:       if.else6:761; COMMON-NEXT:    tail call void @not_cold0()762; COMMON-NEXT:    [[CALL7:%.*]] = tail call i32 @get_val()763; COMMON-NEXT:    switch i32 [[CALL7]], label [[SW_DEFAULT:%.*]] [764; COMMON-NEXT:      i32 0, label [[SW_BB:%.*]]765; COMMON-NEXT:      i32 1, label [[SW_BB8:%.*]]766; COMMON-NEXT:      i32 2, label [[SW_BB9:%.*]]767; COMMON-NEXT:    ]768; COMMON:       sw.bb:769; COMMON-NEXT:    tail call void @not_cold0()770; COMMON-NEXT:    br label [[CALL_COLD:%.*]]771; COMMON:       sw.bb8:772; COMMON-NEXT:    tail call void @not_cold1()773; COMMON-NEXT:    br label [[CALL_COLD]]774; COMMON:       sw.bb9:775; COMMON-NEXT:    tail call void @not_cold2()776; COMMON-NEXT:    br label [[CALL_COLD]]777; COMMON:       sw.default:778; COMMON-NEXT:    tail call void @cold0()779; COMMON-NEXT:    br label [[IF_END16]]780; COMMON:       call_cold:781; COMMON-NEXT:    tail call void @cold_at_cb() #[[ATTR0]]782; COMMON-NEXT:    br label [[IF_END16]]783; COMMON:       if.else11:784; COMMON-NEXT:    [[CMP:%.*]] = icmp slt i32 [[CALL12]], 1785; COMMON-NEXT:    br i1 [[CMP]], label [[IF_END14:%.*]], label [[FOR_BODY:%.*]]786; COMMON:       if.end14:787; COMMON-NEXT:    tail call void @not_cold1()788; COMMON-NEXT:    br label [[IF_END16]]789; COMMON:       for.body:790; COMMON-NEXT:    [[I_021:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[IF_ELSE11]] ]791; COMMON-NEXT:    tail call void @cold0()792; COMMON-NEXT:    [[INC]] = add nuw nsw i32 [[I_021]], 1793; COMMON-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[CALL12]]794; COMMON-NEXT:    br i1 [[EXITCOND_NOT]], label [[IF_END16]], label [[FOR_BODY]]795; COMMON:       if.end16:796; COMMON-NEXT:    ret void797;798entry:799  tail call void @not_cold0()800  %tobool.not = icmp eq i32 %x, 0801  %call12 = tail call i32 @get_val()802  br i1 %tobool.not, label %if.else11, label %if.then803 804if.then:805  %tobool1.not = icmp eq i32 %call12, 0806  br i1 %tobool1.not, label %if.else, label %if.then2807 808if.then2:809  tail call void @cold1()810  br label %if.end16811 812if.else:813  %call3 = tail call i32 @get_val()814  %tobool4.not = icmp eq i32 %call3, 0815  br i1 %tobool4.not, label %if.else6, label %if.then5816 817if.then5:818  tail call void @cold0()819  br label %if.end16820 821if.else6:822  tail call void @not_cold0()823  %call7 = tail call i32 @get_val()824  switch i32 %call7, label %sw.default [825  i32 0, label %sw.bb826  i32 1, label %sw.bb8827  i32 2, label %sw.bb9828  ]829 830sw.bb:831  tail call void @not_cold0()832  br label %call_cold833 834sw.bb8:835  tail call void @not_cold1()836  br label %call_cold837 838sw.bb9:839  tail call void @not_cold2()840  br label %call_cold841 842sw.default:843  tail call void @cold0()844  br label %if.end16845 846call_cold:847  tail call void @cold_at_cb() cold848  br label %if.end16849 850if.else11:851  %cmp = icmp slt i32 %call12, 1852  br i1 %cmp, label %if.end14, label %for.body853 854if.end14:855  tail call void @not_cold1()856  br label %if.end16857 858for.body:859  %i.021 = phi i32 [ %inc, %for.body ], [ 0, %if.else11 ]860  tail call void @cold0()861  %inc = add nuw nsw i32 %i.021, 1862  %exitcond.not = icmp eq i32 %inc, %call12863  br i1 %exitcond.not, label %if.end16, label %for.body864 865if.end16:866  ret void867}868 869;.870; FNATTRS: attributes #[[ATTR0]] = { cold }871; FNATTRS: attributes #[[ATTR1]] = { nofree norecurse noreturn nosync nounwind memory(none) }872; FNATTRS: attributes #[[ATTR2]] = { noreturn }873; FNATTRS: attributes #[[ATTR3]] = { cold noreturn }874; FNATTRS: attributes #[[ATTR4]] = { hot }875;.876; ATTRIBUTOR: attributes #[[ATTR0]] = { cold }877; ATTRIBUTOR: attributes #[[ATTR1]] = { nofree norecurse noreturn nosync nounwind memory(none) }878; ATTRIBUTOR: attributes #[[ATTR2]] = { noreturn }879; ATTRIBUTOR: attributes #[[ATTR3]] = { hot }880;.881