brintos

brintos / llvm-project-archived public Read only

0
0
Text · 53.0 KiB · c86fa34 Raw
1085 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -passes='simple-loop-unswitch<nontrivial>' -S < %s | FileCheck %s3 4; Non-trivial loop unswitching of select instruction.5 6declare i1 @foo()7declare i1 @bar(i32)8declare i32 @llvm.vector.reduce.add.v2i32(<2 x i32>)9 10define i32 @basic(i32 %N, i1 %cond, i32 %select_input) {11; CHECK-LABEL: define i32 @basic12; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND:%.*]], i32 [[SELECT_INPUT:%.*]]) {13; CHECK-NEXT:  entry:14; CHECK-NEXT:    [[COND_FR:%.*]] = freeze i1 [[COND]]15; CHECK-NEXT:    br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]16; CHECK:       entry.split.us:17; CHECK-NEXT:    br label [[FOR_COND_US:%.*]]18; CHECK:       for.cond.us:19; CHECK-NEXT:    [[RES_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[ADD_US:%.*]], [[TMP1:%.*]] ]20; CHECK-NEXT:    [[I_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[INC_US:%.*]], [[TMP1]] ]21; CHECK-NEXT:    [[CMP_US:%.*]] = icmp slt i32 [[I_US]], [[N]]22; CHECK-NEXT:    br i1 [[CMP_US]], label [[FOR_BODY_US:%.*]], label [[FOR_COND_CLEANUP_SPLIT_US:%.*]]23; CHECK:       for.body.us:24; CHECK-NEXT:    br label [[TMP0:%.*]]25; CHECK:       0:26; CHECK-NEXT:    br label [[TMP1]]27; CHECK:       1:28; CHECK-NEXT:    [[UNSWITCHED_SELECT_US:%.*]] = phi i32 [ [[SELECT_INPUT]], [[TMP0]] ]29; CHECK-NEXT:    [[ADD_US]] = add nuw nsw i32 [[UNSWITCHED_SELECT_US]], [[RES_US]]30; CHECK-NEXT:    [[INC_US]] = add nuw nsw i32 [[I_US]], 131; CHECK-NEXT:    br label [[FOR_COND_US]]32; CHECK:       for.cond.cleanup.split.us:33; CHECK-NEXT:    [[RES_LCSSA_US:%.*]] = phi i32 [ [[RES_US]], [[FOR_COND_US]] ]34; CHECK-NEXT:    br label [[FOR_COND_CLEANUP:%.*]]35; CHECK:       entry.split:36; CHECK-NEXT:    br label [[FOR_COND:%.*]]37; CHECK:       for.cond:38; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[ADD:%.*]], [[TMP2:%.*]] ]39; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[INC:%.*]], [[TMP2]] ]40; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I]], [[N]]41; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP_SPLIT:%.*]]42; CHECK:       for.body:43; CHECK-NEXT:    br label [[TMP2]]44; CHECK:       2:45; CHECK-NEXT:    [[ADD]] = add nuw nsw i32 42, [[RES]]46; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I]], 147; CHECK-NEXT:    br label [[FOR_COND]]48; CHECK:       for.cond.cleanup.split:49; CHECK-NEXT:    [[RES_LCSSA:%.*]] = phi i32 [ [[RES]], [[FOR_COND]] ]50; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]51; CHECK:       for.cond.cleanup:52; CHECK-NEXT:    [[DOTUS_PHI:%.*]] = phi i32 [ [[RES_LCSSA]], [[FOR_COND_CLEANUP_SPLIT]] ], [ [[RES_LCSSA_US]], [[FOR_COND_CLEANUP_SPLIT_US]] ]53; CHECK-NEXT:    ret i32 [[DOTUS_PHI]]54;55entry:56  br label %for.cond57 58for.cond:                                         ; preds = %for.body, %entry59  %res = phi i32 [ 0, %entry ], [ %add, %for.body ]60  %i = phi i32 [ 0, %entry ], [ %inc, %for.body ]61  %cmp = icmp slt i32 %i, %N62  br i1 %cmp, label %for.body, label %for.cond.cleanup63 64for.body:                                         ; preds = %for.cond65  %cond1 = select i1 %cond, i32 %select_input, i32 4266  %add = add nuw nsw i32 %cond1, %res67  %inc = add nuw nsw i32 %i, 168  br label %for.cond69 70for.cond.cleanup:                                 ; preds = %for.cond71  ret i32 %res72}73 74define i32 @basic_veccond(i32 %N, <2 x i1> %cond, <2 x i32> %select_input) {75; CHECK-LABEL: define i32 @basic_veccond76; CHECK-SAME: (i32 [[N:%.*]], <2 x i1> [[COND:%.*]], <2 x i32> [[SELECT_INPUT:%.*]]) {77; CHECK-NEXT:  entry:78; CHECK-NEXT:    br label [[FOR_COND:%.*]]79; CHECK:       for.cond:80; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[FOR_BODY:%.*]] ]81; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC:%.*]], [[FOR_BODY]] ]82; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I]], [[N]]83; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP:%.*]]84; CHECK:       for.body:85; CHECK-NEXT:    [[COND1:%.*]] = select <2 x i1> [[COND]], <2 x i32> [[SELECT_INPUT]], <2 x i32> splat (i32 42)86; CHECK-NEXT:    [[VREDUCE:%.*]] = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> [[COND1]])87; CHECK-NEXT:    [[ADD]] = add nuw nsw i32 [[VREDUCE]], [[RES]]88; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I]], 189; CHECK-NEXT:    br label [[FOR_COND]]90; CHECK:       for.cond.cleanup:91; CHECK-NEXT:    [[RES_LCSSA:%.*]] = phi i32 [ [[RES]], [[FOR_COND]] ]92; CHECK-NEXT:    ret i32 [[RES_LCSSA]]93;94entry:95  br label %for.cond96 97for.cond:                                         ; preds = %for.body, %entry98  %res = phi i32 [ 0, %entry ], [ %add, %for.body ]99  %i = phi i32 [ 0, %entry ], [ %inc, %for.body ]100  %cmp = icmp slt i32 %i, %N101  br i1 %cmp, label %for.body, label %for.cond.cleanup102 103for.body:                                         ; preds = %for.cond104  %cond1 = select <2 x i1> %cond, <2 x i32> %select_input, <2 x i32> <i32 42, i32 42>105  %vreduce = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %cond1)106  %add = add nuw nsw i32 %vreduce, %res107  %inc = add nuw nsw i32 %i, 1108  br label %for.cond109 110for.cond.cleanup:                                 ; preds = %for.cond111  ret i32 %res112}113 114define i32 @select_phi_input(i32 %N, i1 %cond) {115; CHECK-LABEL: define i32 @select_phi_input116; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND:%.*]]) {117; CHECK-NEXT:  entry:118; CHECK-NEXT:    [[COND_FR:%.*]] = freeze i1 [[COND]]119; CHECK-NEXT:    br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]120; CHECK:       entry.split.us:121; CHECK-NEXT:    br label [[FOR_COND_US:%.*]]122; CHECK:       for.cond.us:123; CHECK-NEXT:    [[RES_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[ADD_US:%.*]], [[TMP1:%.*]] ]124; CHECK-NEXT:    [[I_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[INC_US:%.*]], [[TMP1]] ]125; CHECK-NEXT:    [[CMP_US:%.*]] = icmp slt i32 [[I_US]], [[N]]126; CHECK-NEXT:    br i1 [[CMP_US]], label [[FOR_BODY_US:%.*]], label [[FOR_COND_CLEANUP_SPLIT_US:%.*]]127; CHECK:       for.body.us:128; CHECK-NEXT:    br label [[TMP0:%.*]]129; CHECK:       0:130; CHECK-NEXT:    br label [[TMP1]]131; CHECK:       1:132; CHECK-NEXT:    [[UNSWITCHED_SELECT_US:%.*]] = phi i32 [ [[I_US]], [[TMP0]] ]133; CHECK-NEXT:    [[ADD_US]] = add nuw nsw i32 [[UNSWITCHED_SELECT_US]], [[RES_US]]134; CHECK-NEXT:    [[INC_US]] = add nuw nsw i32 [[I_US]], 1135; CHECK-NEXT:    br label [[FOR_COND_US]]136; CHECK:       for.cond.cleanup.split.us:137; CHECK-NEXT:    [[RES_LCSSA_US:%.*]] = phi i32 [ [[RES_US]], [[FOR_COND_US]] ]138; CHECK-NEXT:    br label [[FOR_COND_CLEANUP:%.*]]139; CHECK:       entry.split:140; CHECK-NEXT:    br label [[FOR_COND:%.*]]141; CHECK:       for.cond:142; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[ADD:%.*]], [[TMP2:%.*]] ]143; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[INC:%.*]], [[TMP2]] ]144; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I]], [[N]]145; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP_SPLIT:%.*]]146; CHECK:       for.body:147; CHECK-NEXT:    br label [[TMP2]]148; CHECK:       2:149; CHECK-NEXT:    [[ADD]] = add nuw nsw i32 42, [[RES]]150; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I]], 1151; CHECK-NEXT:    br label [[FOR_COND]]152; CHECK:       for.cond.cleanup.split:153; CHECK-NEXT:    [[RES_LCSSA:%.*]] = phi i32 [ [[RES]], [[FOR_COND]] ]154; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]155; CHECK:       for.cond.cleanup:156; CHECK-NEXT:    [[DOTUS_PHI:%.*]] = phi i32 [ [[RES_LCSSA]], [[FOR_COND_CLEANUP_SPLIT]] ], [ [[RES_LCSSA_US]], [[FOR_COND_CLEANUP_SPLIT_US]] ]157; CHECK-NEXT:    ret i32 [[DOTUS_PHI]]158;159entry:160  br label %for.cond161 162for.cond:                                         ; preds = %for.body, %entry163  %res = phi i32 [ 0, %entry ], [ %add, %for.body ]164  %i = phi i32 [ 0, %entry ], [ %inc, %for.body ]165  %cmp = icmp slt i32 %i, %N166  br i1 %cmp, label %for.body, label %for.cond.cleanup167 168for.body:                                         ; preds = %for.cond169  %cond1 = select i1 %cond, i32 %i, i32 42170  %add = add nuw nsw i32 %cond1, %res171  %inc = add nuw nsw i32 %i, 1172  br label %for.cond173 174for.cond.cleanup:                                 ; preds = %for.cond175  ret i32 %res176}177 178define i32 @basic_cond_noundef(i32 %N, i1 noundef %cond) {179; CHECK-LABEL: define i32 @basic_cond_noundef180; CHECK-SAME: (i32 [[N:%.*]], i1 noundef [[COND:%.*]]) {181; CHECK-NEXT:  entry:182; CHECK-NEXT:    br i1 [[COND]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]183; CHECK:       entry.split.us:184; CHECK-NEXT:    br label [[FOR_COND_US:%.*]]185; CHECK:       for.cond.us:186; CHECK-NEXT:    [[RES_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[ADD_US:%.*]], [[TMP1:%.*]] ]187; CHECK-NEXT:    [[I_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[INC_US:%.*]], [[TMP1]] ]188; CHECK-NEXT:    [[CMP_US:%.*]] = icmp slt i32 [[I_US]], [[N]]189; CHECK-NEXT:    br i1 [[CMP_US]], label [[FOR_BODY_US:%.*]], label [[FOR_COND_CLEANUP_SPLIT_US:%.*]]190; CHECK:       for.body.us:191; CHECK-NEXT:    br label [[TMP0:%.*]]192; CHECK:       0:193; CHECK-NEXT:    br label [[TMP1]]194; CHECK:       1:195; CHECK-NEXT:    [[UNSWITCHED_SELECT_US:%.*]] = phi i32 [ [[I_US]], [[TMP0]] ]196; CHECK-NEXT:    [[ADD_US]] = add nuw nsw i32 [[UNSWITCHED_SELECT_US]], [[RES_US]]197; CHECK-NEXT:    [[INC_US]] = add nuw nsw i32 [[I_US]], 1198; CHECK-NEXT:    br label [[FOR_COND_US]]199; CHECK:       for.cond.cleanup.split.us:200; CHECK-NEXT:    [[RES_LCSSA_US:%.*]] = phi i32 [ [[RES_US]], [[FOR_COND_US]] ]201; CHECK-NEXT:    br label [[FOR_COND_CLEANUP:%.*]]202; CHECK:       entry.split:203; CHECK-NEXT:    br label [[FOR_COND:%.*]]204; CHECK:       for.cond:205; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[ADD:%.*]], [[TMP2:%.*]] ]206; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[INC:%.*]], [[TMP2]] ]207; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I]], [[N]]208; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP_SPLIT:%.*]]209; CHECK:       for.body:210; CHECK-NEXT:    br label [[TMP2]]211; CHECK:       2:212; CHECK-NEXT:    [[ADD]] = add nuw nsw i32 42, [[RES]]213; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I]], 1214; CHECK-NEXT:    br label [[FOR_COND]]215; CHECK:       for.cond.cleanup.split:216; CHECK-NEXT:    [[RES_LCSSA:%.*]] = phi i32 [ [[RES]], [[FOR_COND]] ]217; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]218; CHECK:       for.cond.cleanup:219; CHECK-NEXT:    [[DOTUS_PHI:%.*]] = phi i32 [ [[RES_LCSSA]], [[FOR_COND_CLEANUP_SPLIT]] ], [ [[RES_LCSSA_US]], [[FOR_COND_CLEANUP_SPLIT_US]] ]220; CHECK-NEXT:    ret i32 [[DOTUS_PHI]]221;222entry:223  br label %for.cond224 225for.cond:                                         ; preds = %for.body, %entry226  %res = phi i32 [ 0, %entry ], [ %add, %for.body ]227  %i = phi i32 [ 0, %entry ], [ %inc, %for.body ]228  %cmp = icmp slt i32 %i, %N229  br i1 %cmp, label %for.body, label %for.cond.cleanup230 231for.body:                                         ; preds = %for.cond232  %cond1 = select i1 %cond, i32 %i, i32 42233  %add = add nuw nsw i32 %cond1, %res234  %inc = add nuw nsw i32 %i, 1235  br label %for.cond236 237for.cond.cleanup:                                 ; preds = %for.cond238  ret i32 %res239}240 241define i32 @cond_invariant(i32 %N) {242; CHECK-LABEL: define i32 @cond_invariant243; CHECK-SAME: (i32 [[N:%.*]]) {244; CHECK-NEXT:  entry:245; CHECK-NEXT:    br label [[FOR_COND:%.*]]246; CHECK:       for.cond:247; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[FOR_BODY:%.*]] ]248; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC:%.*]], [[FOR_BODY]] ]249; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I]], [[N]]250; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP:%.*]]251; CHECK:       for.body:252; CHECK-NEXT:    [[COND:%.*]] = call i1 @foo()253; CHECK-NEXT:    [[COND1:%.*]] = select i1 [[COND]], i32 [[I]], i32 42254; CHECK-NEXT:    [[ADD]] = add nuw nsw i32 [[COND1]], [[RES]]255; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I]], 1256; CHECK-NEXT:    br label [[FOR_COND]]257; CHECK:       for.cond.cleanup:258; CHECK-NEXT:    [[RES_LCSSA:%.*]] = phi i32 [ [[RES]], [[FOR_COND]] ]259; CHECK-NEXT:    ret i32 [[RES_LCSSA]]260;261entry:262  br label %for.cond263 264for.cond:                                         ; preds = %for.body, %entry265  %res = phi i32 [ 0, %entry ], [ %add, %for.body ]266  %i = phi i32 [ 0, %entry ], [ %inc, %for.body ]267  %cmp = icmp slt i32 %i, %N268  br i1 %cmp, label %for.body, label %for.cond.cleanup269 270for.body:                                         ; preds = %for.cond271  %cond = call i1 @foo()272  %cond1 = select i1 %cond, i32 %i, i32 42273  %add = add nuw nsw i32 %cond1, %res274  %inc = add nuw nsw i32 %i, 1275  br label %for.cond276 277for.cond.cleanup:                                 ; preds = %for.cond278  ret i32 %res279}280 281define i32 @chained_select(i32 %N, i1 %cond, i1 %cond2) {282; CHECK-LABEL: define i32 @chained_select283; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND:%.*]], i1 [[COND2:%.*]]) {284; CHECK-NEXT:  entry:285; CHECK-NEXT:    [[COND_FR:%.*]] = freeze i1 [[COND]]286; CHECK-NEXT:    br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]287; CHECK:       entry.split.us:288; CHECK-NEXT:    [[COND2_FR13:%.*]] = freeze i1 [[COND2]]289; CHECK-NEXT:    br i1 [[COND2_FR13]], label [[ENTRY_SPLIT_US_SPLIT_US:%.*]], label [[ENTRY_SPLIT_US_SPLIT:%.*]]290; CHECK:       entry.split.us.split.us:291; CHECK-NEXT:    br label [[FOR_COND_US_US:%.*]]292; CHECK:       for.cond.us.us:293; CHECK-NEXT:    [[RES_US_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US_SPLIT_US]] ], [ [[ADD_US_US:%.*]], [[TMP3:%.*]] ]294; CHECK-NEXT:    [[I_US_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US_SPLIT_US]] ], [ [[INC_US_US:%.*]], [[TMP3]] ]295; CHECK-NEXT:    [[CMP_US_US:%.*]] = icmp slt i32 [[I_US_US]], [[N]]296; CHECK-NEXT:    br i1 [[CMP_US_US]], label [[FOR_BODY_US_US:%.*]], label [[FOR_COND_CLEANUP_SPLIT_US_SPLIT_US:%.*]]297; CHECK:       for.body.us.us:298; CHECK-NEXT:    br label [[TMP0:%.*]]299; CHECK:       0:300; CHECK-NEXT:    br label [[TMP1:%.*]]301; CHECK:       1:302; CHECK-NEXT:    [[UNSWITCHED_SELECT_US_US:%.*]] = phi i32 [ [[I_US_US]], [[TMP0]] ]303; CHECK-NEXT:    br label [[TMP2:%.*]]304; CHECK:       2:305; CHECK-NEXT:    br label [[TMP3]]306; CHECK:       3:307; CHECK-NEXT:    [[UNSWITCHED_SELECT_US11:%.*]] = phi i32 [ [[UNSWITCHED_SELECT_US_US]], [[TMP2]] ]308; CHECK-NEXT:    [[ADD_US_US]] = add nuw nsw i32 [[UNSWITCHED_SELECT_US11]], [[RES_US_US]]309; CHECK-NEXT:    [[INC_US_US]] = add nuw nsw i32 [[I_US_US]], 1310; CHECK-NEXT:    br label [[FOR_COND_US_US]]311; CHECK:       for.cond.cleanup.split.us.split.us:312; CHECK-NEXT:    [[RES_LCSSA_US_US:%.*]] = phi i32 [ [[RES_US_US]], [[FOR_COND_US_US]] ]313; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_SPLIT_US:%.*]]314; CHECK:       entry.split.us.split:315; CHECK-NEXT:    br label [[FOR_COND_US:%.*]]316; CHECK:       for.cond.us:317; CHECK-NEXT:    [[RES_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US_SPLIT]] ], [ [[ADD_US:%.*]], [[TMP6:%.*]] ]318; CHECK-NEXT:    [[I_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US_SPLIT]] ], [ [[INC_US:%.*]], [[TMP6]] ]319; CHECK-NEXT:    [[CMP_US:%.*]] = icmp slt i32 [[I_US]], [[N]]320; CHECK-NEXT:    br i1 [[CMP_US]], label [[FOR_BODY_US:%.*]], label [[FOR_COND_CLEANUP_SPLIT_US_SPLIT:%.*]]321; CHECK:       for.body.us:322; CHECK-NEXT:    br label [[TMP4:%.*]]323; CHECK:       4:324; CHECK-NEXT:    br label [[TMP5:%.*]]325; CHECK:       5:326; CHECK-NEXT:    [[UNSWITCHED_SELECT_US:%.*]] = phi i32 [ [[I_US]], [[TMP4]] ]327; CHECK-NEXT:    br label [[TMP6]]328; CHECK:       6:329; CHECK-NEXT:    [[ADD_US]] = add nuw nsw i32 24, [[RES_US]]330; CHECK-NEXT:    [[INC_US]] = add nuw nsw i32 [[I_US]], 1331; CHECK-NEXT:    br label [[FOR_COND_US]]332; CHECK:       for.cond.cleanup.split.us.split:333; CHECK-NEXT:    [[RES_LCSSA_US:%.*]] = phi i32 [ [[RES_US]], [[FOR_COND_US]] ]334; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_SPLIT_US]]335; CHECK:       for.cond.cleanup.split.us:336; CHECK-NEXT:    [[DOTUS_PHI12:%.*]] = phi i32 [ [[RES_LCSSA_US]], [[FOR_COND_CLEANUP_SPLIT_US_SPLIT]] ], [ [[RES_LCSSA_US_US]], [[FOR_COND_CLEANUP_SPLIT_US_SPLIT_US]] ]337; CHECK-NEXT:    br label [[FOR_COND_CLEANUP:%.*]]338; CHECK:       entry.split:339; CHECK-NEXT:    [[COND2_FR:%.*]] = freeze i1 [[COND2]]340; CHECK-NEXT:    br i1 [[COND2_FR]], label [[ENTRY_SPLIT_SPLIT_US:%.*]], label [[ENTRY_SPLIT_SPLIT:%.*]]341; CHECK:       entry.split.split.us:342; CHECK-NEXT:    br label [[FOR_COND_US1:%.*]]343; CHECK:       for.cond.us1:344; CHECK-NEXT:    [[RES_US2:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_SPLIT_US]] ], [ [[ADD_US7:%.*]], [[TMP9:%.*]] ]345; CHECK-NEXT:    [[I_US3:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_SPLIT_US]] ], [ [[INC_US8:%.*]], [[TMP9]] ]346; CHECK-NEXT:    [[CMP_US4:%.*]] = icmp slt i32 [[I_US3]], [[N]]347; CHECK-NEXT:    br i1 [[CMP_US4]], label [[FOR_BODY_US5:%.*]], label [[FOR_COND_CLEANUP_SPLIT_SPLIT_US:%.*]]348; CHECK:       for.body.us5:349; CHECK-NEXT:    br label [[TMP7:%.*]]350; CHECK:       7:351; CHECK-NEXT:    br label [[TMP8:%.*]]352; CHECK:       8:353; CHECK-NEXT:    br label [[TMP9]]354; CHECK:       9:355; CHECK-NEXT:    [[UNSWITCHED_SELECT_US6:%.*]] = phi i32 [ 42, [[TMP8]] ]356; CHECK-NEXT:    [[ADD_US7]] = add nuw nsw i32 [[UNSWITCHED_SELECT_US6]], [[RES_US2]]357; CHECK-NEXT:    [[INC_US8]] = add nuw nsw i32 [[I_US3]], 1358; CHECK-NEXT:    br label [[FOR_COND_US1]]359; CHECK:       for.cond.cleanup.split.split.us:360; CHECK-NEXT:    [[RES_LCSSA_US9:%.*]] = phi i32 [ [[RES_US2]], [[FOR_COND_US1]] ]361; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_SPLIT:%.*]]362; CHECK:       entry.split.split:363; CHECK-NEXT:    br label [[FOR_COND:%.*]]364; CHECK:       for.cond:365; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_SPLIT]] ], [ [[ADD:%.*]], [[TMP11:%.*]] ]366; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_SPLIT]] ], [ [[INC:%.*]], [[TMP11]] ]367; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I]], [[N]]368; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP_SPLIT_SPLIT:%.*]]369; CHECK:       for.body:370; CHECK-NEXT:    br label [[TMP10:%.*]]371; CHECK:       10:372; CHECK-NEXT:    br label [[TMP11]]373; CHECK:       11:374; CHECK-NEXT:    [[ADD]] = add nuw nsw i32 24, [[RES]]375; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I]], 1376; CHECK-NEXT:    br label [[FOR_COND]]377; CHECK:       for.cond.cleanup.split.split:378; CHECK-NEXT:    [[RES_LCSSA:%.*]] = phi i32 [ [[RES]], [[FOR_COND]] ]379; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_SPLIT]]380; CHECK:       for.cond.cleanup.split:381; CHECK-NEXT:    [[DOTUS_PHI10:%.*]] = phi i32 [ [[RES_LCSSA]], [[FOR_COND_CLEANUP_SPLIT_SPLIT]] ], [ [[RES_LCSSA_US9]], [[FOR_COND_CLEANUP_SPLIT_SPLIT_US]] ]382; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]383; CHECK:       for.cond.cleanup:384; CHECK-NEXT:    [[DOTUS_PHI:%.*]] = phi i32 [ [[DOTUS_PHI10]], [[FOR_COND_CLEANUP_SPLIT]] ], [ [[DOTUS_PHI12]], [[FOR_COND_CLEANUP_SPLIT_US]] ]385; CHECK-NEXT:    ret i32 [[DOTUS_PHI]]386;387entry:388  br label %for.cond389 390for.cond:                                         ; preds = %for.body, %entry391  %res = phi i32 [ 0, %entry ], [ %add, %for.body ]392  %i = phi i32 [ 0, %entry ], [ %inc, %for.body ]393  %cmp = icmp slt i32 %i, %N394  br i1 %cmp, label %for.body, label %for.cond.cleanup395 396for.body:                                         ; preds = %for.cond397  %select1 = select i1 %cond, i32 %i, i32 42398  %select2 = select i1 %cond2, i32 %select1, i32 24399  %add = add nuw nsw i32 %select2, %res400  %inc = add nuw nsw i32 %i, 1401  br label %for.cond402 403for.cond.cleanup:                                 ; preds = %for.cond404  ret i32 %res405}406 407define i32 @select_in_if(i32 %N, i1 %cond) {408; CHECK-LABEL: define i32 @select_in_if409; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND:%.*]]) {410; CHECK-NEXT:  entry:411; CHECK-NEXT:    [[COND_FR:%.*]] = freeze i1 [[COND]]412; CHECK-NEXT:    br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]413; CHECK:       entry.split.us:414; CHECK-NEXT:    br label [[FOR_COND_US:%.*]]415; CHECK:       for.cond.us:416; CHECK-NEXT:    [[RES_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[ADD_US:%.*]], [[FOR_BODY_END_US:%.*]] ]417; CHECK-NEXT:    [[I_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[INC_US:%.*]], [[FOR_BODY_END_US]] ]418; CHECK-NEXT:    [[CMP_US:%.*]] = icmp slt i32 [[I_US]], [[N]]419; CHECK-NEXT:    br i1 [[CMP_US]], label [[FOR_BODY_US:%.*]], label [[FOR_COND_CLEANUP_SPLIT_US:%.*]]420; CHECK:       for.body.us:421; CHECK-NEXT:    [[UREM_US:%.*]] = urem i32 [[I_US]], 2422; CHECK-NEXT:    [[IF_COND_US:%.*]] = icmp eq i32 [[UREM_US]], 0423; CHECK-NEXT:    br i1 [[IF_COND_US]], label [[FOR_BODY_IF_US:%.*]], label [[FOR_BODY_END_US]]424; CHECK:       for.body.if.us:425; CHECK-NEXT:    br label [[TMP0:%.*]]426; CHECK:       for.body.end.us:427; CHECK-NEXT:    [[P_US:%.*]] = phi i32 [ [[UNSWITCHED_SELECT_US:%.*]], [[TMP1:%.*]] ], [ 24, [[FOR_BODY_US]] ]428; CHECK-NEXT:    [[ADD_US]] = add nuw nsw i32 [[P_US]], [[RES_US]]429; CHECK-NEXT:    [[INC_US]] = add nuw nsw i32 [[I_US]], 1430; CHECK-NEXT:    br label [[FOR_COND_US]]431; CHECK:       0:432; CHECK-NEXT:    br label [[TMP1]]433; CHECK:       1:434; CHECK-NEXT:    [[UNSWITCHED_SELECT_US]] = phi i32 [ [[I_US]], [[TMP0]] ]435; CHECK-NEXT:    br label [[FOR_BODY_END_US]]436; CHECK:       for.cond.cleanup.split.us:437; CHECK-NEXT:    [[RES_LCSSA_US:%.*]] = phi i32 [ [[RES_US]], [[FOR_COND_US]] ]438; CHECK-NEXT:    br label [[FOR_COND_CLEANUP:%.*]]439; CHECK:       entry.split:440; CHECK-NEXT:    br label [[FOR_COND:%.*]]441; CHECK:       for.cond:442; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[ADD:%.*]], [[FOR_BODY_END:%.*]] ]443; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[INC:%.*]], [[FOR_BODY_END]] ]444; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I]], [[N]]445; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP_SPLIT:%.*]]446; CHECK:       for.body:447; CHECK-NEXT:    [[UREM:%.*]] = urem i32 [[I]], 2448; CHECK-NEXT:    [[IF_COND:%.*]] = icmp eq i32 [[UREM]], 0449; CHECK-NEXT:    br i1 [[IF_COND]], label [[FOR_BODY_IF:%.*]], label [[FOR_BODY_END]]450; CHECK:       for.body.if:451; CHECK-NEXT:    br label [[TMP2:%.*]]452; CHECK:       2:453; CHECK-NEXT:    br label [[FOR_BODY_END]]454; CHECK:       for.body.end:455; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 42, [[TMP2]] ], [ 24, [[FOR_BODY]] ]456; CHECK-NEXT:    [[ADD]] = add nuw nsw i32 [[P]], [[RES]]457; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I]], 1458; CHECK-NEXT:    br label [[FOR_COND]]459; CHECK:       for.cond.cleanup.split:460; CHECK-NEXT:    [[RES_LCSSA:%.*]] = phi i32 [ [[RES]], [[FOR_COND]] ]461; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]462; CHECK:       for.cond.cleanup:463; CHECK-NEXT:    [[DOTUS_PHI:%.*]] = phi i32 [ [[RES_LCSSA]], [[FOR_COND_CLEANUP_SPLIT]] ], [ [[RES_LCSSA_US]], [[FOR_COND_CLEANUP_SPLIT_US]] ]464; CHECK-NEXT:    ret i32 [[DOTUS_PHI]]465;466entry:467  br label %for.cond468 469for.cond:                                         ; preds = %for.body.end, %entry470  %res = phi i32 [ 0, %entry ], [ %add, %for.body.end ]471  %i = phi i32 [ 0, %entry ], [ %inc, %for.body.end ]472  %cmp = icmp slt i32 %i, %N473  br i1 %cmp, label %for.body, label %for.cond.cleanup474 475for.body:                                         ; preds = %for.cond476  %urem = urem i32 %i, 2477  %if.cond = icmp eq i32 %urem, 0478  br i1 %if.cond, label %for.body.if, label %for.body.end479 480for.body.if:                                      ; preds = %for.body481  %cond1 = select i1 %cond, i32 %i, i32 42482  br label %for.body.end483 484for.body.end:                                     ; preds = %for.body, %for.body.if485  %p = phi i32 [ %cond1, %for.body.if ], [ 24, %for.body ]486  %add = add nuw nsw i32 %p, %res487  %inc = add nuw nsw i32 %i, 1488  br label %for.cond489 490for.cond.cleanup:                                 ; preds = %for.cond491  ret i32 %res492}493 494define i32 @select_in_if_else(i32 %N, i1 %cond) {495; CHECK-LABEL: define i32 @select_in_if_else496; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND:%.*]]) {497; CHECK-NEXT:  entry:498; CHECK-NEXT:    [[COND_FR:%.*]] = freeze i1 [[COND]]499; CHECK-NEXT:    br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]500; CHECK:       entry.split.us:501; CHECK-NEXT:    br label [[FOR_COND_US:%.*]]502; CHECK:       for.cond.us:503; CHECK-NEXT:    [[RES_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[ADD_US:%.*]], [[FOR_BODY_END_US:%.*]] ]504; CHECK-NEXT:    [[I_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[INC_US:%.*]], [[FOR_BODY_END_US]] ]505; CHECK-NEXT:    [[CMP_US:%.*]] = icmp slt i32 [[I_US]], [[N]]506; CHECK-NEXT:    br i1 [[CMP_US]], label [[FOR_BODY_US:%.*]], label [[FOR_COND_CLEANUP_SPLIT_US:%.*]]507; CHECK:       for.body.us:508; CHECK-NEXT:    [[UREM_US:%.*]] = urem i32 [[I_US]], 2509; CHECK-NEXT:    [[IF_COND_US:%.*]] = icmp eq i32 [[UREM_US]], 0510; CHECK-NEXT:    br i1 [[IF_COND_US]], label [[FOR_BODY_IF_US:%.*]], label [[FOR_BODY_ELSE_US:%.*]]511; CHECK:       for.body.else.us:512; CHECK-NEXT:    br label [[TMP0:%.*]]513; CHECK:       for.body.if.us:514; CHECK-NEXT:    [[COND1A_US:%.*]] = select i1 true, i32 [[I_US]], i32 42515; CHECK-NEXT:    br label [[FOR_BODY_END_US]]516; CHECK:       for.body.end.us:517; CHECK-NEXT:    [[P_US:%.*]] = phi i32 [ [[COND1A_US]], [[FOR_BODY_IF_US]] ], [ [[UNSWITCHED_SELECT_US:%.*]], [[TMP1:%.*]] ]518; CHECK-NEXT:    [[ADD_US]] = add nuw nsw i32 [[P_US]], [[RES_US]]519; CHECK-NEXT:    [[INC_US]] = add nuw nsw i32 [[I_US]], 1520; CHECK-NEXT:    br label [[FOR_COND_US]]521; CHECK:       0:522; CHECK-NEXT:    br label [[TMP1]]523; CHECK:       1:524; CHECK-NEXT:    [[UNSWITCHED_SELECT_US]] = phi i32 [ 24, [[TMP0]] ]525; CHECK-NEXT:    br label [[FOR_BODY_END_US]]526; CHECK:       for.cond.cleanup.split.us:527; CHECK-NEXT:    [[RES_LCSSA_US:%.*]] = phi i32 [ [[RES_US]], [[FOR_COND_US]] ]528; CHECK-NEXT:    br label [[FOR_COND_CLEANUP:%.*]]529; CHECK:       entry.split:530; CHECK-NEXT:    br label [[FOR_COND:%.*]]531; CHECK:       for.cond:532; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[ADD:%.*]], [[FOR_BODY_END:%.*]] ]533; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[INC:%.*]], [[FOR_BODY_END]] ]534; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I]], [[N]]535; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP_SPLIT:%.*]]536; CHECK:       for.body:537; CHECK-NEXT:    [[UREM:%.*]] = urem i32 [[I]], 2538; CHECK-NEXT:    [[IF_COND:%.*]] = icmp eq i32 [[UREM]], 0539; CHECK-NEXT:    br i1 [[IF_COND]], label [[FOR_BODY_IF:%.*]], label [[FOR_BODY_ELSE:%.*]]540; CHECK:       for.body.if:541; CHECK-NEXT:    [[COND1A:%.*]] = select i1 false, i32 [[I]], i32 42542; CHECK-NEXT:    br label [[FOR_BODY_END]]543; CHECK:       for.body.else:544; CHECK-NEXT:    br label [[TMP2:%.*]]545; CHECK:       2:546; CHECK-NEXT:    br label [[FOR_BODY_END]]547; CHECK:       for.body.end:548; CHECK-NEXT:    [[P:%.*]] = phi i32 [ [[COND1A]], [[FOR_BODY_IF]] ], [ [[I]], [[TMP2]] ]549; CHECK-NEXT:    [[ADD]] = add nuw nsw i32 [[P]], [[RES]]550; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I]], 1551; CHECK-NEXT:    br label [[FOR_COND]]552; CHECK:       for.cond.cleanup.split:553; CHECK-NEXT:    [[RES_LCSSA:%.*]] = phi i32 [ [[RES]], [[FOR_COND]] ]554; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]555; CHECK:       for.cond.cleanup:556; CHECK-NEXT:    [[DOTUS_PHI:%.*]] = phi i32 [ [[RES_LCSSA]], [[FOR_COND_CLEANUP_SPLIT]] ], [ [[RES_LCSSA_US]], [[FOR_COND_CLEANUP_SPLIT_US]] ]557; CHECK-NEXT:    ret i32 [[DOTUS_PHI]]558;559entry:560  br label %for.cond561 562for.cond:                                         ; preds = %for.body.end, %entry563  %res = phi i32 [ 0, %entry ], [ %add, %for.body.end ]564  %i = phi i32 [ 0, %entry ], [ %inc, %for.body.end ]565  %cmp = icmp slt i32 %i, %N566  br i1 %cmp, label %for.body, label %for.cond.cleanup567 568for.body:                                         ; preds = %for.cond569  %urem = urem i32 %i, 2570  %if.cond = icmp eq i32 %urem, 0571  br i1 %if.cond, label %for.body.if, label %for.body.else572 573for.body.if:                                      ; preds = %for.body574  %cond1a = select i1 %cond, i32 %i, i32 42575  br label %for.body.end576 577for.body.else:                                    ; preds = %for.body578  %cond1b = select i1 %cond, i32 24, i32 %i579  br label %for.body.end580 581for.body.end:                                     ; preds = %for.body.if, %for.body.else582  %p = phi i32 [ %cond1a, %for.body.if ], [ %cond1b, %for.body.else ]583  %add = add nuw nsw i32 %p, %res584  %inc = add nuw nsw i32 %i, 1585  br label %for.cond586 587for.cond.cleanup:                                 ; preds = %for.cond588  ret i32 %res589}590 591define dso_local void @select_nested_loop(i1 noundef zeroext %cond, i32 noundef %n, i32 noundef %m) {592; CHECK-LABEL: define dso_local void @select_nested_loop593; CHECK-SAME: (i1 noundef zeroext [[COND:%.*]], i32 noundef [[N:%.*]], i32 noundef [[M:%.*]]) {594; CHECK-NEXT:  entry:595; CHECK-NEXT:    [[CMP17_NOT:%.*]] = icmp eq i32 [[N]], 0596; CHECK-NEXT:    [[CMP215_NOT:%.*]] = icmp eq i32 [[M]], 0597; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[CMP17_NOT]], [[CMP215_NOT]]598; CHECK-NEXT:    br i1 [[OR_COND]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_COND1_PREHEADER_US_PREHEADER:%.*]]599; CHECK:       for.cond1.preheader.us.preheader:600; CHECK-NEXT:    br i1 [[COND]], label [[FOR_COND1_PREHEADER_US_PREHEADER_SPLIT_US:%.*]], label [[FOR_COND1_PREHEADER_US_PREHEADER_SPLIT:%.*]]601; CHECK:       for.cond1.preheader.us.preheader.split.us:602; CHECK-NEXT:    br label [[FOR_COND1_PREHEADER_US_US:%.*]]603; CHECK:       for.cond1.preheader.us.us:604; CHECK-NEXT:    [[I_018_US_US:%.*]] = phi i32 [ [[INC7_US_US:%.*]], [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US_US:%.*]] ], [ 0, [[FOR_COND1_PREHEADER_US_PREHEADER_SPLIT_US]] ]605; CHECK-NEXT:    br label [[FOR_COND1_PREHEADER_US_SPLIT_US_US:%.*]]606; CHECK:       for.cond1.for.cond.cleanup3_crit_edge.us.us:607; CHECK-NEXT:    [[INC7_US_US]] = add nuw i32 [[I_018_US_US]], 1608; CHECK-NEXT:    [[EXITCOND21_NOT_US:%.*]] = icmp eq i32 [[INC7_US_US]], [[N]]609; CHECK-NEXT:    br i1 [[EXITCOND21_NOT_US]], label [[FOR_COND_CLEANUP_LOOPEXIT_SPLIT_US:%.*]], label [[FOR_COND1_PREHEADER_US_US]]610; CHECK:       for.cond1.preheader.us.split.us.us:611; CHECK-NEXT:    br label [[FOR_BODY4_US_US_US:%.*]]612; CHECK:       for.body4.us.us.us:613; CHECK-NEXT:    [[J_016_US_US_US:%.*]] = phi i32 [ 0, [[FOR_COND1_PREHEADER_US_SPLIT_US_US]] ], [ [[INC_US_US_US:%.*]], [[TMP1:%.*]] ]614; CHECK-NEXT:    br label [[TMP0:%.*]]615; CHECK:       0:616; CHECK-NEXT:    br label [[TMP1]]617; CHECK:       1:618; CHECK-NEXT:    [[UNSWITCHED_SELECT_US_US:%.*]] = phi i32 [ [[I_018_US_US]], [[TMP0]] ]619; CHECK-NEXT:    tail call void @bar(i32 noundef [[UNSWITCHED_SELECT_US_US]])620; CHECK-NEXT:    [[INC_US_US_US]] = add nuw i32 [[J_016_US_US_US]], 1621; CHECK-NEXT:    [[EXITCOND_NOT_US_US:%.*]] = icmp eq i32 [[INC_US_US_US]], [[M]]622; CHECK-NEXT:    br i1 [[EXITCOND_NOT_US_US]], label [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US_SPLIT_US_US:%.*]], label [[FOR_BODY4_US_US_US]]623; CHECK:       for.cond1.for.cond.cleanup3_crit_edge.us.split.us.us:624; CHECK-NEXT:    br label [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US_US]]625; CHECK:       for.cond.cleanup.loopexit.split.us:626; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]]627; CHECK:       for.cond1.preheader.us.preheader.split:628; CHECK-NEXT:    br label [[FOR_COND1_PREHEADER_US:%.*]]629; CHECK:       for.cond1.preheader.us:630; CHECK-NEXT:    [[I_018_US:%.*]] = phi i32 [ [[INC7_US:%.*]], [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US:%.*]] ], [ 0, [[FOR_COND1_PREHEADER_US_PREHEADER_SPLIT]] ]631; CHECK-NEXT:    br label [[FOR_COND1_PREHEADER_US_SPLIT:%.*]]632; CHECK:       for.cond1.preheader.us.split:633; CHECK-NEXT:    br label [[FOR_BODY4_US:%.*]]634; CHECK:       for.body4.us:635; CHECK-NEXT:    [[J_016_US:%.*]] = phi i32 [ 0, [[FOR_COND1_PREHEADER_US_SPLIT]] ], [ [[INC_US:%.*]], [[TMP2:%.*]] ]636; CHECK-NEXT:    br label [[TMP2]]637; CHECK:       2:638; CHECK-NEXT:    tail call void @bar(i32 noundef [[J_016_US]])639; CHECK-NEXT:    [[INC_US]] = add nuw i32 [[J_016_US]], 1640; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC_US]], [[M]]641; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US_SPLIT:%.*]], label [[FOR_BODY4_US]]642; CHECK:       for.cond1.for.cond.cleanup3_crit_edge.us.split:643; CHECK-NEXT:    br label [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US]]644; CHECK:       for.cond1.for.cond.cleanup3_crit_edge.us:645; CHECK-NEXT:    [[INC7_US]] = add nuw i32 [[I_018_US]], 1646; CHECK-NEXT:    [[EXITCOND21_NOT:%.*]] = icmp eq i32 [[INC7_US]], [[N]]647; CHECK-NEXT:    br i1 [[EXITCOND21_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT_SPLIT:%.*]], label [[FOR_COND1_PREHEADER_US]]648; CHECK:       for.cond.cleanup.loopexit.split:649; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_LOOPEXIT]]650; CHECK:       for.cond.cleanup.loopexit:651; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]652; CHECK:       for.cond.cleanup:653; CHECK-NEXT:    ret void654;655entry:656  %cmp17.not = icmp eq i32 %n, 0657  %cmp215.not = icmp eq i32 %m, 0658  %or.cond = or i1 %cmp17.not, %cmp215.not659  br i1 %or.cond, label %for.cond.cleanup, label %for.cond1.preheader.us660 661for.cond1.preheader.us:                           ; preds = %entry, %for.cond1.for.cond.cleanup3_crit_edge.us662  %i.018.us = phi i32 [ %inc7.us, %for.cond1.for.cond.cleanup3_crit_edge.us ], [ 0, %entry ]663  br label %for.body4.us664 665for.body4.us:                                     ; preds = %for.cond1.preheader.us, %for.body4.us666  %j.016.us = phi i32 [ 0, %for.cond1.preheader.us ], [ %inc.us, %for.body4.us ]667  %cond5.us = select i1 %cond, i32 %i.018.us, i32 %j.016.us668  tail call void @bar(i32 noundef %cond5.us) #2669  %inc.us = add nuw i32 %j.016.us, 1670  %exitcond.not = icmp eq i32 %inc.us, %m671  br i1 %exitcond.not, label %for.cond1.for.cond.cleanup3_crit_edge.us, label %for.body4.us672 673for.cond1.for.cond.cleanup3_crit_edge.us:         ; preds = %for.body4.us674  %inc7.us = add nuw i32 %i.018.us, 1675  %exitcond21.not = icmp eq i32 %inc7.us, %n676  br i1 %exitcond21.not, label %for.cond.cleanup, label %for.cond1.preheader.us677 678for.cond.cleanup:                                 ; preds = %for.cond1.for.cond.cleanup3_crit_edge.us, %entry679  ret void680}681 682define dso_local void @select_invariant_outer_loop(i1 noundef zeroext %cond, i32 noundef %n, i32 noundef %m) {683; CHECK-LABEL: define dso_local void @select_invariant_outer_loop684; CHECK-SAME: (i1 noundef zeroext [[COND:%.*]], i32 noundef [[N:%.*]], i32 noundef [[M:%.*]]) {685; CHECK-NEXT:  entry:686; CHECK-NEXT:    [[CMP20_NOT:%.*]] = icmp eq i32 [[N]], 0687; CHECK-NEXT:    [[CMP218_NOT:%.*]] = icmp eq i32 [[M]], 0688; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[CMP20_NOT]], [[CMP218_NOT]]689; CHECK-NEXT:    br i1 [[OR_COND]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_COND1_PREHEADER_US_PREHEADER:%.*]]690; CHECK:       for.cond1.preheader.us.preheader:691; CHECK-NEXT:    br label [[FOR_COND1_PREHEADER_US:%.*]]692; CHECK:       for.cond1.preheader.us:693; CHECK-NEXT:    [[I_021_US:%.*]] = phi i32 [ [[INC9_US:%.*]], [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US:%.*]] ], [ 0, [[FOR_COND1_PREHEADER_US_PREHEADER]] ]694; CHECK-NEXT:    [[REM_US:%.*]] = and i32 [[I_021_US]], 1695; CHECK-NEXT:    [[CMP5_US:%.*]] = icmp eq i32 [[REM_US]], 0696; CHECK-NEXT:    [[CMP5_US_FR:%.*]] = freeze i1 [[CMP5_US]]697; CHECK-NEXT:    br i1 [[CMP5_US_FR]], label [[FOR_COND1_PREHEADER_US_SPLIT_US:%.*]], label [[FOR_COND1_PREHEADER_US_SPLIT:%.*]]698; CHECK:       for.cond1.preheader.us.split.us:699; CHECK-NEXT:    br label [[FOR_BODY4_US_US:%.*]]700; CHECK:       for.body4.us.us:701; CHECK-NEXT:    [[J_019_US_US:%.*]] = phi i32 [ 0, [[FOR_COND1_PREHEADER_US_SPLIT_US]] ], [ [[INC_US_US:%.*]], [[TMP1:%.*]] ]702; CHECK-NEXT:    br label [[TMP0:%.*]]703; CHECK:       0:704; CHECK-NEXT:    br label [[TMP1]]705; CHECK:       1:706; CHECK-NEXT:    [[UNSWITCHED_SELECT_US:%.*]] = phi i32 [ [[I_021_US]], [[TMP0]] ]707; CHECK-NEXT:    tail call void @bar(i32 noundef [[UNSWITCHED_SELECT_US]])708; CHECK-NEXT:    [[INC_US_US]] = add nuw i32 [[J_019_US_US]], 1709; CHECK-NEXT:    [[EXITCOND_NOT_US:%.*]] = icmp eq i32 [[INC_US_US]], [[M]]710; CHECK-NEXT:    br i1 [[EXITCOND_NOT_US]], label [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US_SPLIT_US:%.*]], label [[FOR_BODY4_US_US]]711; CHECK:       for.cond1.for.cond.cleanup3_crit_edge.us.split.us:712; CHECK-NEXT:    br label [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US]]713; CHECK:       for.cond1.preheader.us.split:714; CHECK-NEXT:    br label [[FOR_BODY4_US:%.*]]715; CHECK:       for.body4.us:716; CHECK-NEXT:    [[J_019_US:%.*]] = phi i32 [ 0, [[FOR_COND1_PREHEADER_US_SPLIT]] ], [ [[INC_US:%.*]], [[TMP2:%.*]] ]717; CHECK-NEXT:    br label [[TMP2]]718; CHECK:       2:719; CHECK-NEXT:    tail call void @bar(i32 noundef [[J_019_US]])720; CHECK-NEXT:    [[INC_US]] = add nuw i32 [[J_019_US]], 1721; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC_US]], [[M]]722; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US_SPLIT:%.*]], label [[FOR_BODY4_US]]723; CHECK:       for.cond1.for.cond.cleanup3_crit_edge.us.split:724; CHECK-NEXT:    br label [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US]]725; CHECK:       for.cond1.for.cond.cleanup3_crit_edge.us:726; CHECK-NEXT:    [[INC9_US]] = add nuw i32 [[I_021_US]], 1727; CHECK-NEXT:    [[EXITCOND24_NOT:%.*]] = icmp eq i32 [[INC9_US]], [[N]]728; CHECK-NEXT:    br i1 [[EXITCOND24_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_COND1_PREHEADER_US]]729; CHECK:       for.cond.cleanup.loopexit:730; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]731; CHECK:       for.cond.cleanup:732; CHECK-NEXT:    ret void733;734entry:735  %cmp20.not = icmp eq i32 %n, 0736  %cmp218.not = icmp eq i32 %m, 0737  %or.cond = or i1 %cmp20.not, %cmp218.not738  br i1 %or.cond, label %for.cond.cleanup, label %for.cond1.preheader.us739 740for.cond1.preheader.us:                           ; preds = %entry, %for.cond1.for.cond.cleanup3_crit_edge.us741  %i.021.us = phi i32 [ %inc9.us, %for.cond1.for.cond.cleanup3_crit_edge.us ], [ 0, %entry ]742  %rem.us = and i32 %i.021.us, 1743  %cmp5.us = icmp eq i32 %rem.us, 0744  br label %for.body4.us745 746for.body4.us:                                     ; preds = %for.cond1.preheader.us, %for.body4.us747  %j.019.us = phi i32 [ 0, %for.cond1.preheader.us ], [ %inc.us, %for.body4.us ]748  %cond7.us = select i1 %cmp5.us, i32 %i.021.us, i32 %j.019.us749  tail call void @bar(i32 noundef %cond7.us) #2750  %inc.us = add nuw i32 %j.019.us, 1751  %exitcond.not = icmp eq i32 %inc.us, %m752  br i1 %exitcond.not, label %for.cond1.for.cond.cleanup3_crit_edge.us, label %for.body4.us753 754for.cond1.for.cond.cleanup3_crit_edge.us:         ; preds = %for.body4.us755  %inc9.us = add nuw i32 %i.021.us, 1756  %exitcond24.not = icmp eq i32 %inc9.us, %n757  br i1 %exitcond24.not, label %for.cond.cleanup, label %for.cond1.preheader.us758 759for.cond.cleanup:                                 ; preds = %for.cond1.for.cond.cleanup3_crit_edge.us, %entry760  ret void761}762 763; Unswitch %val should look through the trivial select and unswitch on %cond764define dso_local i32 @trivial_select_cond(i32 noundef %n, i32 noundef %a, i32 noundef %b, i1 noundef %cond) {765; CHECK-LABEL: define dso_local i32 @trivial_select_cond766; CHECK-SAME: (i32 noundef [[N:%.*]], i32 noundef [[A:%.*]], i32 noundef [[B:%.*]], i1 noundef [[COND:%.*]]) {767; CHECK-NEXT:  entry:768; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[N]], 0769; CHECK-NEXT:    [[TRIVIAL_COND:%.*]] = select i1 [[COND]], i1 true, i1 false770; CHECK-NEXT:    br i1 [[CMP2]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]771; CHECK:       for.body.preheader:772; CHECK-NEXT:    br i1 [[COND]], label [[FOR_BODY_PREHEADER_SPLIT_US:%.*]], label [[FOR_BODY_PREHEADER_SPLIT:%.*]]773; CHECK:       for.body.preheader.split.us:774; CHECK-NEXT:    br label [[FOR_BODY_US:%.*]]775; CHECK:       for.body.us:776; CHECK-NEXT:    [[I_03_US:%.*]] = phi i32 [ [[INC_US:%.*]], [[TMP1:%.*]] ], [ 0, [[FOR_BODY_PREHEADER_SPLIT_US]] ]777; CHECK-NEXT:    br label [[TMP0:%.*]]778; CHECK:       0:779; CHECK-NEXT:    br label [[TMP1]]780; CHECK:       1:781; CHECK-NEXT:    [[UNSWITCHED_SELECT_US:%.*]] = phi i32 [ [[A]], [[TMP0]] ]782; CHECK-NEXT:    tail call void @bar(i32 noundef [[UNSWITCHED_SELECT_US]])783; CHECK-NEXT:    [[INC_US]] = add nuw nsw i32 [[I_03_US]], 1784; CHECK-NEXT:    [[EXITCOND_NOT_US:%.*]] = icmp eq i32 [[INC_US]], [[N]]785; CHECK-NEXT:    br i1 [[EXITCOND_NOT_US]], label [[FOR_COND_CLEANUP_LOOPEXIT_SPLIT_US:%.*]], label [[FOR_BODY_US]]786; CHECK:       for.cond.cleanup.loopexit.split.us:787; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]]788; CHECK:       for.body.preheader.split:789; CHECK-NEXT:    br label [[FOR_BODY:%.*]]790; CHECK:       for.cond.cleanup.loopexit.split:791; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_LOOPEXIT]]792; CHECK:       for.cond.cleanup.loopexit:793; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]794; CHECK:       for.cond.cleanup:795; CHECK-NEXT:    ret i32 undef796; CHECK:       for.body:797; CHECK-NEXT:    [[I_03:%.*]] = phi i32 [ [[INC:%.*]], [[TMP2:%.*]] ], [ 0, [[FOR_BODY_PREHEADER_SPLIT]] ]798; CHECK-NEXT:    br label [[TMP2]]799; CHECK:       2:800; CHECK-NEXT:    tail call void @bar(i32 noundef [[B]])801; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_03]], 1802; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]803; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT_SPLIT:%.*]], label [[FOR_BODY]]804;805entry:806  %cmp2 = icmp sgt i32 %n, 0807  %trivial_cond = select i1 %cond, i1 true, i1 false808  br i1 %cmp2, label %for.body, label %for.cond.cleanup809 810for.cond.cleanup:                                 ; preds = %for.body, %entry811  ret i32 undef812 813for.body:                                         ; preds = %entry, %for.body814  %i.03 = phi i32 [ %inc, %for.body ], [ 0, %entry ]815  %val = select i1 %trivial_cond, i32 %a, i32 %b816  tail call void @bar(i32 noundef %val)817  %inc = add nuw nsw i32 %i.03, 1818  %exitcond.not = icmp eq i32 %inc, %n819  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body820}821 822; Test unswitch select when the condition is an AND whose LHS is invariant823define i32 @and_lhs_invariant(i32 %num, i1 %cond) {824; CHECK-LABEL: define i32 @and_lhs_invariant825; CHECK-SAME: (i32 [[NUM:%.*]], i1 [[COND:%.*]]) {826; CHECK-NEXT:  entry:827; CHECK-NEXT:    [[CMP6:%.*]] = icmp sgt i32 [[NUM]], 0828; CHECK-NEXT:    br i1 [[CMP6]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]829; CHECK:       for.body.preheader:830; CHECK-NEXT:    [[COND_FR:%.*]] = freeze i1 [[COND]]831; CHECK-NEXT:    br i1 [[COND_FR]], label [[FOR_BODY_PREHEADER_SPLIT:%.*]], label [[FOR_BODY_PREHEADER_SPLIT_US:%.*]]832; CHECK:       for.body.preheader.split.us:833; CHECK-NEXT:    br label [[FOR_BODY_US:%.*]]834; CHECK:       for.body.us:835; CHECK-NEXT:    [[I_07_US:%.*]] = phi i32 [ [[INC_US:%.*]], [[TMP0:%.*]] ], [ 0, [[FOR_BODY_PREHEADER_SPLIT_US]] ]836; CHECK-NEXT:    br label [[TMP0]]837; CHECK:       0:838; CHECK-NEXT:    [[UNSWITCHED_SELECT_US:%.*]] = phi i32 [ 0, [[FOR_BODY_US]] ]839; CHECK-NEXT:    tail call void @bar(i32 noundef [[UNSWITCHED_SELECT_US]])840; CHECK-NEXT:    [[INC_US]] = add nuw nsw i32 [[I_07_US]], 1841; CHECK-NEXT:    [[EXITCOND_NOT_US:%.*]] = icmp eq i32 [[INC_US]], [[NUM]]842; CHECK-NEXT:    br i1 [[EXITCOND_NOT_US]], label [[FOR_COND_CLEANUP_LOOPEXIT_SPLIT_US:%.*]], label [[FOR_BODY_US]]843; CHECK:       for.cond.cleanup.loopexit.split.us:844; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]]845; CHECK:       for.body.preheader.split:846; CHECK-NEXT:    br label [[FOR_BODY:%.*]]847; CHECK:       for.cond.cleanup.loopexit.split:848; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_LOOPEXIT]]849; CHECK:       for.cond.cleanup.loopexit:850; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]851; CHECK:       for.cond.cleanup:852; CHECK-NEXT:    ret i32 undef853; CHECK:       for.body:854; CHECK-NEXT:    [[I_07:%.*]] = phi i32 [ [[INC:%.*]], [[TMP3:%.*]] ], [ 0, [[FOR_BODY_PREHEADER_SPLIT]] ]855; CHECK-NEXT:    [[REM:%.*]] = and i32 [[I_07]], 1856; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[REM]], 0857; CHECK-NEXT:    [[TMP1:%.*]] = and i1 true, [[CMP1]]858; CHECK-NEXT:    br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3]]859; CHECK:       2:860; CHECK-NEXT:    br label [[TMP3]]861; CHECK:       3:862; CHECK-NEXT:    [[UNSWITCHED_SELECT:%.*]] = phi i32 [ [[I_07]], [[TMP2]] ], [ 0, [[FOR_BODY]] ]863; CHECK-NEXT:    tail call void @bar(i32 noundef [[UNSWITCHED_SELECT]])864; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_07]], 1865; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[NUM]]866; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT_SPLIT:%.*]], label [[FOR_BODY]]867;868entry:869  %cmp6 = icmp sgt i32 %num, 0870  br i1 %cmp6, label %for.body, label %for.cond.cleanup871 872for.cond.cleanup:                                 ; preds = %for.body, %entry873  ret i32 undef874 875for.body:                                         ; preds = %entry, %for.body876  %i.07 = phi i32 [ %inc, %for.body ], [ 0, %entry ]877  %rem = and i32 %i.07, 1878  %cmp1 = icmp eq i32 %rem, 0879  %0 = and i1 %cond, %cmp1880  %cond2 = select i1 %0, i32 %i.07, i32 0881  tail call void @bar(i32 noundef %cond2)882  %inc = add nuw nsw i32 %i.07, 1883  %exitcond.not = icmp eq i32 %inc, %num884  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body885}886 887; Test unswitch select when the condition is an AND whose RHS is invariant888define i32 @and_rhs_invariant(i32 %num, i1 %cond) {889; CHECK-LABEL: define i32 @and_rhs_invariant890; CHECK-SAME: (i32 [[NUM:%.*]], i1 [[COND:%.*]]) {891; CHECK-NEXT:  entry:892; CHECK-NEXT:    [[CMP6:%.*]] = icmp sgt i32 [[NUM]], 0893; CHECK-NEXT:    br i1 [[CMP6]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]894; CHECK:       for.body.preheader:895; CHECK-NEXT:    [[COND_FR:%.*]] = freeze i1 [[COND]]896; CHECK-NEXT:    br i1 [[COND_FR]], label [[FOR_BODY_PREHEADER_SPLIT:%.*]], label [[FOR_BODY_PREHEADER_SPLIT_US:%.*]]897; CHECK:       for.body.preheader.split.us:898; CHECK-NEXT:    br label [[FOR_BODY_US:%.*]]899; CHECK:       for.body.us:900; CHECK-NEXT:    [[I_07_US:%.*]] = phi i32 [ [[INC_US:%.*]], [[TMP0:%.*]] ], [ 0, [[FOR_BODY_PREHEADER_SPLIT_US]] ]901; CHECK-NEXT:    br label [[TMP0]]902; CHECK:       0:903; CHECK-NEXT:    [[UNSWITCHED_SELECT_US:%.*]] = phi i32 [ 0, [[FOR_BODY_US]] ]904; CHECK-NEXT:    tail call void @bar(i32 noundef [[UNSWITCHED_SELECT_US]])905; CHECK-NEXT:    [[INC_US]] = add nuw nsw i32 [[I_07_US]], 1906; CHECK-NEXT:    [[EXITCOND_NOT_US:%.*]] = icmp eq i32 [[INC_US]], [[NUM]]907; CHECK-NEXT:    br i1 [[EXITCOND_NOT_US]], label [[FOR_COND_CLEANUP_LOOPEXIT_SPLIT_US:%.*]], label [[FOR_BODY_US]]908; CHECK:       for.cond.cleanup.loopexit.split.us:909; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]]910; CHECK:       for.body.preheader.split:911; CHECK-NEXT:    br label [[FOR_BODY:%.*]]912; CHECK:       for.cond.cleanup.loopexit.split:913; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_LOOPEXIT]]914; CHECK:       for.cond.cleanup.loopexit:915; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]916; CHECK:       for.cond.cleanup:917; CHECK-NEXT:    ret i32 undef918; CHECK:       for.body:919; CHECK-NEXT:    [[I_07:%.*]] = phi i32 [ [[INC:%.*]], [[TMP3:%.*]] ], [ 0, [[FOR_BODY_PREHEADER_SPLIT]] ]920; CHECK-NEXT:    [[REM:%.*]] = and i32 [[I_07]], 1921; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[REM]], 0922; CHECK-NEXT:    [[TMP1:%.*]] = and i1 [[CMP1]], true923; CHECK-NEXT:    br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3]]924; CHECK:       2:925; CHECK-NEXT:    br label [[TMP3]]926; CHECK:       3:927; CHECK-NEXT:    [[UNSWITCHED_SELECT:%.*]] = phi i32 [ [[I_07]], [[TMP2]] ], [ 0, [[FOR_BODY]] ]928; CHECK-NEXT:    tail call void @bar(i32 noundef [[UNSWITCHED_SELECT]])929; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_07]], 1930; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[NUM]]931; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT_SPLIT:%.*]], label [[FOR_BODY]]932;933entry:934  %cmp6 = icmp sgt i32 %num, 0935  br i1 %cmp6, label %for.body, label %for.cond.cleanup936 937for.cond.cleanup:                                 ; preds = %for.body, %entry938  ret i32 undef939 940for.body:                                         ; preds = %entry, %for.body941  %i.07 = phi i32 [ %inc, %for.body ], [ 0, %entry ]942  %rem = and i32 %i.07, 1943  %cmp1 = icmp eq i32 %rem, 0944  %0 = and i1 %cmp1, %cond945  %cond2 = select i1 %0, i32 %i.07, i32 0946  tail call void @bar(i32 noundef %cond2)947  %inc = add nuw nsw i32 %i.07, 1948  %exitcond.not = icmp eq i32 %inc, %num949  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body950}951 952; Test unswitch select when the condition is an OR whose LHS is invariant953define i32 @or_lhs_invariant(i32 %num, i1 %cond) {954; CHECK-LABEL: define i32 @or_lhs_invariant955; CHECK-SAME: (i32 [[NUM:%.*]], i1 [[COND:%.*]]) {956; CHECK-NEXT:  entry:957; CHECK-NEXT:    [[CMP6:%.*]] = icmp sgt i32 [[NUM]], 0958; CHECK-NEXT:    br i1 [[CMP6]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]959; CHECK:       for.body.preheader:960; CHECK-NEXT:    [[COND_FR:%.*]] = freeze i1 [[COND]]961; CHECK-NEXT:    br i1 [[COND_FR]], label [[FOR_BODY_PREHEADER_SPLIT_US:%.*]], label [[FOR_BODY_PREHEADER_SPLIT:%.*]]962; CHECK:       for.body.preheader.split.us:963; CHECK-NEXT:    br label [[FOR_BODY_US:%.*]]964; CHECK:       for.body.us:965; CHECK-NEXT:    [[I_07_US:%.*]] = phi i32 [ [[INC_US:%.*]], [[TMP1:%.*]] ], [ 0, [[FOR_BODY_PREHEADER_SPLIT_US]] ]966; CHECK-NEXT:    br label [[TMP0:%.*]]967; CHECK:       0:968; CHECK-NEXT:    br label [[TMP1]]969; CHECK:       1:970; CHECK-NEXT:    [[UNSWITCHED_SELECT_US:%.*]] = phi i32 [ [[I_07_US]], [[TMP0]] ]971; CHECK-NEXT:    tail call void @bar(i32 noundef [[UNSWITCHED_SELECT_US]])972; CHECK-NEXT:    [[INC_US]] = add nuw nsw i32 [[I_07_US]], 1973; CHECK-NEXT:    [[EXITCOND_NOT_US:%.*]] = icmp eq i32 [[INC_US]], [[NUM]]974; CHECK-NEXT:    br i1 [[EXITCOND_NOT_US]], label [[FOR_COND_CLEANUP_LOOPEXIT_SPLIT_US:%.*]], label [[FOR_BODY_US]]975; CHECK:       for.cond.cleanup.loopexit.split.us:976; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]]977; CHECK:       for.body.preheader.split:978; CHECK-NEXT:    br label [[FOR_BODY:%.*]]979; CHECK:       for.cond.cleanup.loopexit.split:980; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_LOOPEXIT]]981; CHECK:       for.cond.cleanup.loopexit:982; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]983; CHECK:       for.cond.cleanup:984; CHECK-NEXT:    ret i32 undef985; CHECK:       for.body:986; CHECK-NEXT:    [[I_07:%.*]] = phi i32 [ [[INC:%.*]], [[TMP4:%.*]] ], [ 0, [[FOR_BODY_PREHEADER_SPLIT]] ]987; CHECK-NEXT:    [[REM:%.*]] = and i32 [[I_07]], 1988; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[REM]], 0989; CHECK-NEXT:    [[TMP2:%.*]] = or i1 false, [[CMP1]]990; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4]]991; CHECK:       3:992; CHECK-NEXT:    br label [[TMP4]]993; CHECK:       4:994; CHECK-NEXT:    [[UNSWITCHED_SELECT:%.*]] = phi i32 [ [[I_07]], [[TMP3]] ], [ 0, [[FOR_BODY]] ]995; CHECK-NEXT:    tail call void @bar(i32 noundef [[UNSWITCHED_SELECT]])996; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_07]], 1997; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[NUM]]998; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT_SPLIT:%.*]], label [[FOR_BODY]]999;1000entry:1001  %cmp6 = icmp sgt i32 %num, 01002  br i1 %cmp6, label %for.body, label %for.cond.cleanup1003 1004for.cond.cleanup:                                 ; preds = %for.body, %entry1005  ret i32 undef1006 1007for.body:                                         ; preds = %entry, %for.body1008  %i.07 = phi i32 [ %inc, %for.body ], [ 0, %entry ]1009  %rem = and i32 %i.07, 11010  %cmp1 = icmp eq i32 %rem, 01011  %0 = or i1 %cond, %cmp11012  %cond2 = select i1 %0, i32 %i.07, i32 01013  tail call void @bar(i32 noundef %cond2)1014  %inc = add nuw nsw i32 %i.07, 11015  %exitcond.not = icmp eq i32 %inc, %num1016  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1017}1018 1019; Test unswitch select when the condition is an OR whose RHS is invariant1020define i32 @or_rhs_invariant(i32 %num, i1 %cond) {1021; CHECK-LABEL: define i32 @or_rhs_invariant1022; CHECK-SAME: (i32 [[NUM:%.*]], i1 [[COND:%.*]]) {1023; CHECK-NEXT:  entry:1024; CHECK-NEXT:    [[CMP6:%.*]] = icmp sgt i32 [[NUM]], 01025; CHECK-NEXT:    br i1 [[CMP6]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]1026; CHECK:       for.body.preheader:1027; CHECK-NEXT:    [[COND_FR:%.*]] = freeze i1 [[COND]]1028; CHECK-NEXT:    br i1 [[COND_FR]], label [[FOR_BODY_PREHEADER_SPLIT_US:%.*]], label [[FOR_BODY_PREHEADER_SPLIT:%.*]]1029; CHECK:       for.body.preheader.split.us:1030; CHECK-NEXT:    br label [[FOR_BODY_US:%.*]]1031; CHECK:       for.body.us:1032; CHECK-NEXT:    [[I_07_US:%.*]] = phi i32 [ [[INC_US:%.*]], [[TMP1:%.*]] ], [ 0, [[FOR_BODY_PREHEADER_SPLIT_US]] ]1033; CHECK-NEXT:    br label [[TMP0:%.*]]1034; CHECK:       0:1035; CHECK-NEXT:    br label [[TMP1]]1036; CHECK:       1:1037; CHECK-NEXT:    [[UNSWITCHED_SELECT_US:%.*]] = phi i32 [ [[I_07_US]], [[TMP0]] ]1038; CHECK-NEXT:    tail call void @bar(i32 noundef [[UNSWITCHED_SELECT_US]])1039; CHECK-NEXT:    [[INC_US]] = add nuw nsw i32 [[I_07_US]], 11040; CHECK-NEXT:    [[EXITCOND_NOT_US:%.*]] = icmp eq i32 [[INC_US]], [[NUM]]1041; CHECK-NEXT:    br i1 [[EXITCOND_NOT_US]], label [[FOR_COND_CLEANUP_LOOPEXIT_SPLIT_US:%.*]], label [[FOR_BODY_US]]1042; CHECK:       for.cond.cleanup.loopexit.split.us:1043; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]]1044; CHECK:       for.body.preheader.split:1045; CHECK-NEXT:    br label [[FOR_BODY:%.*]]1046; CHECK:       for.cond.cleanup.loopexit.split:1047; CHECK-NEXT:    br label [[FOR_COND_CLEANUP_LOOPEXIT]]1048; CHECK:       for.cond.cleanup.loopexit:1049; CHECK-NEXT:    br label [[FOR_COND_CLEANUP]]1050; CHECK:       for.cond.cleanup:1051; CHECK-NEXT:    ret i32 undef1052; CHECK:       for.body:1053; CHECK-NEXT:    [[I_07:%.*]] = phi i32 [ [[INC:%.*]], [[TMP4:%.*]] ], [ 0, [[FOR_BODY_PREHEADER_SPLIT]] ]1054; CHECK-NEXT:    [[REM:%.*]] = and i32 [[I_07]], 11055; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[REM]], 01056; CHECK-NEXT:    [[TMP2:%.*]] = or i1 [[CMP1]], false1057; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4]]1058; CHECK:       3:1059; CHECK-NEXT:    br label [[TMP4]]1060; CHECK:       4:1061; CHECK-NEXT:    [[UNSWITCHED_SELECT:%.*]] = phi i32 [ [[I_07]], [[TMP3]] ], [ 0, [[FOR_BODY]] ]1062; CHECK-NEXT:    tail call void @bar(i32 noundef [[UNSWITCHED_SELECT]])1063; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_07]], 11064; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[NUM]]1065; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT_SPLIT:%.*]], label [[FOR_BODY]]1066;1067entry:1068  %cmp6 = icmp sgt i32 %num, 01069  br i1 %cmp6, label %for.body, label %for.cond.cleanup1070 1071for.cond.cleanup:                                 ; preds = %for.body, %entry1072  ret i32 undef1073 1074for.body:                                         ; preds = %entry, %for.body1075  %i.07 = phi i32 [ %inc, %for.body ], [ 0, %entry ]1076  %rem = and i32 %i.07, 11077  %cmp1 = icmp eq i32 %rem, 01078  %0 = or i1 %cmp1, %cond1079  %cond2 = select i1 %0, i32 %i.07, i32 01080  tail call void @bar(i32 noundef %cond2)1081  %inc = add nuw nsw i32 %i.07, 11082  %exitcond.not = icmp eq i32 %inc, %num1083  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1084}1085