256 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes='loop(simple-loop-unswitch)' -S %s | FileCheck %s3 4declare void @some_func()5 6define i32 @need_freeze_of_individual_or_conditions1(i1 %cond1, i1 %cond2, i1 %cond3, i1 %cond4) {7; CHECK-LABEL: @need_freeze_of_individual_or_conditions1(8; CHECK-NEXT: entry:9; CHECK-NEXT: [[COND4_FR:%.*]] = freeze i1 [[COND4:%.*]]10; CHECK-NEXT: [[COND1_FR:%.*]] = freeze i1 [[COND1:%.*]]11; CHECK-NEXT: [[TMP0:%.*]] = and i1 [[COND4_FR]], [[COND1_FR]]12; CHECK-NEXT: br i1 [[TMP0]], label [[ENTRY_SPLIT:%.*]], label [[EXIT_SPLIT:%.*]]13; CHECK: entry.split:14; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]15; CHECK: loop.header:16; CHECK-NEXT: [[OR:%.*]] = or i1 [[COND2:%.*]], [[COND3:%.*]]17; CHECK-NEXT: [[AND1:%.*]] = and i1 [[OR]], true18; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 false19; CHECK-NEXT: br i1 [[AND2]], label [[LOOP_LATCH:%.*]], label [[EXIT:%.*]]20; CHECK: loop.latch:21; CHECK-NEXT: call void @some_func()22; CHECK-NEXT: br label [[LOOP_HEADER]]23; CHECK: exit:24; CHECK-NEXT: br label [[EXIT_SPLIT]]25; CHECK: exit.split:26; CHECK-NEXT: ret i32 027;28entry:29 br label %loop.header30 31loop.header:32 %or = or i1 %cond2, %cond333 %and1 = and i1 %or, %cond134 %and2 = select i1 %and1, i1 %cond4, i1 false35 br i1 %and2, label %loop.latch, label %exit36 37loop.latch:38 call void @some_func()39 br label %loop.header40 41exit:42 ret i32 043}44 45define i32 @need_freeze_of_individual_or_conditions2(i1 noundef %cond1, i1 %cond2, i1 %cond3, i1 %cond4) {46; CHECK-LABEL: @need_freeze_of_individual_or_conditions2(47; CHECK-NEXT: entry:48; CHECK-NEXT: [[COND4_FR:%.*]] = freeze i1 [[COND4:%.*]]49; CHECK-NEXT: [[TMP0:%.*]] = and i1 [[COND4_FR]], [[COND1:%.*]]50; CHECK-NEXT: br i1 [[TMP0]], label [[ENTRY_SPLIT:%.*]], label [[EXIT_SPLIT:%.*]]51; CHECK: entry.split:52; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]53; CHECK: loop.header:54; CHECK-NEXT: [[OR:%.*]] = or i1 [[COND2:%.*]], [[COND3:%.*]]55; CHECK-NEXT: [[AND1:%.*]] = and i1 [[OR]], true56; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 false57; CHECK-NEXT: br i1 [[AND2]], label [[LOOP_LATCH:%.*]], label [[EXIT:%.*]]58; CHECK: loop.latch:59; CHECK-NEXT: call void @some_func()60; CHECK-NEXT: br label [[LOOP_HEADER]]61; CHECK: exit:62; CHECK-NEXT: br label [[EXIT_SPLIT]]63; CHECK: exit.split:64; CHECK-NEXT: ret i32 065;66entry:67 br label %loop.header68 69loop.header:70 %or = or i1 %cond2, %cond371 %and1 = and i1 %or, %cond172 %and2 = select i1 %and1, i1 %cond4, i1 false73 br i1 %and2, label %loop.latch, label %exit74 75loop.latch:76 call void @some_func()77 br label %loop.header78 79exit:80 ret i32 081}82 83define i32 @need_freeze_of_individual_or_conditions3(i1 %cond1, i1 %cond2, i1 %cond3, i1 noundef %cond4) {84; CHECK-LABEL: @need_freeze_of_individual_or_conditions3(85; CHECK-NEXT: entry:86; CHECK-NEXT: [[COND1_FR:%.*]] = freeze i1 [[COND1:%.*]]87; CHECK-NEXT: [[TMP0:%.*]] = and i1 [[COND4:%.*]], [[COND1_FR]]88; CHECK-NEXT: br i1 [[TMP0]], label [[ENTRY_SPLIT:%.*]], label [[EXIT_SPLIT:%.*]]89; CHECK: entry.split:90; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]91; CHECK: loop.header:92; CHECK-NEXT: [[OR:%.*]] = or i1 [[COND2:%.*]], [[COND3:%.*]]93; CHECK-NEXT: [[AND1:%.*]] = and i1 [[OR]], true94; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 false95; CHECK-NEXT: br i1 [[AND2]], label [[LOOP_LATCH:%.*]], label [[EXIT:%.*]]96; CHECK: loop.latch:97; CHECK-NEXT: call void @some_func()98; CHECK-NEXT: br label [[LOOP_HEADER]]99; CHECK: exit:100; CHECK-NEXT: br label [[EXIT_SPLIT]]101; CHECK: exit.split:102; CHECK-NEXT: ret i32 0103;104entry:105 br label %loop.header106 107loop.header:108 %or = or i1 %cond2, %cond3109 %and1 = and i1 %or, %cond1110 %and2 = select i1 %and1, i1 %cond4, i1 false111 br i1 %and2, label %loop.latch, label %exit112 113loop.latch:114 call void @some_func()115 br label %loop.header116 117exit:118 ret i32 0119}120 121define i32 @need_freeze_of_individual_and_conditions1(i1 %cond1, i1 %cond4) {122; CHECK-LABEL: @need_freeze_of_individual_and_conditions1(123; CHECK-NEXT: entry:124; CHECK-NEXT: [[COND4_FR:%.*]] = freeze i1 [[COND4:%.*]]125; CHECK-NEXT: [[COND1_FR:%.*]] = freeze i1 [[COND1:%.*]]126; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[COND4_FR]], [[COND1_FR]]127; CHECK-NEXT: br i1 [[TMP0]], label [[EXIT_SPLIT:%.*]], label [[ENTRY_SPLIT:%.*]]128; CHECK: entry.split:129; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]130; CHECK: loop.header:131; CHECK-NEXT: [[COND_OR1:%.*]] = or i1 undef, false132; CHECK-NEXT: [[COND_OR6:%.*]] = select i1 [[COND_OR1]], i1 true, i1 false133; CHECK-NEXT: br i1 [[COND_OR6]], label [[EXIT:%.*]], label [[LOOP_LATCH:%.*]]134; CHECK: loop.latch:135; CHECK-NEXT: br label [[LOOP_HEADER]]136; CHECK: exit:137; CHECK-NEXT: br label [[EXIT_SPLIT]]138; CHECK: exit.split:139; CHECK-NEXT: ret i32 0140;141entry:142 br label %loop.header143 144loop.header:145 %cond_or1 = or i1 undef, %cond1146 %cond_or6 = select i1 %cond_or1, i1 true, i1 %cond4147 br i1 %cond_or6, label %exit, label %loop.latch148 149loop.latch:150 br label %loop.header151 152exit:153 ret i32 0154}155 156define i32 @need_freeze_of_individual_and_conditions2(i1 noundef %cond1, i1 %cond4) {157; CHECK-LABEL: @need_freeze_of_individual_and_conditions2(158; CHECK-NEXT: entry:159; CHECK-NEXT: [[COND4_FR:%.*]] = freeze i1 [[COND4:%.*]]160; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[COND4_FR]], [[COND1:%.*]]161; CHECK-NEXT: br i1 [[TMP0]], label [[EXIT_SPLIT:%.*]], label [[ENTRY_SPLIT:%.*]]162; CHECK: entry.split:163; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]164; CHECK: loop.header:165; CHECK-NEXT: [[COND_OR1:%.*]] = or i1 undef, false166; CHECK-NEXT: [[COND_OR6:%.*]] = select i1 [[COND_OR1]], i1 true, i1 false167; CHECK-NEXT: br i1 [[COND_OR6]], label [[EXIT:%.*]], label [[LOOP_LATCH:%.*]]168; CHECK: loop.latch:169; CHECK-NEXT: br label [[LOOP_HEADER]]170; CHECK: exit:171; CHECK-NEXT: br label [[EXIT_SPLIT]]172; CHECK: exit.split:173; CHECK-NEXT: ret i32 0174;175entry:176 br label %loop.header177 178loop.header:179 %cond_or1 = or i1 undef, %cond1180 %cond_or6 = select i1 %cond_or1, i1 true, i1 %cond4181 br i1 %cond_or6, label %exit, label %loop.latch182 183loop.latch:184 br label %loop.header185 186exit:187 ret i32 0188}189 190define i32 @need_freeze_of_individual_and_conditions3(i1 %cond1, i1 noundef %cond4) {191; CHECK-LABEL: @need_freeze_of_individual_and_conditions3(192; CHECK-NEXT: entry:193; CHECK-NEXT: [[COND1_FR:%.*]] = freeze i1 [[COND1:%.*]]194; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[COND4:%.*]], [[COND1_FR]]195; CHECK-NEXT: br i1 [[TMP0]], label [[EXIT_SPLIT:%.*]], label [[ENTRY_SPLIT:%.*]]196; CHECK: entry.split:197; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]198; CHECK: loop.header:199; CHECK-NEXT: [[COND_OR1:%.*]] = or i1 undef, false200; CHECK-NEXT: [[COND_OR6:%.*]] = select i1 [[COND_OR1]], i1 true, i1 false201; CHECK-NEXT: br i1 [[COND_OR6]], label [[EXIT:%.*]], label [[LOOP_LATCH:%.*]]202; CHECK: loop.latch:203; CHECK-NEXT: br label [[LOOP_HEADER]]204; CHECK: exit:205; CHECK-NEXT: br label [[EXIT_SPLIT]]206; CHECK: exit.split:207; CHECK-NEXT: ret i32 0208;209entry:210 br label %loop.header211 212loop.header:213 %cond_or1 = or i1 undef, %cond1214 %cond_or6 = select i1 %cond_or1, i1 true, i1 %cond4215 br i1 %cond_or6, label %exit, label %loop.latch216 217loop.latch:218 br label %loop.header219 220exit:221 ret i32 0222}223 224define i32 @need_freeze_of_individual_and_conditions4(i1 noundef %cond1, i1 noundef %cond4) {225; CHECK-LABEL: @need_freeze_of_individual_and_conditions4(226; CHECK-NEXT: entry:227; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[COND4:%.*]], [[COND1:%.*]]228; CHECK-NEXT: br i1 [[TMP0]], label [[EXIT_SPLIT:%.*]], label [[ENTRY_SPLIT:%.*]]229; CHECK: entry.split:230; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]231; CHECK: loop.header:232; CHECK-NEXT: [[COND_OR1:%.*]] = or i1 undef, false233; CHECK-NEXT: [[COND_OR6:%.*]] = select i1 [[COND_OR1]], i1 true, i1 false234; CHECK-NEXT: br i1 [[COND_OR6]], label [[EXIT:%.*]], label [[LOOP_LATCH:%.*]]235; CHECK: loop.latch:236; CHECK-NEXT: br label [[LOOP_HEADER]]237; CHECK: exit:238; CHECK-NEXT: br label [[EXIT_SPLIT]]239; CHECK: exit.split:240; CHECK-NEXT: ret i32 0241;242entry:243 br label %loop.header244 245loop.header:246 %cond_or1 = or i1 undef, %cond1247 %cond_or6 = select i1 %cond_or1, i1 true, i1 %cond4248 br i1 %cond_or6, label %exit, label %loop.latch249 250loop.latch:251 br label %loop.header252 253exit:254 ret i32 0255}256