brintos

brintos / llvm-project-archived public Read only

0
0
Text · 33.6 KiB · 3c84dea Raw
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