670 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals2; RUN: opt < %s -S -simple-loop-unswitch-inject-invariant-conditions=true -passes="loop(simple-loop-unswitch<nontrivial>),simplifycfg" | FileCheck %s3; RUN: opt < %s -S -simple-loop-unswitch-inject-invariant-conditions=true -passes="loop-mssa(simple-loop-unswitch<nontrivial>),simplifycfg" -verify-memoryssa | FileCheck %s4 5define i32 @test_01(ptr noundef %p, i32 noundef %n, i32 noundef %limit, ptr noundef %arr, ptr noundef %x_p) !prof !{!"function_entry_count", i32 10} {6; CHECK-LABEL: @test_01(7; CHECK-NEXT: entry:8; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[X_P:%.*]], align 4, !noundef [[META1:![0-9]+]]9; CHECK-NEXT: [[INJECTED_COND:%.*]] = icmp ule i32 [[LIMIT:%.*]], [[X]]10; CHECK-NEXT: br i1 [[INJECTED_COND]], label [[LOOP_US:%.*]], label [[LOOP:%.*]], !prof [[PROF2:![0-9]+]]11; CHECK: loop.us:12; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT_US:%.*]], [[GUARDED_US:%.*]] ], [ 0, [[ENTRY:%.*]] ]13; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[IV]]14; CHECK-NEXT: [[EL:%.*]] = load i32, ptr [[EL_PTR]], align 415; CHECK-NEXT: [[BOUND_CHECK:%.*]] = icmp ult i32 [[EL]], [[LIMIT]]16; CHECK-NEXT: br i1 [[BOUND_CHECK]], label [[GUARDED_US]], label [[COMMON_RET:%.*]], !prof [[PROF3:![0-9]+]]17; CHECK: guarded.us:18; CHECK-NEXT: [[RANGE_CHECK_US:%.*]] = icmp ult i32 [[EL]], [[X]]19; CHECK-NEXT: [[ARR_PTR_US:%.*]] = getelementptr i32, ptr [[ARR:%.*]], i32 [[EL]]20; CHECK-NEXT: store i32 [[IV]], ptr [[ARR_PTR_US]], align 421; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV]], 122; CHECK-NEXT: [[LOOP_COND_US:%.*]] = icmp slt i32 [[IV_NEXT_US]], [[N:%.*]]23; CHECK-NEXT: br i1 [[LOOP_COND_US]], label [[LOOP_US]], label [[COMMON_RET]]24; CHECK: loop:25; CHECK-NEXT: [[IV1:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[ENTRY]] ]26; CHECK-NEXT: [[EL_PTR1:%.*]] = getelementptr i32, ptr [[P]], i32 [[IV1]]27; CHECK-NEXT: [[EL1:%.*]] = load i32, ptr [[EL_PTR1]], align 428; CHECK-NEXT: [[BOUND_CHECK1:%.*]] = icmp ult i32 [[EL1]], [[LIMIT]]29; CHECK-NEXT: br i1 [[BOUND_CHECK1]], label [[GUARDED:%.*]], label [[COMMON_RET]], !prof [[PROF3]]30; CHECK: guarded:31; CHECK-NEXT: [[RANGE_CHECK:%.*]] = icmp ult i32 [[EL1]], [[X]]32; CHECK-NEXT: br i1 [[RANGE_CHECK]], label [[BACKEDGE]], label [[COMMON_RET]], !prof [[PROF3]]33; CHECK: backedge:34; CHECK-NEXT: [[ARR_PTR:%.*]] = getelementptr i32, ptr [[ARR]], i32 [[EL1]]35; CHECK-NEXT: store i32 [[IV1]], ptr [[ARR_PTR]], align 436; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV1]], 137; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], [[N]]38; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[COMMON_RET]], !llvm.loop [[LOOP4:![0-9]+]]39; CHECK: common.ret:40; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 0, [[BACKEDGE]] ], [ 0, [[GUARDED_US]] ], [ -1, [[LOOP]] ], [ -1, [[LOOP_US]] ], [ -2, [[GUARDED]] ]41; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]42;43entry:44 %x = load i32, ptr %x_p, align 4, !noundef !{}45 br label %loop46 47loop: ; preds = %backedge, %entry48 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]49 %el.ptr = getelementptr i32, ptr %p, i32 %iv50 %el = load i32, ptr %el.ptr, align 451 %bound_check = icmp ult i32 %el, %limit52 br i1 %bound_check, label %guarded, label %bound_check_failed, !prof !{!"branch_weights", i32 100, i32 1}53 54guarded: ; preds = %loop55 %range_check = icmp ult i32 %el, %x56 br i1 %range_check, label %backedge, label %range_check_failed, !prof !{!"branch_weights", i32 100, i32 1}57 58backedge: ; preds = %guarded59 %arr.ptr = getelementptr i32, ptr %arr, i32 %el60 store i32 %iv, ptr %arr.ptr, align 461 %iv.next = add i32 %iv, 162 %loop_cond = icmp slt i32 %iv.next, %n63 br i1 %loop_cond, label %loop, label %exit64 65exit: ; preds = %backedge66 ret i32 067 68bound_check_failed: ; preds = %loop69 ret i32 -170 71range_check_failed: ; preds = %guarded72 ret i32 -273}74 75; Should not optimize: profile metadata is missing.76define i32 @test_01_neg_void_profile(ptr noundef %p, i32 noundef %n, i32 noundef %limit, ptr noundef %arr, ptr noundef %x_p) {77; CHECK-LABEL: @test_01_neg_void_profile(78; CHECK-NEXT: entry:79; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[X_P:%.*]], align 4, !noundef [[META1]]80; CHECK-NEXT: br label [[LOOP:%.*]]81; CHECK: loop:82; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]83; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[IV]]84; CHECK-NEXT: [[EL:%.*]] = load i32, ptr [[EL_PTR]], align 485; CHECK-NEXT: [[BOUND_CHECK:%.*]] = icmp ult i32 [[EL]], [[LIMIT:%.*]]86; CHECK-NEXT: br i1 [[BOUND_CHECK]], label [[GUARDED:%.*]], label [[COMMON_RET:%.*]]87; CHECK: guarded:88; CHECK-NEXT: [[RANGE_CHECK:%.*]] = icmp ult i32 [[EL]], [[X]]89; CHECK-NEXT: br i1 [[RANGE_CHECK]], label [[BACKEDGE]], label [[COMMON_RET]]90; CHECK: backedge:91; CHECK-NEXT: [[ARR_PTR:%.*]] = getelementptr i32, ptr [[ARR:%.*]], i32 [[EL]]92; CHECK-NEXT: store i32 [[IV]], ptr [[ARR_PTR]], align 493; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 194; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], [[N:%.*]]95; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[COMMON_RET]]96; CHECK: common.ret:97; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 0, [[BACKEDGE]] ], [ -1, [[LOOP]] ], [ -2, [[GUARDED]] ]98; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]99;100entry:101 %x = load i32, ptr %x_p, align 4, !noundef !{}102 br label %loop103 104loop: ; preds = %backedge, %entry105 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]106 %el.ptr = getelementptr i32, ptr %p, i32 %iv107 %el = load i32, ptr %el.ptr, align 4108 %bound_check = icmp ult i32 %el, %limit109 br i1 %bound_check, label %guarded, label %bound_check_failed110 111guarded: ; preds = %loop112 %range_check = icmp ult i32 %el, %x113 br i1 %range_check, label %backedge, label %range_check_failed114 115backedge: ; preds = %guarded116 %arr.ptr = getelementptr i32, ptr %arr, i32 %el117 store i32 %iv, ptr %arr.ptr, align 4118 %iv.next = add i32 %iv, 1119 %loop_cond = icmp slt i32 %iv.next, %n120 br i1 %loop_cond, label %loop, label %exit121 122exit: ; preds = %backedge123 ret i32 0124 125bound_check_failed: ; preds = %loop126 ret i32 -1127 128range_check_failed: ; preds = %guarded129 ret i32 -2130}131 132; Same as test_01, but n and limit are constants.133define i32 @test_01_constants(ptr noundef %p, ptr noundef %arr, ptr noundef %x_p) {134; CHECK-LABEL: @test_01_constants(135; CHECK-NEXT: entry:136; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[X_P:%.*]], align 4, !noundef [[META1]]137; CHECK-NEXT: [[INJECTED_COND:%.*]] = icmp ule i32 200, 300138; CHECK-NEXT: br i1 [[INJECTED_COND]], label [[LOOP_US:%.*]], label [[LOOP:%.*]]139; CHECK: loop.us:140; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ [[IV_NEXT_US:%.*]], [[GUARDED_US:%.*]] ], [ 0, [[ENTRY:%.*]] ]141; CHECK-NEXT: [[EL_PTR_US:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[IV_US]]142; CHECK-NEXT: [[EL_US:%.*]] = load i32, ptr [[EL_PTR_US]], align 4143; CHECK-NEXT: [[BOUND_CHECK_US:%.*]] = icmp ult i32 [[EL_US]], 200144; CHECK-NEXT: br i1 [[BOUND_CHECK_US]], label [[GUARDED_US]], label [[COMMON_RET:%.*]], !prof [[PROF3]]145; CHECK: guarded.us:146; CHECK-NEXT: [[RANGE_CHECK_US:%.*]] = icmp ult i32 [[EL_US]], 300147; CHECK-NEXT: [[ARR_PTR_US:%.*]] = getelementptr i32, ptr [[ARR:%.*]], i32 [[EL_US]]148; CHECK-NEXT: store i32 [[IV_US]], ptr [[ARR_PTR_US]], align 4149; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1150; CHECK-NEXT: [[LOOP_COND_US:%.*]] = icmp slt i32 [[IV_NEXT_US]], 1000151; CHECK-NEXT: br i1 [[LOOP_COND_US]], label [[LOOP_US]], label [[COMMON_RET]]152; CHECK: loop:153; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[ENTRY]] ]154; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, ptr [[P]], i32 [[IV]]155; CHECK-NEXT: [[EL:%.*]] = load i32, ptr [[EL_PTR]], align 4156; CHECK-NEXT: [[BOUND_CHECK:%.*]] = icmp ult i32 [[EL]], 200157; CHECK-NEXT: br i1 [[BOUND_CHECK]], label [[BACKEDGE]], label [[COMMON_RET]], !prof [[PROF3]]158; CHECK: backedge:159; CHECK-NEXT: [[ARR_PTR:%.*]] = getelementptr i32, ptr [[ARR]], i32 [[EL]]160; CHECK-NEXT: store i32 [[IV]], ptr [[ARR_PTR]], align 4161; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1162; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], 1000163; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[COMMON_RET]], !llvm.loop [[LOOP6:![0-9]+]]164; CHECK: common.ret:165; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 0, [[BACKEDGE]] ], [ 0, [[GUARDED_US]] ], [ -1, [[LOOP]] ], [ -1, [[LOOP_US]] ]166; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]167;168entry:169 %x = load i32, ptr %x_p, align 4, !noundef !{}170 br label %loop171 172loop: ; preds = %backedge, %entry173 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]174 %el.ptr = getelementptr i32, ptr %p, i32 %iv175 %el = load i32, ptr %el.ptr, align 4176 %bound_check = icmp ult i32 %el, 200177 br i1 %bound_check, label %guarded, label %bound_check_failed, !prof !{!"branch_weights", i32 100, i32 1}178 179guarded: ; preds = %loop180 %range_check = icmp ult i32 %el, 300181 br i1 %range_check, label %backedge, label %range_check_failed, !prof !{!"branch_weights", i32 100, i32 1}182 183backedge: ; preds = %guarded184 %arr.ptr = getelementptr i32, ptr %arr, i32 %el185 store i32 %iv, ptr %arr.ptr, align 4186 %iv.next = add i32 %iv, 1187 %loop_cond = icmp slt i32 %iv.next, 1000188 br i1 %loop_cond, label %loop, label %exit189 190exit: ; preds = %backedge191 ret i32 0192 193bound_check_failed: ; preds = %loop194 ret i32 -1195 196range_check_failed: ; preds = %guarded197 ret i32 -2198}199 200define i32 @test_01_neg_degenerate_profile(ptr noundef %p, i32 noundef %n, i32 noundef %limit, ptr noundef %arr, ptr noundef %x_p) {201; CHECK-LABEL: @test_01_neg_degenerate_profile(202; CHECK-NEXT: entry:203; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[X_P:%.*]], align 4, !noundef [[META1]]204; CHECK-NEXT: br label [[LOOP:%.*]]205; CHECK: loop:206; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]207; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[IV]]208; CHECK-NEXT: [[EL:%.*]] = load i32, ptr [[EL_PTR]], align 4209; CHECK-NEXT: [[BOUND_CHECK:%.*]] = icmp ult i32 [[EL]], [[LIMIT:%.*]]210; CHECK-NEXT: br i1 [[BOUND_CHECK]], label [[GUARDED:%.*]], label [[COMMON_RET:%.*]], !prof [[PROF3]]211; CHECK: guarded:212; CHECK-NEXT: [[RANGE_CHECK:%.*]] = icmp ult i32 [[EL]], [[X]]213; CHECK-NEXT: br i1 [[RANGE_CHECK]], label [[BACKEDGE]], label [[COMMON_RET]], !prof [[PROF7:![0-9]+]]214; CHECK: backedge:215; CHECK-NEXT: [[ARR_PTR:%.*]] = getelementptr i32, ptr [[ARR:%.*]], i32 [[EL]]216; CHECK-NEXT: store i32 [[IV]], ptr [[ARR_PTR]], align 4217; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1218; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], [[N:%.*]]219; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[COMMON_RET]]220; CHECK: common.ret:221; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 0, [[BACKEDGE]] ], [ -1, [[LOOP]] ], [ -2, [[GUARDED]] ]222; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]223;224entry:225 %x = load i32, ptr %x_p, align 4, !noundef !{}226 br label %loop227 228loop: ; preds = %backedge, %entry229 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]230 %el.ptr = getelementptr i32, ptr %p, i32 %iv231 %el = load i32, ptr %el.ptr, align 4232 %bound_check = icmp ult i32 %el, %limit233 br i1 %bound_check, label %guarded, label %bound_check_failed, !prof !{!"branch_weights", i32 100, i32 1}234 235guarded: ; preds = %loop236 %range_check = icmp ult i32 %el, %x237 br i1 %range_check, label %backedge, label %range_check_failed, !prof !{!"branch_weights", i32 0, i32 0}238 239backedge: ; preds = %guarded240 %arr.ptr = getelementptr i32, ptr %arr, i32 %el241 store i32 %iv, ptr %arr.ptr, align 4242 %iv.next = add i32 %iv, 1243 %loop_cond = icmp slt i32 %iv.next, %n244 br i1 %loop_cond, label %loop, label %exit245 246exit: ; preds = %backedge247 ret i32 0248 249bound_check_failed: ; preds = %loop250 ret i32 -1251 252range_check_failed: ; preds = %guarded253 ret i32 -2254}255 256; Should not optimize: cold branch.257define i32 @test_01_neg_cold(ptr noundef %p, i32 noundef %n, i32 noundef %limit, ptr noundef %arr, ptr noundef %x_p) {258; CHECK-LABEL: @test_01_neg_cold(259; CHECK-NEXT: entry:260; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[X_P:%.*]], align 4, !noundef [[META1]]261; CHECK-NEXT: br label [[LOOP:%.*]]262; CHECK: loop:263; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]264; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[IV]]265; CHECK-NEXT: [[EL:%.*]] = load i32, ptr [[EL_PTR]], align 4266; CHECK-NEXT: [[BOUND_CHECK:%.*]] = icmp ult i32 [[EL]], [[LIMIT:%.*]]267; CHECK-NEXT: br i1 [[BOUND_CHECK]], label [[GUARDED:%.*]], label [[COMMON_RET:%.*]], !prof [[PROF3]]268; CHECK: guarded:269; CHECK-NEXT: [[RANGE_CHECK:%.*]] = icmp ult i32 [[EL]], [[X]]270; CHECK-NEXT: br i1 [[RANGE_CHECK]], label [[BACKEDGE]], label [[COMMON_RET]], !prof [[PROF8:![0-9]+]]271; CHECK: backedge:272; CHECK-NEXT: [[ARR_PTR:%.*]] = getelementptr i32, ptr [[ARR:%.*]], i32 [[EL]]273; CHECK-NEXT: store i32 [[IV]], ptr [[ARR_PTR]], align 4274; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1275; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], [[N:%.*]]276; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[COMMON_RET]]277; CHECK: common.ret:278; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 0, [[BACKEDGE]] ], [ -1, [[LOOP]] ], [ -2, [[GUARDED]] ]279; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]280;281entry:282 %x = load i32, ptr %x_p, align 4, !noundef !{}283 br label %loop284 285loop: ; preds = %backedge, %entry286 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]287 %el.ptr = getelementptr i32, ptr %p, i32 %iv288 %el = load i32, ptr %el.ptr, align 4289 %bound_check = icmp ult i32 %el, %limit290 br i1 %bound_check, label %guarded, label %bound_check_failed, !prof !{!"branch_weights", i32 100, i32 1}291 292guarded: ; preds = %loop293 %range_check = icmp ult i32 %el, %x294 br i1 %range_check, label %backedge, label %range_check_failed, !prof !{!"branch_weights", i32 2, i32 3}295 296backedge: ; preds = %guarded297 %arr.ptr = getelementptr i32, ptr %arr, i32 %el298 store i32 %iv, ptr %arr.ptr, align 4299 %iv.next = add i32 %iv, 1300 %loop_cond = icmp slt i32 %iv.next, %n301 br i1 %loop_cond, label %loop, label %exit302 303exit: ; preds = %backedge304 ret i32 0305 306bound_check_failed: ; preds = %loop307 ret i32 -1308 309range_check_failed: ; preds = %guarded310 ret i32 -2311}312 313; Make sure we don't crash if probability overflows314define i32 @test_01_neg_overflowing_metadata(ptr noundef %p, i32 noundef %n, i32 noundef %limit, ptr noundef %arr, ptr noundef %x_p) {315; CHECK-LABEL: @test_01_neg_overflowing_metadata(316; CHECK-NEXT: entry:317; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[X_P:%.*]], align 4, !noundef [[META1]]318; CHECK-NEXT: br label [[LOOP:%.*]]319; CHECK: loop:320; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]321; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[IV]]322; CHECK-NEXT: [[EL:%.*]] = load i32, ptr [[EL_PTR]], align 4323; CHECK-NEXT: [[BOUND_CHECK:%.*]] = icmp ult i32 [[EL]], [[LIMIT:%.*]]324; CHECK-NEXT: br i1 [[BOUND_CHECK]], label [[GUARDED:%.*]], label [[COMMON_RET:%.*]], !prof [[PROF9:![0-9]+]]325; CHECK: guarded:326; CHECK-NEXT: [[RANGE_CHECK:%.*]] = icmp ult i32 [[EL]], [[X]]327; CHECK-NEXT: br i1 [[RANGE_CHECK]], label [[BACKEDGE]], label [[COMMON_RET]], !prof [[PROF9]]328; CHECK: backedge:329; CHECK-NEXT: [[ARR_PTR:%.*]] = getelementptr i32, ptr [[ARR:%.*]], i32 [[EL]]330; CHECK-NEXT: store i32 [[IV]], ptr [[ARR_PTR]], align 4331; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1332; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], [[N:%.*]]333; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[COMMON_RET]]334; CHECK: common.ret:335; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 0, [[BACKEDGE]] ], [ -1, [[LOOP]] ], [ -2, [[GUARDED]] ]336; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]337;338entry:339 %x = load i32, ptr %x_p, align 4, !noundef !{}340 br label %loop341 342loop: ; preds = %backedge, %entry343 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]344 %el.ptr = getelementptr i32, ptr %p, i32 %iv345 %el = load i32, ptr %el.ptr, align 4346 %bound_check = icmp ult i32 %el, %limit347 br i1 %bound_check, label %guarded, label %bound_check_failed, !prof !{!"branch_weights", i32 -1, i32 -1000}348 349guarded: ; preds = %loop350 %range_check = icmp ult i32 %el, %x351 br i1 %range_check, label %backedge, label %range_check_failed, !prof !{!"branch_weights", i32 -1, i32 -1000}352 353backedge: ; preds = %guarded354 %arr.ptr = getelementptr i32, ptr %arr, i32 %el355 store i32 %iv, ptr %arr.ptr, align 4356 %iv.next = add i32 %iv, 1357 %loop_cond = icmp slt i32 %iv.next, %n358 br i1 %loop_cond, label %loop, label %exit359 360exit: ; preds = %backedge361 ret i32 0362 363bound_check_failed: ; preds = %loop364 ret i32 -1365 366range_check_failed: ; preds = %guarded367 ret i32 -2368}369 370 371define i32 @test_02(ptr noundef %p, i32 noundef %n, i32 noundef %limit, ptr noundef %arr, ptr noundef %x_p) {372; CHECK-LABEL: @test_02(373; CHECK-NEXT: entry:374; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[X_P:%.*]], align 4, !noundef [[META1]]375; CHECK-NEXT: [[INJECTED_COND:%.*]] = icmp ule i32 -2147483648, [[X]]376; CHECK-NEXT: br i1 [[INJECTED_COND]], label [[LOOP_US:%.*]], label [[LOOP:%.*]]377; CHECK: loop.us:378; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ [[IV_NEXT_US:%.*]], [[GUARDED_US:%.*]] ], [ 0, [[ENTRY:%.*]] ]379; CHECK-NEXT: [[EL_PTR_US:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[IV_US]]380; CHECK-NEXT: [[EL_US:%.*]] = load i32, ptr [[EL_PTR_US]], align 4381; CHECK-NEXT: [[BOUND_CHECK_US:%.*]] = icmp sge i32 [[EL_US]], 0382; CHECK-NEXT: br i1 [[BOUND_CHECK_US]], label [[GUARDED_US]], label [[COMMON_RET:%.*]], !prof [[PROF3]]383; CHECK: guarded.us:384; CHECK-NEXT: [[RANGE_CHECK_US:%.*]] = icmp ult i32 [[EL_US]], [[X]]385; CHECK-NEXT: [[ARR_PTR_US:%.*]] = getelementptr i32, ptr [[ARR:%.*]], i32 [[EL_US]]386; CHECK-NEXT: store i32 [[IV_US]], ptr [[ARR_PTR_US]], align 4387; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1388; CHECK-NEXT: [[LOOP_COND_US:%.*]] = icmp slt i32 [[IV_NEXT_US]], [[N:%.*]]389; CHECK-NEXT: br i1 [[LOOP_COND_US]], label [[LOOP_US]], label [[COMMON_RET]]390; CHECK: loop:391; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[ENTRY]] ]392; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, ptr [[P]], i32 [[IV]]393; CHECK-NEXT: [[EL:%.*]] = load i32, ptr [[EL_PTR]], align 4394; CHECK-NEXT: [[BOUND_CHECK:%.*]] = icmp sge i32 [[EL]], 0395; CHECK-NEXT: br i1 [[BOUND_CHECK]], label [[GUARDED:%.*]], label [[COMMON_RET]], !prof [[PROF3]]396; CHECK: guarded:397; CHECK-NEXT: [[RANGE_CHECK:%.*]] = icmp ult i32 [[EL]], [[X]]398; CHECK-NEXT: br i1 [[RANGE_CHECK]], label [[BACKEDGE]], label [[COMMON_RET]], !prof [[PROF3]]399; CHECK: backedge:400; CHECK-NEXT: [[ARR_PTR:%.*]] = getelementptr i32, ptr [[ARR]], i32 [[EL]]401; CHECK-NEXT: store i32 [[IV]], ptr [[ARR_PTR]], align 4402; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1403; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], [[N]]404; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[COMMON_RET]], !llvm.loop [[LOOP10:![0-9]+]]405; CHECK: common.ret:406; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 0, [[BACKEDGE]] ], [ 0, [[GUARDED_US]] ], [ -1, [[LOOP]] ], [ -1, [[LOOP_US]] ], [ -2, [[GUARDED]] ]407; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]408;409entry:410 %x = load i32, ptr %x_p, align 4, !noundef !{}411 br label %loop412 413loop: ; preds = %backedge, %entry414 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]415 %el.ptr = getelementptr i32, ptr %p, i32 %iv416 %el = load i32, ptr %el.ptr, align 4417 %bound_check = icmp sge i32 %el, 0418 br i1 %bound_check, label %guarded, label %bound_check_failed, !prof !{!"branch_weights", i32 100, i32 1}419 420guarded: ; preds = %loop421 %range_check = icmp ult i32 %el, %x422 br i1 %range_check, label %backedge, label %range_check_failed, !prof !{!"branch_weights", i32 100, i32 1}423 424backedge: ; preds = %guarded425 %arr.ptr = getelementptr i32, ptr %arr, i32 %el426 store i32 %iv, ptr %arr.ptr, align 4427 %iv.next = add i32 %iv, 1428 %loop_cond = icmp slt i32 %iv.next, %n429 br i1 %loop_cond, label %loop, label %exit430 431exit: ; preds = %backedge432 ret i32 0433 434bound_check_failed: ; preds = %loop435 ret i32 -1436 437range_check_failed: ; preds = %guarded438 ret i32 -2439}440 441define i32 @test_02_inverse(ptr noundef %p, i32 noundef %n, i32 noundef %limit, ptr noundef %arr, ptr noundef %x_p) {442; CHECK-LABEL: @test_02_inverse(443; CHECK-NEXT: entry:444; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[X_P:%.*]], align 4, !noundef [[META1]]445; CHECK-NEXT: [[INJECTED_COND:%.*]] = icmp ule i32 -2147483648, [[X]]446; CHECK-NEXT: br i1 [[INJECTED_COND]], label [[LOOP_US:%.*]], label [[LOOP:%.*]]447; CHECK: loop.us:448; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ [[IV_NEXT_US:%.*]], [[GUARDED_US:%.*]] ], [ 0, [[ENTRY:%.*]] ]449; CHECK-NEXT: [[EL_PTR_US:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[IV_US]]450; CHECK-NEXT: [[EL_US:%.*]] = load i32, ptr [[EL_PTR_US]], align 4451; CHECK-NEXT: [[BOUND_CHECK_US:%.*]] = icmp sge i32 [[EL_US]], 0452; CHECK-NEXT: br i1 [[BOUND_CHECK_US]], label [[GUARDED_US]], label [[COMMON_RET:%.*]], !prof [[PROF3]]453; CHECK: guarded.us:454; CHECK-NEXT: [[RANGE_CHECK_US:%.*]] = icmp uge i32 [[EL_US]], [[X]]455; CHECK-NEXT: [[ARR_PTR_US:%.*]] = getelementptr i32, ptr [[ARR:%.*]], i32 [[EL_US]]456; CHECK-NEXT: store i32 [[IV_US]], ptr [[ARR_PTR_US]], align 4457; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1458; CHECK-NEXT: [[LOOP_COND_US:%.*]] = icmp slt i32 [[IV_NEXT_US]], [[N:%.*]]459; CHECK-NEXT: br i1 [[LOOP_COND_US]], label [[LOOP_US]], label [[COMMON_RET]]460; CHECK: loop:461; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[ENTRY]] ]462; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, ptr [[P]], i32 [[IV]]463; CHECK-NEXT: [[EL:%.*]] = load i32, ptr [[EL_PTR]], align 4464; CHECK-NEXT: [[BOUND_CHECK:%.*]] = icmp sge i32 [[EL]], 0465; CHECK-NEXT: br i1 [[BOUND_CHECK]], label [[GUARDED:%.*]], label [[COMMON_RET]], !prof [[PROF3]]466; CHECK: guarded:467; CHECK-NEXT: [[RANGE_CHECK:%.*]] = icmp uge i32 [[EL]], [[X]]468; CHECK-NEXT: br i1 [[RANGE_CHECK]], label [[COMMON_RET]], label [[BACKEDGE]], !prof [[PROF11:![0-9]+]]469; CHECK: backedge:470; CHECK-NEXT: [[ARR_PTR:%.*]] = getelementptr i32, ptr [[ARR]], i32 [[EL]]471; CHECK-NEXT: store i32 [[IV]], ptr [[ARR_PTR]], align 4472; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1473; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], [[N]]474; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[COMMON_RET]], !llvm.loop [[LOOP12:![0-9]+]]475; CHECK: common.ret:476; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 0, [[BACKEDGE]] ], [ 0, [[GUARDED_US]] ], [ -1, [[LOOP]] ], [ -1, [[LOOP_US]] ], [ -2, [[GUARDED]] ]477; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]478;479entry:480 %x = load i32, ptr %x_p, align 4, !noundef !{}481 br label %loop482 483loop: ; preds = %backedge, %entry484 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]485 %el.ptr = getelementptr i32, ptr %p, i32 %iv486 %el = load i32, ptr %el.ptr, align 4487 %bound_check = icmp sge i32 %el, 0488 br i1 %bound_check, label %guarded, label %bound_check_failed, !prof !{!"branch_weights", i32 100, i32 1}489 490guarded: ; preds = %loop491 %range_check = icmp uge i32 %el, %x492 br i1 %range_check, label %range_check_failed, label %backedge, !prof !{!"branch_weights", i32 1, i32 100}493 494backedge: ; preds = %guarded495 %arr.ptr = getelementptr i32, ptr %arr, i32 %el496 store i32 %iv, ptr %arr.ptr, align 4497 %iv.next = add i32 %iv, 1498 %loop_cond = icmp slt i32 %iv.next, %n499 br i1 %loop_cond, label %loop, label %exit500 501exit: ; preds = %backedge502 ret i32 0503 504bound_check_failed: ; preds = %loop505 ret i32 -1506 507range_check_failed: ; preds = %guarded508 ret i32 -2509}510 511define i32 @test_03(ptr noundef %p, i32 noundef %n, i32 noundef %limit, ptr noundef %arr, ptr noundef %x_p) {512; CHECK-LABEL: @test_03(513; CHECK-NEXT: entry:514; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[X_P:%.*]], align 4, !noundef [[META1]]515; CHECK-NEXT: [[INJECTED_COND:%.*]] = icmp ule i32 -2147483648, [[X]]516; CHECK-NEXT: br i1 [[INJECTED_COND]], label [[LOOP_US:%.*]], label [[LOOP:%.*]]517; CHECK: loop.us:518; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ [[IV_NEXT_US:%.*]], [[GUARDED_US:%.*]] ], [ 0, [[ENTRY:%.*]] ]519; CHECK-NEXT: [[EL_PTR_US:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[IV_US]]520; CHECK-NEXT: [[EL_US:%.*]] = load i32, ptr [[EL_PTR_US]], align 4521; CHECK-NEXT: [[BOUND_CHECK_US:%.*]] = icmp slt i32 [[EL_US]], 0522; CHECK-NEXT: br i1 [[BOUND_CHECK_US]], label [[COMMON_RET:%.*]], label [[GUARDED_US]], !prof [[PROF11]]523; CHECK: guarded.us:524; CHECK-NEXT: [[RANGE_CHECK_US:%.*]] = icmp ult i32 [[EL_US]], [[X]]525; CHECK-NEXT: [[ARR_PTR_US:%.*]] = getelementptr i32, ptr [[ARR:%.*]], i32 [[EL_US]]526; CHECK-NEXT: store i32 [[IV_US]], ptr [[ARR_PTR_US]], align 4527; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1528; CHECK-NEXT: [[LOOP_COND_US:%.*]] = icmp slt i32 [[IV_NEXT_US]], [[N:%.*]]529; CHECK-NEXT: br i1 [[LOOP_COND_US]], label [[LOOP_US]], label [[COMMON_RET]]530; CHECK: loop:531; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[ENTRY]] ]532; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, ptr [[P]], i32 [[IV]]533; CHECK-NEXT: [[EL:%.*]] = load i32, ptr [[EL_PTR]], align 4534; CHECK-NEXT: [[BOUND_CHECK:%.*]] = icmp slt i32 [[EL]], 0535; CHECK-NEXT: br i1 [[BOUND_CHECK]], label [[COMMON_RET]], label [[GUARDED:%.*]], !prof [[PROF11]]536; CHECK: guarded:537; CHECK-NEXT: [[RANGE_CHECK:%.*]] = icmp ult i32 [[EL]], [[X]]538; CHECK-NEXT: br i1 [[RANGE_CHECK]], label [[BACKEDGE]], label [[COMMON_RET]], !prof [[PROF3]]539; CHECK: backedge:540; CHECK-NEXT: [[ARR_PTR:%.*]] = getelementptr i32, ptr [[ARR]], i32 [[EL]]541; CHECK-NEXT: store i32 [[IV]], ptr [[ARR_PTR]], align 4542; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1543; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], [[N]]544; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[COMMON_RET]], !llvm.loop [[LOOP13:![0-9]+]]545; CHECK: common.ret:546; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 0, [[BACKEDGE]] ], [ 0, [[GUARDED_US]] ], [ -1, [[LOOP]] ], [ -1, [[LOOP_US]] ], [ -2, [[GUARDED]] ]547; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]548;549entry:550 %x = load i32, ptr %x_p, align 4, !noundef !{}551 br label %loop552 553loop: ; preds = %backedge, %entry554 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]555 %el.ptr = getelementptr i32, ptr %p, i32 %iv556 %el = load i32, ptr %el.ptr, align 4557 %bound_check = icmp slt i32 %el, 0558 br i1 %bound_check, label %bound_check_failed, label %guarded, !prof !{!"branch_weights", i32 1, i32 100}559 560guarded: ; preds = %loop561 %range_check = icmp ult i32 %el, %x562 br i1 %range_check, label %backedge, label %range_check_failed, !prof !{!"branch_weights", i32 100, i32 1}563 564backedge: ; preds = %guarded565 %arr.ptr = getelementptr i32, ptr %arr, i32 %el566 store i32 %iv, ptr %arr.ptr, align 4567 %iv.next = add i32 %iv, 1568 %loop_cond = icmp slt i32 %iv.next, %n569 br i1 %loop_cond, label %loop, label %exit570 571exit: ; preds = %backedge572 ret i32 0573 574bound_check_failed: ; preds = %loop575 ret i32 -1576 577range_check_failed: ; preds = %guarded578 ret i32 -2579}580 581define i32 @test_04(ptr noundef %p, i32 noundef %n, i32 noundef %limit, ptr noundef %arr, ptr noundef %x_p) {582; CHECK-LABEL: @test_04(583; CHECK-NEXT: entry:584; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[X_P:%.*]], align 4, !noundef [[META1]]585; CHECK-NEXT: [[INJECTED_COND:%.*]] = icmp ule i32 128, [[X]]586; CHECK-NEXT: br i1 [[INJECTED_COND]], label [[LOOP_US:%.*]], label [[LOOP:%.*]]587; CHECK: loop.us:588; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ [[IV_NEXT_US:%.*]], [[GUARDED_US:%.*]] ], [ 0, [[ENTRY:%.*]] ]589; CHECK-NEXT: [[EL_PTR_US:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 [[IV_US]]590; CHECK-NEXT: [[EL_US:%.*]] = load i8, ptr [[EL_PTR_US]], align 4591; CHECK-NEXT: [[BOUND_CHECK_US:%.*]] = icmp slt i8 [[EL_US]], 0592; CHECK-NEXT: br i1 [[BOUND_CHECK_US]], label [[COMMON_RET:%.*]], label [[GUARDED_US]], !prof [[PROF11]]593; CHECK: guarded.us:594; CHECK-NEXT: [[EL_WIDE_US:%.*]] = zext i8 [[EL_US]] to i32595; CHECK-NEXT: [[RANGE_CHECK_US:%.*]] = icmp ult i32 [[EL_WIDE_US]], [[X]]596; CHECK-NEXT: [[ARR_PTR_US:%.*]] = getelementptr i32, ptr [[ARR:%.*]], i32 [[EL_WIDE_US]]597; CHECK-NEXT: store i32 [[IV_US]], ptr [[ARR_PTR_US]], align 4598; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1599; CHECK-NEXT: [[LOOP_COND_US:%.*]] = icmp slt i32 [[IV_NEXT_US]], [[N:%.*]]600; CHECK-NEXT: br i1 [[LOOP_COND_US]], label [[LOOP_US]], label [[COMMON_RET]]601; CHECK: loop:602; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[ENTRY]] ]603; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i8, ptr [[P]], i32 [[IV]]604; CHECK-NEXT: [[EL:%.*]] = load i8, ptr [[EL_PTR]], align 4605; CHECK-NEXT: [[BOUND_CHECK:%.*]] = icmp slt i8 [[EL]], 0606; CHECK-NEXT: br i1 [[BOUND_CHECK]], label [[COMMON_RET]], label [[GUARDED:%.*]], !prof [[PROF11]]607; CHECK: guarded:608; CHECK-NEXT: [[EL_WIDE:%.*]] = zext i8 [[EL]] to i32609; CHECK-NEXT: [[RANGE_CHECK:%.*]] = icmp ult i32 [[EL_WIDE]], [[X]]610; CHECK-NEXT: br i1 [[RANGE_CHECK]], label [[BACKEDGE]], label [[COMMON_RET]], !prof [[PROF3]]611; CHECK: backedge:612; CHECK-NEXT: [[ARR_PTR:%.*]] = getelementptr i32, ptr [[ARR]], i32 [[EL_WIDE]]613; CHECK-NEXT: store i32 [[IV]], ptr [[ARR_PTR]], align 4614; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1615; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], [[N]]616; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[COMMON_RET]], !llvm.loop [[LOOP14:![0-9]+]]617; CHECK: common.ret:618; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 0, [[BACKEDGE]] ], [ 0, [[GUARDED_US]] ], [ -1, [[LOOP]] ], [ -1, [[LOOP_US]] ], [ -2, [[GUARDED]] ]619; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]620;621entry:622 %x = load i32, ptr %x_p, align 4, !noundef !{}623 br label %loop624 625loop: ; preds = %backedge, %entry626 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]627 %el.ptr = getelementptr i8, ptr %p, i32 %iv628 %el = load i8, ptr %el.ptr, align 4629 %bound_check = icmp slt i8 %el, 0630 br i1 %bound_check, label %bound_check_failed, label %guarded, !prof !{!"branch_weights", i32 1, i32 100}631 632guarded: ; preds = %loop633 %el.wide = zext i8 %el to i32634 %range_check = icmp ult i32 %el.wide, %x635 br i1 %range_check, label %backedge, label %range_check_failed, !prof !{!"branch_weights", i32 100, i32 1}636 637backedge: ; preds = %guarded638 %arr.ptr = getelementptr i32, ptr %arr, i32 %el.wide639 store i32 %iv, ptr %arr.ptr, align 4640 %iv.next = add i32 %iv, 1641 %loop_cond = icmp slt i32 %iv.next, %n642 br i1 %loop_cond, label %loop, label %exit643 644exit: ; preds = %backedge645 ret i32 0646 647bound_check_failed: ; preds = %loop648 ret i32 -1649 650range_check_failed: ; preds = %guarded651 ret i32 -2652}653;.654; CHECK: [[META0:![0-9]+]] = !{!"function_entry_count", i32 10}655; CHECK: [[META1]] = !{}656; CHECK: [[PROF2]] = !{!"unknown", !"simple-loop-unswitch"}657; CHECK: [[PROF3]] = !{!"branch_weights", i32 100, i32 1}658; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META5:![0-9]+]]}659; CHECK: [[META5]] = !{!"llvm.loop.unswitch.injection.disable"}660; CHECK: [[LOOP6]] = distinct !{[[LOOP6]], [[META5]]}661; CHECK: [[PROF7]] = !{!"branch_weights", i32 0, i32 0}662; CHECK: [[PROF8]] = !{!"branch_weights", i32 2, i32 3}663; CHECK: [[PROF9]] = !{!"branch_weights", i32 -1, i32 -1000}664; CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[META5]]}665; CHECK: [[PROF11]] = !{!"branch_weights", i32 1, i32 100}666; CHECK: [[LOOP12]] = distinct !{[[LOOP12]], [[META5]]}667; CHECK: [[LOOP13]] = distinct !{[[LOOP13]], [[META5]]}668; CHECK: [[LOOP14]] = distinct !{[[LOOP14]], [[META5]]}669;.670