brintos

brintos / llvm-project-archived public Read only

0
0
Text · 112.0 KiB · b8f7c61 Raw
2207 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=loop-predication -loop-predication-predicate-widenable-branches-to-deopt=true < %s 2>&1 | FileCheck %s3; RUN: opt -S -passes='require<scalar-evolution>,loop-mssa(loop-predication)'  -verify-memoryssa -loop-predication-predicate-widenable-branches-to-deopt=true < %s 2>&1 | FileCheck %s4; RUN: opt -S -passes='require<scalar-evolution>,require<branch-prob>,loop-mssa(loop-predication)' -verify-memoryssa -loop-predication-predicate-widenable-branches-to-deopt=true < %s 2>&1 | FileCheck %s5 6declare void @llvm.experimental.guard(i1, ...)7 8define i32 @unsigned_loop_0_to_n_ult_check(ptr %array, i32 %length, i32 %n) {9; CHECK-LABEL: @unsigned_loop_0_to_n_ult_check(10; CHECK-NEXT:  entry:11; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 012; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]13; CHECK:       loop.preheader:14; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule i32 [[N]], [[LENGTH:%.*]]15; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH]]16; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]17; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]18; CHECK-NEXT:    br label [[LOOP:%.*]]19; CHECK:       loop:20; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]21; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]22; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]23; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()24; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]25; CHECK-NEXT:    br i1 [[TMP4]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0:![0-9]+]]26; CHECK:       deopt:27; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]28; CHECK-NEXT:    ret i32 [[DEOPTCALL]]29; CHECK:       guarded:30; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])31; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i6432; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]33; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 434; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]35; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 136; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]37; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1:![0-9]+]]38; CHECK:       exit.loopexit:39; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]40; CHECK-NEXT:    br label [[EXIT]]41; CHECK:       exit:42; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]43; CHECK-NEXT:    ret i32 [[RESULT]]44;45entry:46  %tmp5 = icmp eq i32 %n, 047  br i1 %tmp5, label %exit, label %loop.preheader48 49loop.preheader:                                   ; preds = %entry50  br label %loop51 52loop:                                             ; preds = %guarded, %loop.preheader53  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]54  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]55  %within.bounds = icmp ult i32 %i, %length56  %widenable_cond = call i1 @llvm.experimental.widenable.condition()57  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond58  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !059 60deopt:                                            ; preds = %loop61  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]62  ret i32 %deoptcall63 64guarded:                                          ; preds = %loop65  %i.i64 = zext i32 %i to i6466  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i6467  %array.i = load i32, ptr %array.i.ptr, align 468  %loop.acc.next = add i32 %loop.acc, %array.i69  %i.next = add nuw i32 %i, 170  %continue = icmp ult i32 %i.next, %n71  br i1 %continue, label %loop, label %exit, !prof !272 73exit:                                             ; preds = %guarded, %entry74  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]75  ret i32 %result76}77 78define i32 @unsigned_loop_0_to_n_ule_latch_ult_check(ptr %array, i32 %length, i32 %n) {79; CHECK-LABEL: @unsigned_loop_0_to_n_ule_latch_ult_check(80; CHECK-NEXT:  entry:81; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 082; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]83; CHECK:       loop.preheader:84; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult i32 [[N]], [[LENGTH:%.*]]85; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH]]86; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]87; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]88; CHECK-NEXT:    br label [[LOOP:%.*]]89; CHECK:       loop:90; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]91; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]92; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]93; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()94; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]95; CHECK-NEXT:    br i1 [[TMP4]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]96; CHECK:       deopt:97; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]98; CHECK-NEXT:    ret i32 [[DEOPTCALL]]99; CHECK:       guarded:100; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])101; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64102; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]103; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4104; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]105; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 1106; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ule i32 [[I_NEXT]], [[N]]107; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]108; CHECK:       exit.loopexit:109; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]110; CHECK-NEXT:    br label [[EXIT]]111; CHECK:       exit:112; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]113; CHECK-NEXT:    ret i32 [[RESULT]]114;115entry:116  %tmp5 = icmp eq i32 %n, 0117  br i1 %tmp5, label %exit, label %loop.preheader118 119loop.preheader:                                   ; preds = %entry120  br label %loop121 122loop:                                             ; preds = %guarded, %loop.preheader123  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]124  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]125  %within.bounds = icmp ult i32 %i, %length126  %widenable_cond = call i1 @llvm.experimental.widenable.condition()127  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond128  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0129 130deopt:                                            ; preds = %loop131  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]132  ret i32 %deoptcall133 134guarded:                                          ; preds = %loop135  %i.i64 = zext i32 %i to i64136  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64137  %array.i = load i32, ptr %array.i.ptr, align 4138  %loop.acc.next = add i32 %loop.acc, %array.i139  %i.next = add nuw i32 %i, 1140  %continue = icmp ule i32 %i.next, %n141  br i1 %continue, label %loop, label %exit, !prof !2142 143exit:                                             ; preds = %guarded, %entry144  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]145  ret i32 %result146}147 148define i32 @unsigned_loop_0_to_n_ugt_check(ptr %array, i32 %length, i32 %n) {149; CHECK-LABEL: @unsigned_loop_0_to_n_ugt_check(150; CHECK-NEXT:  entry:151; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 0152; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]153; CHECK:       loop.preheader:154; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule i32 [[N]], [[LENGTH:%.*]]155; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH]]156; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]157; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]158; CHECK-NEXT:    br label [[LOOP:%.*]]159; CHECK:       loop:160; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]161; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]162; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ugt i32 [[LENGTH]], [[I]]163; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()164; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]165; CHECK-NEXT:    br i1 [[TMP4]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]166; CHECK:       deopt:167; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]168; CHECK-NEXT:    ret i32 [[DEOPTCALL]]169; CHECK:       guarded:170; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])171; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64172; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]173; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4174; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]175; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 1176; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]177; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]178; CHECK:       exit.loopexit:179; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]180; CHECK-NEXT:    br label [[EXIT]]181; CHECK:       exit:182; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]183; CHECK-NEXT:    ret i32 [[RESULT]]184;185entry:186  %tmp5 = icmp eq i32 %n, 0187  br i1 %tmp5, label %exit, label %loop.preheader188 189loop.preheader:                                   ; preds = %entry190  br label %loop191 192loop:                                             ; preds = %guarded, %loop.preheader193  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]194  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]195  %within.bounds = icmp ugt i32 %length, %i196  %widenable_cond = call i1 @llvm.experimental.widenable.condition()197  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond198  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0199 200deopt:                                            ; preds = %loop201  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]202  ret i32 %deoptcall203 204guarded:                                          ; preds = %loop205  %i.i64 = zext i32 %i to i64206  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64207  %array.i = load i32, ptr %array.i.ptr, align 4208  %loop.acc.next = add i32 %loop.acc, %array.i209  %i.next = add nuw i32 %i, 1210  %continue = icmp ult i32 %i.next, %n211  br i1 %continue, label %loop, label %exit, !prof !2212 213exit:                                             ; preds = %guarded, %entry214  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]215  ret i32 %result216}217 218define i32 @signed_loop_0_to_n_ult_check(ptr %array, i32 %length, i32 %n) {219; CHECK-LABEL: @signed_loop_0_to_n_ult_check(220; CHECK-NEXT:  entry:221; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 0222; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]223; CHECK:       loop.preheader:224; CHECK-NEXT:    [[TMP0:%.*]] = icmp sle i32 [[N]], [[LENGTH:%.*]]225; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH]]226; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]227; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]228; CHECK-NEXT:    br label [[LOOP:%.*]]229; CHECK:       loop:230; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]231; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]232; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]233; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()234; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]235; CHECK-NEXT:    br i1 [[TMP4]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]236; CHECK:       deopt:237; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]238; CHECK-NEXT:    ret i32 [[DEOPTCALL]]239; CHECK:       guarded:240; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])241; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64242; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]243; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4244; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]245; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 1246; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp slt i32 [[I_NEXT]], [[N]]247; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]248; CHECK:       exit.loopexit:249; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]250; CHECK-NEXT:    br label [[EXIT]]251; CHECK:       exit:252; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]253; CHECK-NEXT:    ret i32 [[RESULT]]254;255 256entry:257  %tmp5 = icmp sle i32 %n, 0258  br i1 %tmp5, label %exit, label %loop.preheader259 260loop.preheader:                                   ; preds = %entry261  br label %loop262 263loop:                                             ; preds = %guarded, %loop.preheader264  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]265  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]266  %within.bounds = icmp ult i32 %i, %length267  %widenable_cond = call i1 @llvm.experimental.widenable.condition()268  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond269  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0270 271deopt:                                            ; preds = %loop272  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]273  ret i32 %deoptcall274 275guarded:                                          ; preds = %loop276  %i.i64 = zext i32 %i to i64277  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64278  %array.i = load i32, ptr %array.i.ptr, align 4279  %loop.acc.next = add i32 %loop.acc, %array.i280  %i.next = add nuw i32 %i, 1281  %continue = icmp slt i32 %i.next, %n282  br i1 %continue, label %loop, label %exit, !prof !2283 284exit:                                             ; preds = %guarded, %entry285  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]286  ret i32 %result287}288 289define i32 @signed_loop_0_to_n_ult_check_length_range_known(ptr %array, ptr %length.ptr, i32 %n) {290; CHECK-LABEL: @signed_loop_0_to_n_ult_check_length_range_known(291; CHECK-NEXT:  entry:292; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 0293; CHECK-NEXT:    [[LENGTH:%.*]] = load i32, ptr [[LENGTH_PTR:%.*]], align 4, !range [[RNG2:![0-9]+]]294; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]295; CHECK:       loop.preheader:296; CHECK-NEXT:    [[TMP0:%.*]] = icmp sle i32 [[N]], [[LENGTH]]297; CHECK-NEXT:    [[TMP1:%.*]] = and i1 true, [[TMP0]]298; CHECK-NEXT:    [[TMP2:%.*]] = freeze i1 [[TMP1]]299; CHECK-NEXT:    br label [[LOOP:%.*]]300; CHECK:       loop:301; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]302; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]303; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]304; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()305; CHECK-NEXT:    [[TMP3:%.*]] = and i1 [[TMP2]], [[WIDENABLE_COND]]306; CHECK-NEXT:    br i1 [[TMP3]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]307; CHECK:       deopt:308; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]309; CHECK-NEXT:    ret i32 [[DEOPTCALL]]310; CHECK:       guarded:311; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])312; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64313; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]314; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4315; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]316; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 1317; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp slt i32 [[I_NEXT]], [[N]]318; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]319; CHECK:       exit.loopexit:320; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]321; CHECK-NEXT:    br label [[EXIT]]322; CHECK:       exit:323; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]324; CHECK-NEXT:    ret i32 [[RESULT]]325;326entry:327  %tmp5 = icmp sle i32 %n, 0328  %length = load i32, ptr %length.ptr, !range !1329  br i1 %tmp5, label %exit, label %loop.preheader330 331loop.preheader:                                   ; preds = %entry332  br label %loop333 334loop:                                             ; preds = %guarded, %loop.preheader335  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]336  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]337  %within.bounds = icmp ult i32 %i, %length338  %widenable_cond = call i1 @llvm.experimental.widenable.condition()339  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond340  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0341 342deopt:                                            ; preds = %loop343  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]344  ret i32 %deoptcall345 346guarded:                                          ; preds = %loop347  %i.i64 = zext i32 %i to i64348  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64349  %array.i = load i32, ptr %array.i.ptr, align 4350  %loop.acc.next = add i32 %loop.acc, %array.i351  %i.next = add nuw i32 %i, 1352  %continue = icmp slt i32 %i.next, %n353  br i1 %continue, label %loop, label %exit, !prof !2354 355exit:                                             ; preds = %guarded, %entry356  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]357  ret i32 %result358}359 360define i32 @signed_loop_0_to_n_inverse_latch_predicate(ptr %array, i32 %length, i32 %n) {361; CHECK-LABEL: @signed_loop_0_to_n_inverse_latch_predicate(362; CHECK-NEXT:  entry:363; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 0364; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]365; CHECK:       loop.preheader:366; CHECK-NEXT:    [[TMP0:%.*]] = icmp slt i32 [[N]], [[LENGTH:%.*]]367; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH]]368; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]369; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]370; CHECK-NEXT:    br label [[LOOP:%.*]]371; CHECK:       loop:372; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]373; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]374; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]375; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()376; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]377; CHECK-NEXT:    br i1 [[TMP4]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]378; CHECK:       deopt:379; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]380; CHECK-NEXT:    ret i32 [[DEOPTCALL]]381; CHECK:       guarded:382; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])383; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64384; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]385; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4386; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]387; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 1388; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp sgt i32 [[I_NEXT]], [[N]]389; CHECK-NEXT:    br i1 [[CONTINUE]], label [[EXIT_LOOPEXIT:%.*]], label [[LOOP]], !prof [[PROF1]]390; CHECK:       exit.loopexit:391; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]392; CHECK-NEXT:    br label [[EXIT]]393; CHECK:       exit:394; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]395; CHECK-NEXT:    ret i32 [[RESULT]]396;397entry:398  %tmp5 = icmp sle i32 %n, 0399  br i1 %tmp5, label %exit, label %loop.preheader400 401loop.preheader:                                   ; preds = %entry402  br label %loop403 404loop:                                             ; preds = %guarded, %loop.preheader405  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]406  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]407  %within.bounds = icmp ult i32 %i, %length408  %widenable_cond = call i1 @llvm.experimental.widenable.condition()409  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond410  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0411 412deopt:                                            ; preds = %loop413  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]414  ret i32 %deoptcall415 416guarded:                                          ; preds = %loop417  %i.i64 = zext i32 %i to i64418  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64419  %array.i = load i32, ptr %array.i.ptr, align 4420  %loop.acc.next = add i32 %loop.acc, %array.i421  %i.next = add nuw i32 %i, 1422  %continue = icmp sgt i32 %i.next, %n423  br i1 %continue, label %exit, label %loop, !prof !2424 425exit:                                             ; preds = %guarded, %entry426  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]427  ret i32 %result428}429 430define i32 @signed_loop_0_to_n_sle_latch_ult_check(ptr %array, i32 %length, i32 %n) {431; CHECK-LABEL: @signed_loop_0_to_n_sle_latch_ult_check(432; CHECK-NEXT:  entry:433; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 0434; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]435; CHECK:       loop.preheader:436; CHECK-NEXT:    [[TMP0:%.*]] = icmp slt i32 [[N]], [[LENGTH:%.*]]437; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH]]438; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]439; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]440; CHECK-NEXT:    br label [[LOOP:%.*]]441; CHECK:       loop:442; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]443; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]444; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]445; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()446; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]447; CHECK-NEXT:    br i1 [[TMP4]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]448; CHECK:       deopt:449; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]450; CHECK-NEXT:    ret i32 [[DEOPTCALL]]451; CHECK:       guarded:452; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])453; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64454; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]455; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4456; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]457; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 1458; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp sle i32 [[I_NEXT]], [[N]]459; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]460; CHECK:       exit.loopexit:461; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]462; CHECK-NEXT:    br label [[EXIT]]463; CHECK:       exit:464; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]465; CHECK-NEXT:    ret i32 [[RESULT]]466;467entry:468  %tmp5 = icmp sle i32 %n, 0469  br i1 %tmp5, label %exit, label %loop.preheader470 471loop.preheader:                                   ; preds = %entry472  br label %loop473 474loop:                                             ; preds = %guarded, %loop.preheader475  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]476  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]477  %within.bounds = icmp ult i32 %i, %length478  %widenable_cond = call i1 @llvm.experimental.widenable.condition()479  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond480  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0481 482deopt:                                            ; preds = %loop483  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]484  ret i32 %deoptcall485 486guarded:                                          ; preds = %loop487  %i.i64 = zext i32 %i to i64488  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64489  %array.i = load i32, ptr %array.i.ptr, align 4490  %loop.acc.next = add i32 %loop.acc, %array.i491  %i.next = add nuw i32 %i, 1492  %continue = icmp sle i32 %i.next, %n493  br i1 %continue, label %loop, label %exit, !prof !2494 495exit:                                             ; preds = %guarded, %entry496  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]497  ret i32 %result498}499 500define i32 @signed_loop_0_to_n_preincrement_latch_check(ptr %array, i32 %length, i32 %n) {501; CHECK-LABEL: @signed_loop_0_to_n_preincrement_latch_check(502; CHECK-NEXT:  entry:503; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 0504; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]505; CHECK:       loop.preheader:506; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[LENGTH:%.*]], -1507; CHECK-NEXT:    [[TMP1:%.*]] = icmp sle i32 [[N]], [[TMP0]]508; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 0, [[LENGTH]]509; CHECK-NEXT:    [[TMP3:%.*]] = and i1 [[TMP2]], [[TMP1]]510; CHECK-NEXT:    [[TMP4:%.*]] = freeze i1 [[TMP3]]511; CHECK-NEXT:    br label [[LOOP:%.*]]512; CHECK:       loop:513; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]514; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]515; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]516; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()517; CHECK-NEXT:    [[TMP5:%.*]] = and i1 [[TMP4]], [[WIDENABLE_COND]]518; CHECK-NEXT:    br i1 [[TMP5]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]519; CHECK:       deopt:520; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]521; CHECK-NEXT:    ret i32 [[DEOPTCALL]]522; CHECK:       guarded:523; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])524; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64525; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]526; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4527; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]528; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 1529; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp slt i32 [[I]], [[N]]530; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]531; CHECK:       exit.loopexit:532; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]533; CHECK-NEXT:    br label [[EXIT]]534; CHECK:       exit:535; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]536; CHECK-NEXT:    ret i32 [[RESULT]]537;538entry:539  %tmp5 = icmp sle i32 %n, 0540  br i1 %tmp5, label %exit, label %loop.preheader541 542loop.preheader:                                   ; preds = %entry543  br label %loop544 545loop:                                             ; preds = %guarded, %loop.preheader546  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]547  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]548  %within.bounds = icmp ult i32 %i, %length549  %widenable_cond = call i1 @llvm.experimental.widenable.condition()550  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond551  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0552 553deopt:                                            ; preds = %loop554  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]555  ret i32 %deoptcall556 557guarded:                                          ; preds = %loop558  %i.i64 = zext i32 %i to i64559  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64560  %array.i = load i32, ptr %array.i.ptr, align 4561  %loop.acc.next = add i32 %loop.acc, %array.i562  %i.next = add i32 %i, 1563  %continue = icmp slt i32 %i, %n564  br i1 %continue, label %loop, label %exit, !prof !2565 566exit:                                             ; preds = %guarded, %entry567  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]568  ret i32 %result569}570 571define i32 @signed_loop_0_to_n_preincrement_latch_check_postincrement_guard_check(ptr %array, i32 %length, i32 %n) {572; CHECK-LABEL: @signed_loop_0_to_n_preincrement_latch_check_postincrement_guard_check(573; CHECK-NEXT:  entry:574; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 0575; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]576; CHECK:       loop.preheader:577; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[LENGTH:%.*]], -2578; CHECK-NEXT:    [[TMP1:%.*]] = icmp sle i32 [[N]], [[TMP0]]579; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 1, [[LENGTH]]580; CHECK-NEXT:    [[TMP3:%.*]] = and i1 [[TMP2]], [[TMP1]]581; CHECK-NEXT:    [[TMP4:%.*]] = freeze i1 [[TMP3]]582; CHECK-NEXT:    br label [[LOOP:%.*]]583; CHECK:       loop:584; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]585; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]586; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 1587; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I_NEXT]], [[LENGTH]]588; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()589; CHECK-NEXT:    [[TMP5:%.*]] = and i1 [[TMP4]], [[WIDENABLE_COND]]590; CHECK-NEXT:    br i1 [[TMP5]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]591; CHECK:       deopt:592; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]593; CHECK-NEXT:    ret i32 [[DEOPTCALL]]594; CHECK:       guarded:595; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])596; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64597; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]598; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4599; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]600; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp slt i32 [[I]], [[N]]601; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]602; CHECK:       exit.loopexit:603; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]604; CHECK-NEXT:    br label [[EXIT]]605; CHECK:       exit:606; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]607; CHECK-NEXT:    ret i32 [[RESULT]]608;609entry:610  %tmp5 = icmp sle i32 %n, 0611  br i1 %tmp5, label %exit, label %loop.preheader612 613loop.preheader:                                   ; preds = %entry614  br label %loop615 616loop:                                             ; preds = %guarded, %loop.preheader617  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]618  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]619  %i.next = add i32 %i, 1620  %within.bounds = icmp ult i32 %i.next, %length621  %widenable_cond = call i1 @llvm.experimental.widenable.condition()622  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond623  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0624 625deopt:                                            ; preds = %loop626  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]627  ret i32 %deoptcall628 629guarded:                                          ; preds = %loop630  %i.i64 = zext i32 %i to i64631  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64632  %array.i = load i32, ptr %array.i.ptr, align 4633  %loop.acc.next = add i32 %loop.acc, %array.i634  %continue = icmp slt i32 %i, %n635  br i1 %continue, label %loop, label %exit, !prof !2636 637exit:                                             ; preds = %guarded, %entry638  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]639  ret i32 %result640}641 642define i32 @signed_loop_0_to_n_sle_latch_offset_ult_check(ptr %array, i32 %length, i32 %n) {643; CHECK-LABEL: @signed_loop_0_to_n_sle_latch_offset_ult_check(644; CHECK-NEXT:  entry:645; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 0646; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]647; CHECK:       loop.preheader:648; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[LENGTH:%.*]], -1649; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[N]], [[TMP0]]650; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 1, [[LENGTH]]651; CHECK-NEXT:    [[TMP3:%.*]] = and i1 [[TMP2]], [[TMP1]]652; CHECK-NEXT:    [[TMP4:%.*]] = freeze i1 [[TMP3]]653; CHECK-NEXT:    br label [[LOOP:%.*]]654; CHECK:       loop:655; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]656; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]657; CHECK-NEXT:    [[I_OFFSET:%.*]] = add i32 [[I]], 1658; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I_OFFSET]], [[LENGTH]]659; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()660; CHECK-NEXT:    [[TMP5:%.*]] = and i1 [[TMP4]], [[WIDENABLE_COND]]661; CHECK-NEXT:    br i1 [[TMP5]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]662; CHECK:       deopt:663; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]664; CHECK-NEXT:    ret i32 [[DEOPTCALL]]665; CHECK:       guarded:666; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])667; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64668; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]669; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4670; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]671; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 1672; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp sle i32 [[I_NEXT]], [[N]]673; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]674; CHECK:       exit.loopexit:675; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]676; CHECK-NEXT:    br label [[EXIT]]677; CHECK:       exit:678; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]679; CHECK-NEXT:    ret i32 [[RESULT]]680;681entry:682  %tmp5 = icmp sle i32 %n, 0683  br i1 %tmp5, label %exit, label %loop.preheader684 685loop.preheader:                                   ; preds = %entry686  br label %loop687 688loop:                                             ; preds = %guarded, %loop.preheader689  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]690  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]691  %i.offset = add i32 %i, 1692  %within.bounds = icmp ult i32 %i.offset, %length693  %widenable_cond = call i1 @llvm.experimental.widenable.condition()694  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond695  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0696 697deopt:                                            ; preds = %loop698  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]699  ret i32 %deoptcall700 701guarded:                                          ; preds = %loop702  %i.i64 = zext i32 %i to i64703  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64704  %array.i = load i32, ptr %array.i.ptr, align 4705  %loop.acc.next = add i32 %loop.acc, %array.i706  %i.next = add i32 %i, 1707  %continue = icmp sle i32 %i.next, %n708  br i1 %continue, label %loop, label %exit, !prof !2709 710exit:                                             ; preds = %guarded, %entry711  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]712  ret i32 %result713}714 715define i32 @signed_loop_0_to_n_offset_sle_latch_offset_ult_check(ptr %array, i32 %length, i32 %n) {716; CHECK-LABEL: @signed_loop_0_to_n_offset_sle_latch_offset_ult_check(717; CHECK-NEXT:  entry:718; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 0719; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]720; CHECK:       loop.preheader:721; CHECK-NEXT:    [[TMP0:%.*]] = icmp slt i32 [[N]], [[LENGTH:%.*]]722; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 1, [[LENGTH]]723; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]724; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]725; CHECK-NEXT:    br label [[LOOP:%.*]]726; CHECK:       loop:727; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]728; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]729; CHECK-NEXT:    [[I_OFFSET:%.*]] = add i32 [[I]], 1730; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I_OFFSET]], [[LENGTH]]731; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()732; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]733; CHECK-NEXT:    br i1 [[TMP4]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]734; CHECK:       deopt:735; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]736; CHECK-NEXT:    ret i32 [[DEOPTCALL]]737; CHECK:       guarded:738; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])739; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64740; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]741; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4742; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]743; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 1744; CHECK-NEXT:    [[I_NEXT_OFFSET:%.*]] = add i32 [[I_NEXT]], 1745; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp sle i32 [[I_NEXT_OFFSET]], [[N]]746; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]747; CHECK:       exit.loopexit:748; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]749; CHECK-NEXT:    br label [[EXIT]]750; CHECK:       exit:751; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]752; CHECK-NEXT:    ret i32 [[RESULT]]753;754entry:755  %tmp5 = icmp sle i32 %n, 0756  br i1 %tmp5, label %exit, label %loop.preheader757 758loop.preheader:                                   ; preds = %entry759  br label %loop760 761loop:                                             ; preds = %guarded, %loop.preheader762  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]763  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]764  %i.offset = add i32 %i, 1765  %within.bounds = icmp ult i32 %i.offset, %length766  %widenable_cond = call i1 @llvm.experimental.widenable.condition()767  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond768  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0769 770deopt:                                            ; preds = %loop771  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]772  ret i32 %deoptcall773 774guarded:                                          ; preds = %loop775  %i.i64 = zext i32 %i to i64776  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64777  %array.i = load i32, ptr %array.i.ptr, align 4778  %loop.acc.next = add i32 %loop.acc, %array.i779  %i.next = add i32 %i, 1780  %i.next.offset = add i32 %i.next, 1781  %continue = icmp sle i32 %i.next.offset, %n782  br i1 %continue, label %loop, label %exit, !prof !2783 784exit:                                             ; preds = %guarded, %entry785  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]786  ret i32 %result787}788 789define i32 @unsupported_latch_pred_loop_0_to_n(ptr %array, i32 %length, i32 %n) {790; CHECK-LABEL: @unsupported_latch_pred_loop_0_to_n(791; CHECK-NEXT:  entry:792; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 0793; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]794; CHECK:       loop.preheader:795; CHECK-NEXT:    br label [[LOOP:%.*]]796; CHECK:       loop:797; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]798; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]799; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH:%.*]]800; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()801; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WITHIN_BOUNDS]], [[WIDENABLE_COND]]802; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]803; CHECK:       deopt:804; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]805; CHECK-NEXT:    ret i32 [[DEOPTCALL]]806; CHECK:       guarded:807; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64808; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]809; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4810; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]811; CHECK-NEXT:    [[I_NEXT]] = add nsw i32 [[I]], 1812; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ne i32 [[I_NEXT]], [[N]]813; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]814; CHECK:       exit.loopexit:815; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]816; CHECK-NEXT:    br label [[EXIT]]817; CHECK:       exit:818; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]819; CHECK-NEXT:    ret i32 [[RESULT]]820;821entry:822  %tmp5 = icmp sle i32 %n, 0823  br i1 %tmp5, label %exit, label %loop.preheader824 825loop.preheader:                                   ; preds = %entry826  br label %loop827 828loop:                                             ; preds = %guarded, %loop.preheader829  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]830  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]831  %within.bounds = icmp ult i32 %i, %length832  %widenable_cond = call i1 @llvm.experimental.widenable.condition()833  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond834  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0835 836deopt:                                            ; preds = %loop837  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]838  ret i32 %deoptcall839 840guarded:                                          ; preds = %loop841  %i.i64 = zext i32 %i to i64842  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64843  %array.i = load i32, ptr %array.i.ptr, align 4844  %loop.acc.next = add i32 %loop.acc, %array.i845  %i.next = add nsw i32 %i, 1846  %continue = icmp ne i32 %i.next, %n847  br i1 %continue, label %loop, label %exit, !prof !2848 849exit:                                             ; preds = %guarded, %entry850  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]851  ret i32 %result852}853 854define i32 @signed_loop_0_to_n_unsupported_iv_step(ptr %array, i32 %length, i32 %n) {855; CHECK-LABEL: @signed_loop_0_to_n_unsupported_iv_step(856; CHECK-NEXT:  entry:857; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 0858; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]859; CHECK:       loop.preheader:860; CHECK-NEXT:    br label [[LOOP:%.*]]861; CHECK:       loop:862; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]863; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]864; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH:%.*]]865; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()866; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WITHIN_BOUNDS]], [[WIDENABLE_COND]]867; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]868; CHECK:       deopt:869; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]870; CHECK-NEXT:    ret i32 [[DEOPTCALL]]871; CHECK:       guarded:872; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64873; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]874; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4875; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]876; CHECK-NEXT:    [[I_NEXT]] = add nsw i32 [[I]], 2877; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp slt i32 [[I_NEXT]], [[N]]878; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]879; CHECK:       exit.loopexit:880; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]881; CHECK-NEXT:    br label [[EXIT]]882; CHECK:       exit:883; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]884; CHECK-NEXT:    ret i32 [[RESULT]]885;886entry:887  %tmp5 = icmp sle i32 %n, 0888  br i1 %tmp5, label %exit, label %loop.preheader889 890loop.preheader:                                   ; preds = %entry891  br label %loop892 893loop:                                             ; preds = %guarded, %loop.preheader894  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]895  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]896  %within.bounds = icmp ult i32 %i, %length897  %widenable_cond = call i1 @llvm.experimental.widenable.condition()898  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond899  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0900 901deopt:                                            ; preds = %loop902  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]903  ret i32 %deoptcall904 905guarded:                                          ; preds = %loop906  %i.i64 = zext i32 %i to i64907  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64908  %array.i = load i32, ptr %array.i.ptr, align 4909  %loop.acc.next = add i32 %loop.acc, %array.i910  %i.next = add nsw i32 %i, 2911  %continue = icmp slt i32 %i.next, %n912  br i1 %continue, label %loop, label %exit, !prof !2913 914exit:                                             ; preds = %guarded, %entry915  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]916  ret i32 %result917}918 919define i32 @signed_loop_0_to_n_equal_iv_range_check(ptr %array, i32 %length, i32 %n) {920; CHECK-LABEL: @signed_loop_0_to_n_equal_iv_range_check(921; CHECK-NEXT:  entry:922; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 0923; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]924; CHECK:       loop.preheader:925; CHECK-NEXT:    [[TMP0:%.*]] = icmp sle i32 [[N]], [[LENGTH:%.*]]926; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH]]927; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]928; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]929; CHECK-NEXT:    br label [[LOOP:%.*]]930; CHECK:       loop:931; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]932; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]933; CHECK-NEXT:    [[J:%.*]] = phi i32 [ [[J_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]934; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[J]], [[LENGTH]]935; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()936; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]937; CHECK-NEXT:    br i1 [[TMP4]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]938; CHECK:       deopt:939; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]940; CHECK-NEXT:    ret i32 [[DEOPTCALL]]941; CHECK:       guarded:942; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])943; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i64944; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]945; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4946; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]947; CHECK-NEXT:    [[J_NEXT]] = add nsw i32 [[J]], 1948; CHECK-NEXT:    [[I_NEXT]] = add nsw i32 [[I]], 1949; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp slt i32 [[I_NEXT]], [[N]]950; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]951; CHECK:       exit.loopexit:952; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]953; CHECK-NEXT:    br label [[EXIT]]954; CHECK:       exit:955; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]956; CHECK-NEXT:    ret i32 [[RESULT]]957;958entry:959  %tmp5 = icmp sle i32 %n, 0960  br i1 %tmp5, label %exit, label %loop.preheader961 962loop.preheader:                                   ; preds = %entry963  br label %loop964 965loop:                                             ; preds = %guarded, %loop.preheader966  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]967  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]968  %j = phi i32 [ %j.next, %guarded ], [ 0, %loop.preheader ]969  %within.bounds = icmp ult i32 %j, %length970  %widenable_cond = call i1 @llvm.experimental.widenable.condition()971  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond972  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0973 974deopt:                                            ; preds = %loop975  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]976  ret i32 %deoptcall977 978guarded:                                          ; preds = %loop979  %i.i64 = zext i32 %i to i64980  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64981  %array.i = load i32, ptr %array.i.ptr, align 4982  %loop.acc.next = add i32 %loop.acc, %array.i983  %j.next = add nsw i32 %j, 1984  %i.next = add nsw i32 %i, 1985  %continue = icmp slt i32 %i.next, %n986  br i1 %continue, label %loop, label %exit, !prof !2987 988exit:                                             ; preds = %guarded, %entry989  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]990  ret i32 %result991}992 993define i32 @signed_loop_start_to_n_offset_iv_range_check(ptr %array, i32 %start.i, i32 %start.j, i32 %length, i32 %n) {994; CHECK-LABEL: @signed_loop_start_to_n_offset_iv_range_check(995; CHECK-NEXT:  entry:996; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 0997; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]998; CHECK:       loop.preheader:999; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[LENGTH:%.*]], [[START_I:%.*]]1000; CHECK-NEXT:    [[TMP1:%.*]] = sub i32 [[TMP0]], [[START_J:%.*]]1001; CHECK-NEXT:    [[TMP2:%.*]] = icmp sle i32 [[N]], [[TMP1]]1002; CHECK-NEXT:    [[TMP3:%.*]] = icmp ult i32 [[START_J]], [[LENGTH]]1003; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[TMP2]]1004; CHECK-NEXT:    [[TMP5:%.*]] = freeze i1 [[TMP4]]1005; CHECK-NEXT:    br label [[LOOP:%.*]]1006; CHECK:       loop:1007; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1008; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ [[START_I]], [[LOOP_PREHEADER]] ]1009; CHECK-NEXT:    [[J:%.*]] = phi i32 [ [[J_NEXT:%.*]], [[GUARDED]] ], [ [[START_J]], [[LOOP_PREHEADER]] ]1010; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[J]], [[LENGTH]]1011; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()1012; CHECK-NEXT:    [[TMP6:%.*]] = and i1 [[TMP5]], [[WIDENABLE_COND]]1013; CHECK-NEXT:    br i1 [[TMP6]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]1014; CHECK:       deopt:1015; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1016; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1017; CHECK:       guarded:1018; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])1019; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641020; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]1021; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 41022; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]1023; CHECK-NEXT:    [[J_NEXT]] = add i32 [[J]], 11024; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 11025; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp slt i32 [[I_NEXT]], [[N]]1026; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1027; CHECK:       exit.loopexit:1028; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]1029; CHECK-NEXT:    br label [[EXIT]]1030; CHECK:       exit:1031; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]1032; CHECK-NEXT:    ret i32 [[RESULT]]1033;1034entry:1035  %tmp5 = icmp sle i32 %n, 01036  br i1 %tmp5, label %exit, label %loop.preheader1037 1038loop.preheader:                                   ; preds = %entry1039  br label %loop1040 1041loop:                                             ; preds = %guarded, %loop.preheader1042  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]1043  %i = phi i32 [ %i.next, %guarded ], [ %start.i, %loop.preheader ]1044  %j = phi i32 [ %j.next, %guarded ], [ %start.j, %loop.preheader ]1045  %within.bounds = icmp ult i32 %j, %length1046  %widenable_cond = call i1 @llvm.experimental.widenable.condition()1047  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond1048  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !01049 1050deopt:                                            ; preds = %loop1051  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1052  ret i32 %deoptcall1053 1054guarded:                                          ; preds = %loop1055  %i.i64 = zext i32 %i to i641056  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i641057  %array.i = load i32, ptr %array.i.ptr, align 41058  %loop.acc.next = add i32 %loop.acc, %array.i1059  %j.next = add i32 %j, 11060  %i.next = add i32 %i, 11061  %continue = icmp slt i32 %i.next, %n1062  br i1 %continue, label %loop, label %exit, !prof !21063 1064exit:                                             ; preds = %guarded, %entry1065  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]1066  ret i32 %result1067}1068 1069define i32 @signed_loop_0_to_n_different_iv_types(ptr %array, i16 %length, i32 %n) {1070; CHECK-LABEL: @signed_loop_0_to_n_different_iv_types(1071; CHECK-NEXT:  entry:1072; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 01073; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]1074; CHECK:       loop.preheader:1075; CHECK-NEXT:    br label [[LOOP:%.*]]1076; CHECK:       loop:1077; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1078; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]1079; CHECK-NEXT:    [[J:%.*]] = phi i16 [ [[J_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]1080; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i16 [[J]], [[LENGTH:%.*]]1081; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()1082; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WITHIN_BOUNDS]], [[WIDENABLE_COND]]1083; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]1084; CHECK:       deopt:1085; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1086; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1087; CHECK:       guarded:1088; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641089; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]1090; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 41091; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]1092; CHECK-NEXT:    [[J_NEXT]] = add i16 [[J]], 11093; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 11094; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp slt i32 [[I_NEXT]], [[N]]1095; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1096; CHECK:       exit.loopexit:1097; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]1098; CHECK-NEXT:    br label [[EXIT]]1099; CHECK:       exit:1100; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]1101; CHECK-NEXT:    ret i32 [[RESULT]]1102;1103entry:1104  %tmp5 = icmp sle i32 %n, 01105  br i1 %tmp5, label %exit, label %loop.preheader1106 1107loop.preheader:                                   ; preds = %entry1108  br label %loop1109 1110loop:                                             ; preds = %guarded, %loop.preheader1111  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]1112  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]1113  %j = phi i16 [ %j.next, %guarded ], [ 0, %loop.preheader ]1114  %within.bounds = icmp ult i16 %j, %length1115  %widenable_cond = call i1 @llvm.experimental.widenable.condition()1116  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond1117  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !01118 1119deopt:                                            ; preds = %loop1120  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1121  ret i32 %deoptcall1122 1123guarded:                                          ; preds = %loop1124  %i.i64 = zext i32 %i to i641125  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i641126  %array.i = load i32, ptr %array.i.ptr, align 41127  %loop.acc.next = add i32 %loop.acc, %array.i1128  %j.next = add i16 %j, 11129  %i.next = add i32 %i, 11130  %continue = icmp slt i32 %i.next, %n1131  br i1 %continue, label %loop, label %exit, !prof !21132 1133exit:                                             ; preds = %guarded, %entry1134  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]1135  ret i32 %result1136}1137 1138define i32 @signed_loop_0_to_n_different_iv_strides(ptr %array, i32 %length, i32 %n) {1139; CHECK-LABEL: @signed_loop_0_to_n_different_iv_strides(1140; CHECK-NEXT:  entry:1141; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 01142; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]1143; CHECK:       loop.preheader:1144; CHECK-NEXT:    br label [[LOOP:%.*]]1145; CHECK:       loop:1146; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1147; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]1148; CHECK-NEXT:    [[J:%.*]] = phi i32 [ [[J_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]1149; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[J]], [[LENGTH:%.*]]1150; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()1151; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WITHIN_BOUNDS]], [[WIDENABLE_COND]]1152; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]1153; CHECK:       deopt:1154; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1155; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1156; CHECK:       guarded:1157; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641158; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]1159; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 41160; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]1161; CHECK-NEXT:    [[J_NEXT]] = add nsw i32 [[J]], 21162; CHECK-NEXT:    [[I_NEXT]] = add nsw i32 [[I]], 11163; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp slt i32 [[I_NEXT]], [[N]]1164; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1165; CHECK:       exit.loopexit:1166; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]1167; CHECK-NEXT:    br label [[EXIT]]1168; CHECK:       exit:1169; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]1170; CHECK-NEXT:    ret i32 [[RESULT]]1171;1172entry:1173  %tmp5 = icmp sle i32 %n, 01174  br i1 %tmp5, label %exit, label %loop.preheader1175 1176loop.preheader:                                   ; preds = %entry1177  br label %loop1178 1179loop:                                             ; preds = %guarded, %loop.preheader1180  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]1181  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]1182  %j = phi i32 [ %j.next, %guarded ], [ 0, %loop.preheader ]1183  %within.bounds = icmp ult i32 %j, %length1184  %widenable_cond = call i1 @llvm.experimental.widenable.condition()1185  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond1186  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !01187 1188deopt:                                            ; preds = %loop1189  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1190  ret i32 %deoptcall1191 1192guarded:                                          ; preds = %loop1193  %i.i64 = zext i32 %i to i641194  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i641195  %array.i = load i32, ptr %array.i.ptr, align 41196  %loop.acc.next = add i32 %loop.acc, %array.i1197  %j.next = add nsw i32 %j, 21198  %i.next = add nsw i32 %i, 11199  %continue = icmp slt i32 %i.next, %n1200  br i1 %continue, label %loop, label %exit, !prof !21201 1202exit:                                             ; preds = %guarded, %entry1203  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]1204  ret i32 %result1205}1206 1207define i32 @two_range_checks(ptr %array.1, i32 %length.1, ptr %array.2, i32 %length.2, i32 %n) {1208; CHECK-LABEL: @two_range_checks(1209; CHECK-NEXT:  entry:1210; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 01211; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]1212; CHECK:       loop.preheader:1213; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule i32 [[N]], [[LENGTH_2:%.*]]1214; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH_2]]1215; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]1216; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]1217; CHECK-NEXT:    [[TMP4:%.*]] = icmp ule i32 [[N]], [[LENGTH_1:%.*]]1218; CHECK-NEXT:    [[TMP5:%.*]] = icmp ult i32 0, [[LENGTH_1]]1219; CHECK-NEXT:    [[TMP6:%.*]] = and i1 [[TMP5]], [[TMP4]]1220; CHECK-NEXT:    [[TMP7:%.*]] = freeze i1 [[TMP6]]1221; CHECK-NEXT:    br label [[LOOP:%.*]]1222; CHECK:       loop:1223; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1224; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]1225; CHECK-NEXT:    [[WITHIN_BOUNDS_1:%.*]] = icmp ult i32 [[I]], [[LENGTH_1]]1226; CHECK-NEXT:    [[WITHIN_BOUNDS_2:%.*]] = icmp ult i32 [[I]], [[LENGTH_2]]1227; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()1228; CHECK-NEXT:    [[TMP8:%.*]] = and i1 [[TMP3]], [[TMP7]]1229; CHECK-NEXT:    [[TMP9:%.*]] = and i1 [[TMP8]], [[WIDENABLE_COND]]1230; CHECK-NEXT:    br i1 [[TMP9]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]1231; CHECK:       deopt:1232; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1233; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1234; CHECK:       guarded:1235; CHECK-NEXT:    [[TMP10:%.*]] = and i1 [[WITHIN_BOUNDS_2]], [[WITHIN_BOUNDS_1]]1236; CHECK-NEXT:    call void @llvm.assume(i1 [[TMP10]])1237; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641238; CHECK-NEXT:    [[ARRAY_1_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY_1:%.*]], i64 [[I_I64]]1239; CHECK-NEXT:    [[ARRAY_1_I:%.*]] = load i32, ptr [[ARRAY_1_I_PTR]], align 41240; CHECK-NEXT:    [[LOOP_ACC_1:%.*]] = add i32 [[LOOP_ACC]], [[ARRAY_1_I]]1241; CHECK-NEXT:    [[ARRAY_2_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY_2:%.*]], i64 [[I_I64]]1242; CHECK-NEXT:    [[ARRAY_2_I:%.*]] = load i32, ptr [[ARRAY_2_I_PTR]], align 41243; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC_1]], [[ARRAY_2_I]]1244; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 11245; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]1246; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1247; CHECK:       exit.loopexit:1248; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]1249; CHECK-NEXT:    br label [[EXIT]]1250; CHECK:       exit:1251; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]1252; CHECK-NEXT:    ret i32 [[RESULT]]1253;1254entry:1255  %tmp5 = icmp eq i32 %n, 01256  br i1 %tmp5, label %exit, label %loop.preheader1257 1258loop.preheader:                                   ; preds = %entry1259  br label %loop1260 1261loop:                                             ; preds = %guarded, %loop.preheader1262  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]1263  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]1264  %within.bounds.1 = icmp ult i32 %i, %length.11265  %within.bounds.2 = icmp ult i32 %i, %length.21266  %within.bounds = and i1 %within.bounds.1, %within.bounds.21267  %widenable_cond = call i1 @llvm.experimental.widenable.condition()1268  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond1269  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !01270 1271deopt:                                            ; preds = %loop1272  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1273  ret i32 %deoptcall1274 1275guarded:                                          ; preds = %loop1276  %i.i64 = zext i32 %i to i641277  %array.1.i.ptr = getelementptr inbounds i32, ptr %array.1, i64 %i.i641278  %array.1.i = load i32, ptr %array.1.i.ptr, align 41279  %loop.acc.1 = add i32 %loop.acc, %array.1.i1280  %array.2.i.ptr = getelementptr inbounds i32, ptr %array.2, i64 %i.i641281  %array.2.i = load i32, ptr %array.2.i.ptr, align 41282  %loop.acc.next = add i32 %loop.acc.1, %array.2.i1283  %i.next = add nuw i32 %i, 11284  %continue = icmp ult i32 %i.next, %n1285  br i1 %continue, label %loop, label %exit, !prof !21286 1287exit:                                             ; preds = %guarded, %entry1288  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]1289  ret i32 %result1290}1291 1292define i32 @three_range_checks(ptr %array.1, i32 %length.1, ptr %array.2, i32 %length.2, ptr %array.3, i32 %length.3, i32 %n) {1293; CHECK-LABEL: @three_range_checks(1294; CHECK-NEXT:  entry:1295; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 01296; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]1297; CHECK:       loop.preheader:1298; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule i32 [[N]], [[LENGTH_3:%.*]]1299; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH_3]]1300; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]1301; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]1302; CHECK-NEXT:    [[TMP4:%.*]] = icmp ule i32 [[N]], [[LENGTH_2:%.*]]1303; CHECK-NEXT:    [[TMP5:%.*]] = icmp ult i32 0, [[LENGTH_2]]1304; CHECK-NEXT:    [[TMP6:%.*]] = and i1 [[TMP5]], [[TMP4]]1305; CHECK-NEXT:    [[TMP7:%.*]] = freeze i1 [[TMP6]]1306; CHECK-NEXT:    [[TMP8:%.*]] = icmp ule i32 [[N]], [[LENGTH_1:%.*]]1307; CHECK-NEXT:    [[TMP9:%.*]] = icmp ult i32 0, [[LENGTH_1]]1308; CHECK-NEXT:    [[TMP10:%.*]] = and i1 [[TMP9]], [[TMP8]]1309; CHECK-NEXT:    [[TMP11:%.*]] = freeze i1 [[TMP10]]1310; CHECK-NEXT:    br label [[LOOP:%.*]]1311; CHECK:       loop:1312; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1313; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]1314; CHECK-NEXT:    [[WITHIN_BOUNDS_1:%.*]] = icmp ult i32 [[I]], [[LENGTH_1]]1315; CHECK-NEXT:    [[WITHIN_BOUNDS_2:%.*]] = icmp ult i32 [[I]], [[LENGTH_2]]1316; CHECK-NEXT:    [[WITHIN_BOUNDS_3:%.*]] = icmp ult i32 [[I]], [[LENGTH_3]]1317; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()1318; CHECK-NEXT:    [[TMP12:%.*]] = and i1 [[TMP3]], [[TMP7]]1319; CHECK-NEXT:    [[TMP13:%.*]] = and i1 [[TMP12]], [[TMP11]]1320; CHECK-NEXT:    [[TMP14:%.*]] = and i1 [[TMP13]], [[WIDENABLE_COND]]1321; CHECK-NEXT:    br i1 [[TMP14]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]1322; CHECK:       deopt:1323; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1324; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1325; CHECK:       guarded:1326; CHECK-NEXT:    [[TMP15:%.*]] = and i1 [[WITHIN_BOUNDS_3]], [[WITHIN_BOUNDS_2]]1327; CHECK-NEXT:    [[TMP16:%.*]] = and i1 [[TMP15]], [[WITHIN_BOUNDS_1]]1328; CHECK-NEXT:    call void @llvm.assume(i1 [[TMP16]])1329; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641330; CHECK-NEXT:    [[ARRAY_1_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY_1:%.*]], i64 [[I_I64]]1331; CHECK-NEXT:    [[ARRAY_1_I:%.*]] = load i32, ptr [[ARRAY_1_I_PTR]], align 41332; CHECK-NEXT:    [[LOOP_ACC_1:%.*]] = add i32 [[LOOP_ACC]], [[ARRAY_1_I]]1333; CHECK-NEXT:    [[ARRAY_2_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY_2:%.*]], i64 [[I_I64]]1334; CHECK-NEXT:    [[ARRAY_2_I:%.*]] = load i32, ptr [[ARRAY_2_I_PTR]], align 41335; CHECK-NEXT:    [[LOOP_ACC_2:%.*]] = add i32 [[LOOP_ACC_1]], [[ARRAY_2_I]]1336; CHECK-NEXT:    [[ARRAY_3_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY_3:%.*]], i64 [[I_I64]]1337; CHECK-NEXT:    [[ARRAY_3_I:%.*]] = load i32, ptr [[ARRAY_3_I_PTR]], align 41338; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC_2]], [[ARRAY_3_I]]1339; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 11340; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]1341; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1342; CHECK:       exit.loopexit:1343; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]1344; CHECK-NEXT:    br label [[EXIT]]1345; CHECK:       exit:1346; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]1347; CHECK-NEXT:    ret i32 [[RESULT]]1348;1349entry:1350  %tmp5 = icmp eq i32 %n, 01351  br i1 %tmp5, label %exit, label %loop.preheader1352 1353loop.preheader:                                   ; preds = %entry1354  br label %loop1355 1356loop:                                             ; preds = %guarded, %loop.preheader1357  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]1358  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]1359  %within.bounds.1 = icmp ult i32 %i, %length.11360  %within.bounds.2 = icmp ult i32 %i, %length.21361  %within.bounds.3 = icmp ult i32 %i, %length.31362  %within.bounds.1.and.2 = and i1 %within.bounds.1, %within.bounds.21363  %within.bounds = and i1 %within.bounds.1.and.2, %within.bounds.31364  %widenable_cond = call i1 @llvm.experimental.widenable.condition()1365  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond1366  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !01367 1368deopt:                                            ; preds = %loop1369  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1370  ret i32 %deoptcall1371 1372guarded:                                          ; preds = %loop1373  %i.i64 = zext i32 %i to i641374  %array.1.i.ptr = getelementptr inbounds i32, ptr %array.1, i64 %i.i641375  %array.1.i = load i32, ptr %array.1.i.ptr, align 41376  %loop.acc.1 = add i32 %loop.acc, %array.1.i1377  %array.2.i.ptr = getelementptr inbounds i32, ptr %array.2, i64 %i.i641378  %array.2.i = load i32, ptr %array.2.i.ptr, align 41379  %loop.acc.2 = add i32 %loop.acc.1, %array.2.i1380  %array.3.i.ptr = getelementptr inbounds i32, ptr %array.3, i64 %i.i641381  %array.3.i = load i32, ptr %array.3.i.ptr, align 41382  %loop.acc.next = add i32 %loop.acc.2, %array.3.i1383  %i.next = add nuw i32 %i, 11384  %continue = icmp ult i32 %i.next, %n1385  br i1 %continue, label %loop, label %exit, !prof !21386 1387exit:                                             ; preds = %guarded, %entry1388  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]1389  ret i32 %result1390}1391 1392define i32 @three_guards(ptr %array.1, i32 %length.1, ptr %array.2, i32 %length.2, ptr %array.3, i32 %length.3, i32 %n) {1393; CHECK-LABEL: @three_guards(1394; CHECK-NEXT:  entry:1395; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 01396; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]1397; CHECK:       loop.preheader:1398; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule i32 [[N]], [[LENGTH_1:%.*]]1399; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH_1]]1400; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]1401; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]1402; CHECK-NEXT:    [[TMP4:%.*]] = icmp ule i32 [[N]], [[LENGTH_2:%.*]]1403; CHECK-NEXT:    [[TMP5:%.*]] = icmp ult i32 0, [[LENGTH_2]]1404; CHECK-NEXT:    [[TMP6:%.*]] = and i1 [[TMP5]], [[TMP4]]1405; CHECK-NEXT:    [[TMP7:%.*]] = freeze i1 [[TMP6]]1406; CHECK-NEXT:    [[TMP8:%.*]] = icmp ule i32 [[N]], [[LENGTH_3:%.*]]1407; CHECK-NEXT:    [[TMP9:%.*]] = icmp ult i32 0, [[LENGTH_3]]1408; CHECK-NEXT:    [[TMP10:%.*]] = and i1 [[TMP9]], [[TMP8]]1409; CHECK-NEXT:    [[TMP11:%.*]] = freeze i1 [[TMP10]]1410; CHECK-NEXT:    br label [[LOOP:%.*]]1411; CHECK:       loop:1412; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED6:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1413; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED6]] ], [ 0, [[LOOP_PREHEADER]] ]1414; CHECK-NEXT:    [[WITHIN_BOUNDS_1:%.*]] = icmp ult i32 [[I]], [[LENGTH_1]]1415; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()1416; CHECK-NEXT:    [[TMP12:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]1417; CHECK-NEXT:    br i1 [[TMP12]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]1418; CHECK:       deopt:1419; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1420; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1421; CHECK:       guarded:1422; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS_1]])1423; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641424; CHECK-NEXT:    [[ARRAY_1_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY_1:%.*]], i64 [[I_I64]]1425; CHECK-NEXT:    [[ARRAY_1_I:%.*]] = load i32, ptr [[ARRAY_1_I_PTR]], align 41426; CHECK-NEXT:    [[LOOP_ACC_1:%.*]] = add i32 [[LOOP_ACC]], [[ARRAY_1_I]]1427; CHECK-NEXT:    [[WITHIN_BOUNDS_2:%.*]] = icmp ult i32 [[I]], [[LENGTH_2]]1428; CHECK-NEXT:    [[WIDENABLE_COND4:%.*]] = call i1 @llvm.experimental.widenable.condition()1429; CHECK-NEXT:    [[TMP13:%.*]] = and i1 [[TMP7]], [[WIDENABLE_COND4]]1430; CHECK-NEXT:    br i1 [[TMP13]], label [[GUARDED1:%.*]], label [[DEOPT2:%.*]], !prof [[PROF0]]1431; CHECK:       deopt2:1432; CHECK-NEXT:    [[DEOPTCALL3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1433; CHECK-NEXT:    ret i32 [[DEOPTCALL3]]1434; CHECK:       guarded1:1435; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS_2]])1436; CHECK-NEXT:    [[ARRAY_2_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY_2:%.*]], i64 [[I_I64]]1437; CHECK-NEXT:    [[ARRAY_2_I:%.*]] = load i32, ptr [[ARRAY_2_I_PTR]], align 41438; CHECK-NEXT:    [[LOOP_ACC_2:%.*]] = add i32 [[LOOP_ACC_1]], [[ARRAY_2_I]]1439; CHECK-NEXT:    [[WITHIN_BOUNDS_3:%.*]] = icmp ult i32 [[I]], [[LENGTH_3]]1440; CHECK-NEXT:    [[WIDENABLE_COND9:%.*]] = call i1 @llvm.experimental.widenable.condition()1441; CHECK-NEXT:    [[TMP14:%.*]] = and i1 [[TMP11]], [[WIDENABLE_COND9]]1442; CHECK-NEXT:    br i1 [[TMP14]], label [[GUARDED6]], label [[DEOPT7:%.*]], !prof [[PROF0]]1443; CHECK:       deopt7:1444; CHECK-NEXT:    [[DEOPTCALL8:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1445; CHECK-NEXT:    ret i32 [[DEOPTCALL8]]1446; CHECK:       guarded6:1447; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS_3]])1448; CHECK-NEXT:    [[ARRAY_3_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY_3:%.*]], i64 [[I_I64]]1449; CHECK-NEXT:    [[ARRAY_3_I:%.*]] = load i32, ptr [[ARRAY_3_I_PTR]], align 41450; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC_2]], [[ARRAY_3_I]]1451; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 11452; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]1453; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1454; CHECK:       exit.loopexit:1455; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED6]] ]1456; CHECK-NEXT:    br label [[EXIT]]1457; CHECK:       exit:1458; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]1459; CHECK-NEXT:    ret i32 [[RESULT]]1460;1461entry:1462  %tmp5 = icmp eq i32 %n, 01463  br i1 %tmp5, label %exit, label %loop.preheader1464 1465loop.preheader:                                   ; preds = %entry1466  br label %loop1467 1468loop:                                             ; preds = %guarded6, %loop.preheader1469  %loop.acc = phi i32 [ %loop.acc.next, %guarded6 ], [ 0, %loop.preheader ]1470  %i = phi i32 [ %i.next, %guarded6 ], [ 0, %loop.preheader ]1471  %within.bounds.1 = icmp ult i32 %i, %length.11472  %widenable_cond = call i1 @llvm.experimental.widenable.condition()1473  %exiplicit_guard_cond = and i1 %within.bounds.1, %widenable_cond1474  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !01475 1476deopt:                                            ; preds = %loop1477  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1478  ret i32 %deoptcall1479 1480guarded:                                          ; preds = %loop1481  %i.i64 = zext i32 %i to i641482  %array.1.i.ptr = getelementptr inbounds i32, ptr %array.1, i64 %i.i641483  %array.1.i = load i32, ptr %array.1.i.ptr, align 41484  %loop.acc.1 = add i32 %loop.acc, %array.1.i1485  %within.bounds.2 = icmp ult i32 %i, %length.21486  %widenable_cond4 = call i1 @llvm.experimental.widenable.condition()1487  %exiplicit_guard_cond5 = and i1 %within.bounds.2, %widenable_cond41488  br i1 %exiplicit_guard_cond5, label %guarded1, label %deopt2, !prof !01489 1490deopt2:                                           ; preds = %guarded1491  %deoptcall3 = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1492  ret i32 %deoptcall31493 1494guarded1:                                         ; preds = %guarded1495  %array.2.i.ptr = getelementptr inbounds i32, ptr %array.2, i64 %i.i641496  %array.2.i = load i32, ptr %array.2.i.ptr, align 41497  %loop.acc.2 = add i32 %loop.acc.1, %array.2.i1498  %within.bounds.3 = icmp ult i32 %i, %length.31499  %widenable_cond9 = call i1 @llvm.experimental.widenable.condition()1500  %exiplicit_guard_cond10 = and i1 %within.bounds.3, %widenable_cond91501  br i1 %exiplicit_guard_cond10, label %guarded6, label %deopt7, !prof !01502 1503deopt7:                                           ; preds = %guarded11504  %deoptcall8 = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1505  ret i32 %deoptcall81506 1507guarded6:                                         ; preds = %guarded11508  %array.3.i.ptr = getelementptr inbounds i32, ptr %array.3, i64 %i.i641509  %array.3.i = load i32, ptr %array.3.i.ptr, align 41510  %loop.acc.next = add i32 %loop.acc.2, %array.3.i1511  %i.next = add nuw i32 %i, 11512  %continue = icmp ult i32 %i.next, %n1513  br i1 %continue, label %loop, label %exit, !prof !21514 1515exit:                                             ; preds = %guarded6, %entry1516  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded6 ]1517  ret i32 %result1518}1519 1520define i32 @unsigned_loop_0_to_n_unrelated_condition(ptr %array, i32 %length, i32 %n, i32 %x) {1521; CHECK-LABEL: @unsigned_loop_0_to_n_unrelated_condition(1522; CHECK-NEXT:  entry:1523; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 01524; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]1525; CHECK:       loop.preheader:1526; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule i32 [[N]], [[LENGTH:%.*]]1527; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH]]1528; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]1529; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]1530; CHECK-NEXT:    br label [[LOOP:%.*]]1531; CHECK:       loop:1532; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1533; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]1534; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]1535; CHECK-NEXT:    [[UNRELATED_COND:%.*]] = icmp ult i32 [[X:%.*]], [[LENGTH]]1536; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()1537; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[UNRELATED_COND]], [[TMP3]]1538; CHECK-NEXT:    [[TMP5:%.*]] = and i1 [[TMP4]], [[WIDENABLE_COND]]1539; CHECK-NEXT:    br i1 [[TMP5]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]1540; CHECK:       deopt:1541; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1542; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1543; CHECK:       guarded:1544; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])1545; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641546; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]1547; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 41548; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]1549; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 11550; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]1551; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1552; CHECK:       exit.loopexit:1553; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]1554; CHECK-NEXT:    br label [[EXIT]]1555; CHECK:       exit:1556; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]1557; CHECK-NEXT:    ret i32 [[RESULT]]1558;1559entry:1560  %tmp5 = icmp eq i32 %n, 01561  br i1 %tmp5, label %exit, label %loop.preheader1562 1563loop.preheader:                                   ; preds = %entry1564  br label %loop1565 1566loop:                                             ; preds = %guarded, %loop.preheader1567  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]1568  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]1569  %within.bounds = icmp ult i32 %i, %length1570  %unrelated.cond = icmp ult i32 %x, %length1571  %guard.cond = and i1 %within.bounds, %unrelated.cond1572  %widenable_cond = call i1 @llvm.experimental.widenable.condition()1573  %exiplicit_guard_cond = and i1 %guard.cond, %widenable_cond1574  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !01575 1576deopt:                                            ; preds = %loop1577  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1578  ret i32 %deoptcall1579 1580guarded:                                          ; preds = %loop1581  %i.i64 = zext i32 %i to i641582  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i641583  %array.i = load i32, ptr %array.i.ptr, align 41584  %loop.acc.next = add i32 %loop.acc, %array.i1585  %i.next = add nuw i32 %i, 11586  %continue = icmp ult i32 %i.next, %n1587  br i1 %continue, label %loop, label %exit, !prof !21588 1589exit:                                             ; preds = %guarded, %entry1590  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]1591  ret i32 %result1592}1593 1594define i32 @test_no_widened_conditions(ptr %array, i32 %length, i32 %n, i32 %x1, i32 %x2, i32 %x3) {1595; CHECK-LABEL: @test_no_widened_conditions(1596; CHECK-NEXT:  entry:1597; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 01598; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]1599; CHECK:       loop.preheader:1600; CHECK-NEXT:    br label [[LOOP:%.*]]1601; CHECK:       loop:1602; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1603; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]1604; CHECK-NEXT:    [[UNRELATED_COND_1:%.*]] = icmp eq i32 [[X1:%.*]], [[I]]1605; CHECK-NEXT:    [[UNRELATED_COND_2:%.*]] = icmp eq i32 [[X2:%.*]], [[I]]1606; CHECK-NEXT:    [[UNRELATED_COND_3:%.*]] = icmp eq i32 [[X3:%.*]], [[I]]1607; CHECK-NEXT:    [[UNRELATED_COND_AND_1:%.*]] = and i1 [[UNRELATED_COND_1]], [[UNRELATED_COND_2]]1608; CHECK-NEXT:    [[GUARD_COND:%.*]] = and i1 [[UNRELATED_COND_AND_1]], [[UNRELATED_COND_3]]1609; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()1610; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[GUARD_COND]], [[WIDENABLE_COND]]1611; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]1612; CHECK:       deopt:1613; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1614; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1615; CHECK:       guarded:1616; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641617; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]1618; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 41619; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]1620; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 11621; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]1622; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1623; CHECK:       exit.loopexit:1624; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]1625; CHECK-NEXT:    br label [[EXIT]]1626; CHECK:       exit:1627; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]1628; CHECK-NEXT:    ret i32 [[RESULT]]1629;1630entry:1631  %tmp5 = icmp eq i32 %n, 01632  br i1 %tmp5, label %exit, label %loop.preheader1633 1634loop.preheader:                                   ; preds = %entry1635  br label %loop1636 1637loop:                                             ; preds = %guarded, %loop.preheader1638  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]1639  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]1640  %unrelated.cond.1 = icmp eq i32 %x1, %i1641  %unrelated.cond.2 = icmp eq i32 %x2, %i1642  %unrelated.cond.3 = icmp eq i32 %x3, %i1643  %unrelated.cond.and.1 = and i1 %unrelated.cond.1, %unrelated.cond.21644  %guard.cond = and i1 %unrelated.cond.and.1, %unrelated.cond.31645  %widenable_cond = call i1 @llvm.experimental.widenable.condition()1646  %exiplicit_guard_cond = and i1 %guard.cond, %widenable_cond1647  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !01648 1649deopt:                                            ; preds = %loop1650  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1651  ret i32 %deoptcall1652 1653guarded:                                          ; preds = %loop1654  %i.i64 = zext i32 %i to i641655  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i641656  %array.i = load i32, ptr %array.i.ptr, align 41657  %loop.acc.next = add i32 %loop.acc, %array.i1658  %i.next = add nuw i32 %i, 11659  %continue = icmp ult i32 %i.next, %n1660  br i1 %continue, label %loop, label %exit, !prof !21661 1662exit:                                             ; preds = %guarded, %entry1663  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]1664  ret i32 %result1665}1666 1667define i32 @signed_loop_start_to_n_loop_variant_bound(ptr %array, i32 %x, i32 %start, i32 %n) {1668; CHECK-LABEL: @signed_loop_start_to_n_loop_variant_bound(1669; CHECK-NEXT:  entry:1670; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 01671; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]1672; CHECK:       loop.preheader:1673; CHECK-NEXT:    br label [[LOOP:%.*]]1674; CHECK:       loop:1675; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1676; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ [[START:%.*]], [[LOOP_PREHEADER]] ]1677; CHECK-NEXT:    [[BOUND:%.*]] = add i32 [[I]], [[X:%.*]]1678; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[BOUND]]1679; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()1680; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WITHIN_BOUNDS]], [[WIDENABLE_COND]]1681; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]1682; CHECK:       deopt:1683; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1684; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1685; CHECK:       guarded:1686; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641687; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]1688; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 41689; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]1690; CHECK-NEXT:    [[I_NEXT]] = add nsw i32 [[I]], 11691; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp slt i32 [[I_NEXT]], [[N]]1692; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1693; CHECK:       exit.loopexit:1694; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]1695; CHECK-NEXT:    br label [[EXIT]]1696; CHECK:       exit:1697; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]1698; CHECK-NEXT:    ret i32 [[RESULT]]1699;1700entry:1701  %tmp5 = icmp sle i32 %n, 01702  br i1 %tmp5, label %exit, label %loop.preheader1703 1704loop.preheader:                                   ; preds = %entry1705  br label %loop1706 1707loop:                                             ; preds = %guarded, %loop.preheader1708  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]1709  %i = phi i32 [ %i.next, %guarded ], [ %start, %loop.preheader ]1710  %bound = add i32 %i, %x1711  %within.bounds = icmp ult i32 %i, %bound1712  %widenable_cond = call i1 @llvm.experimental.widenable.condition()1713  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond1714  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !01715 1716deopt:                                            ; preds = %loop1717  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1718  ret i32 %deoptcall1719 1720guarded:                                          ; preds = %loop1721  %i.i64 = zext i32 %i to i641722  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i641723  %array.i = load i32, ptr %array.i.ptr, align 41724  %loop.acc.next = add i32 %loop.acc, %array.i1725  %i.next = add nsw i32 %i, 11726  %continue = icmp slt i32 %i.next, %n1727  br i1 %continue, label %loop, label %exit, !prof !21728 1729exit:                                             ; preds = %guarded, %entry1730  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]1731  ret i32 %result1732}1733 1734define i32 @signed_loop_start_to_n_non_monotonic_predicate(ptr %array, i32 %x, i32 %start, i32 %n) {1735; CHECK-LABEL: @signed_loop_start_to_n_non_monotonic_predicate(1736; CHECK-NEXT:  entry:1737; CHECK-NEXT:    [[TMP5:%.*]] = icmp sle i32 [[N:%.*]], 01738; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]1739; CHECK:       loop.preheader:1740; CHECK-NEXT:    br label [[LOOP:%.*]]1741; CHECK:       loop:1742; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1743; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ [[START:%.*]], [[LOOP_PREHEADER]] ]1744; CHECK-NEXT:    [[GUARD_COND:%.*]] = icmp eq i32 [[I]], [[X:%.*]]1745; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()1746; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[GUARD_COND]], [[WIDENABLE_COND]]1747; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]1748; CHECK:       deopt:1749; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1750; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1751; CHECK:       guarded:1752; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641753; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]1754; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 41755; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]1756; CHECK-NEXT:    [[I_NEXT]] = add nsw i32 [[I]], 11757; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp slt i32 [[I_NEXT]], [[N]]1758; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1759; CHECK:       exit.loopexit:1760; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]1761; CHECK-NEXT:    br label [[EXIT]]1762; CHECK:       exit:1763; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]1764; CHECK-NEXT:    ret i32 [[RESULT]]1765;1766entry:1767  %tmp5 = icmp sle i32 %n, 01768  br i1 %tmp5, label %exit, label %loop.preheader1769 1770loop.preheader:                                   ; preds = %entry1771  br label %loop1772 1773loop:                                             ; preds = %guarded, %loop.preheader1774  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]1775  %i = phi i32 [ %i.next, %guarded ], [ %start, %loop.preheader ]1776  %guard.cond = icmp eq i32 %i, %x1777  %widenable_cond = call i1 @llvm.experimental.widenable.condition()1778  %exiplicit_guard_cond = and i1 %guard.cond, %widenable_cond1779  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !01780 1781deopt:                                            ; preds = %loop1782  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1783  ret i32 %deoptcall1784 1785guarded:                                          ; preds = %loop1786  %i.i64 = zext i32 %i to i641787  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i641788  %array.i = load i32, ptr %array.i.ptr, align 41789  %loop.acc.next = add i32 %loop.acc, %array.i1790  %i.next = add nsw i32 %i, 11791  %continue = icmp slt i32 %i.next, %n1792  br i1 %continue, label %loop, label %exit, !prof !21793 1794exit:                                             ; preds = %guarded, %entry1795  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]1796  ret i32 %result1797}1798 1799define i32 @unsigned_loop_0_to_n_hoist_length(ptr %array, i16 %length.i16, i32 %n) {1800; CHECK-LABEL: @unsigned_loop_0_to_n_hoist_length(1801; CHECK-NEXT:  entry:1802; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 01803; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]1804; CHECK:       loop.preheader:1805; CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[LENGTH_I16:%.*]] to i321806; CHECK-NEXT:    [[TMP1:%.*]] = icmp ule i32 [[N]], [[TMP0]]1807; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 0, [[TMP0]]1808; CHECK-NEXT:    [[TMP3:%.*]] = and i1 [[TMP2]], [[TMP1]]1809; CHECK-NEXT:    [[TMP4:%.*]] = freeze i1 [[TMP3]]1810; CHECK-NEXT:    br label [[LOOP:%.*]]1811; CHECK:       loop:1812; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1813; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]1814; CHECK-NEXT:    [[LENGTH:%.*]] = zext i16 [[LENGTH_I16]] to i321815; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]1816; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()1817; CHECK-NEXT:    [[TMP5:%.*]] = and i1 [[TMP4]], [[WIDENABLE_COND]]1818; CHECK-NEXT:    br i1 [[TMP5]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]1819; CHECK:       deopt:1820; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1821; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1822; CHECK:       guarded:1823; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])1824; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641825; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]1826; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 41827; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]1828; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 11829; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]1830; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1831; CHECK:       exit.loopexit:1832; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]1833; CHECK-NEXT:    br label [[EXIT]]1834; CHECK:       exit:1835; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]1836; CHECK-NEXT:    ret i32 [[RESULT]]1837;1838entry:1839  %tmp5 = icmp eq i32 %n, 01840  br i1 %tmp5, label %exit, label %loop.preheader1841 1842loop.preheader:                                   ; preds = %entry1843  br label %loop1844 1845loop:                                             ; preds = %guarded, %loop.preheader1846  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]1847  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]1848  %length = zext i16 %length.i16 to i321849  %within.bounds = icmp ult i32 %i, %length1850  %widenable_cond = call i1 @llvm.experimental.widenable.condition()1851  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond1852  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !01853 1854deopt:                                            ; preds = %loop1855  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1856  ret i32 %deoptcall1857 1858guarded:                                          ; preds = %loop1859  %i.i64 = zext i32 %i to i641860  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i641861  %array.i = load i32, ptr %array.i.ptr, align 41862  %loop.acc.next = add i32 %loop.acc, %array.i1863  %i.next = add nuw i32 %i, 11864  %continue = icmp ult i32 %i.next, %n1865  br i1 %continue, label %loop, label %exit, !prof !21866 1867exit:                                             ; preds = %guarded, %entry1868  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]1869  ret i32 %result1870}1871 1872define i32 @unsigned_loop_0_to_n_cant_hoist_length(ptr %array, i32 %length, i32 %divider, i32 %n) {1873; CHECK-LABEL: @unsigned_loop_0_to_n_cant_hoist_length(1874; CHECK-NEXT:  entry:1875; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 01876; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]1877; CHECK:       loop.preheader:1878; CHECK-NEXT:    br label [[LOOP:%.*]]1879; CHECK:       loop:1880; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1881; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]1882; CHECK-NEXT:    [[LENGTH_UDIV:%.*]] = udiv i32 [[LENGTH:%.*]], [[DIVIDER:%.*]]1883; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH_UDIV]]1884; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()1885; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule i32 [[N]], [[LENGTH_UDIV]]1886; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH_UDIV]]1887; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]1888; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]1889; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]1890; CHECK-NEXT:    br i1 [[TMP4]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]1891; CHECK:       deopt:1892; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1893; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1894; CHECK:       guarded:1895; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])1896; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641897; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]1898; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 41899; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]1900; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 11901; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]1902; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1903; CHECK:       exit.loopexit:1904; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]1905; CHECK-NEXT:    br label [[EXIT]]1906; CHECK:       exit:1907; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]1908; CHECK-NEXT:    ret i32 [[RESULT]]1909;1910entry:1911  %tmp5 = icmp eq i32 %n, 01912  br i1 %tmp5, label %exit, label %loop.preheader1913 1914loop.preheader:                                   ; preds = %entry1915  br label %loop1916 1917loop:                                             ; preds = %guarded, %loop.preheader1918  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]1919  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]1920  %length.udiv = udiv i32 %length, %divider1921  %within.bounds = icmp ult i32 %i, %length.udiv1922  %widenable_cond = call i1 @llvm.experimental.widenable.condition()1923  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond1924  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !01925 1926deopt:                                            ; preds = %loop1927  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1928  ret i32 %deoptcall1929 1930guarded:                                          ; preds = %loop1931  %i.i64 = zext i32 %i to i641932  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i641933  %array.i = load i32, ptr %array.i.ptr, align 41934  %loop.acc.next = add i32 %loop.acc, %array.i1935  %i.next = add nuw i32 %i, 11936  %continue = icmp ult i32 %i.next, %n1937  br i1 %continue, label %loop, label %exit, !prof !21938 1939exit:                                             ; preds = %guarded, %entry1940  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]1941  ret i32 %result1942}1943 1944; Make sure that if we're going to consider a branch widenable, that the1945; call to widenable condition is actually present.1946define i32 @negative_WC_required(ptr %array, i32 %length, i32 %n, i1 %unrelated) {1947; CHECK-LABEL: @negative_WC_required(1948; CHECK-NEXT:  entry:1949; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 01950; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]1951; CHECK:       loop.preheader:1952; CHECK-NEXT:    br label [[LOOP:%.*]]1953; CHECK:       loop:1954; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]1955; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH:%.*]]1956; CHECK-NEXT:    [[NOT_WIDENABLE:%.*]] = and i1 [[WITHIN_BOUNDS]], [[UNRELATED:%.*]]1957; CHECK-NEXT:    br i1 [[NOT_WIDENABLE]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]1958; CHECK:       deopt:1959; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1960; CHECK-NEXT:    ret i32 [[DEOPTCALL]]1961; CHECK:       guarded:1962; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i641963; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]1964; CHECK-NEXT:    store i32 0, ptr [[ARRAY_I_PTR]], align 41965; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 11966; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]1967; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]1968; CHECK:       exit.loopexit:1969; CHECK-NEXT:    br label [[EXIT]]1970; CHECK:       exit:1971; CHECK-NEXT:    ret i32 01972;1973entry:1974  %tmp5 = icmp eq i32 %n, 01975  br i1 %tmp5, label %exit, label %loop.preheader1976 1977loop.preheader:                                   ; preds = %entry1978  br label %loop1979 1980loop:1981  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]1982  %within.bounds = icmp ult i32 %i, %length1983  %not_widenable = and i1 %within.bounds, %unrelated1984  br i1 %not_widenable, label %guarded, label %deopt, !prof !01985 1986deopt:1987  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]1988  ret i32 %deoptcall1989 1990guarded:                                          ; preds = %loop1991  %i.i64 = zext i32 %i to i641992  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i641993  store i32 0, ptr %array.i.ptr, align 41994  %i.next = add nuw i32 %i, 11995  %continue = icmp ult i32 %i.next, %n1996  br i1 %continue, label %loop, label %exit, !prof !21997 1998exit:                                             ; preds = %guarded, %entry1999  ret i32 02000}2001 2002define i32 @swapped_wb(ptr %array, i32 %length, i32 %n) {2003; CHECK-LABEL: @swapped_wb(2004; CHECK-NEXT:  entry:2005; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 02006; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]2007; CHECK:       loop.preheader:2008; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()2009; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule i32 [[N]], [[LENGTH:%.*]]2010; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH]]2011; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]2012; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]2013; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]2014; CHECK-NEXT:    br label [[LOOP:%.*]]2015; CHECK:       loop:2016; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]2017; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]2018; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]2019; CHECK-NEXT:    br i1 [[TMP4]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]2020; CHECK:       deopt:2021; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]2022; CHECK-NEXT:    ret i32 [[DEOPTCALL]]2023; CHECK:       guarded:2024; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])2025; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i642026; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]2027; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 42028; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]2029; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 12030; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]2031; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]2032; CHECK:       exit.loopexit:2033; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]2034; CHECK-NEXT:    br label [[EXIT]]2035; CHECK:       exit:2036; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]2037; CHECK-NEXT:    ret i32 [[RESULT]]2038;2039entry:2040  %tmp5 = icmp eq i32 %n, 02041  br i1 %tmp5, label %exit, label %loop.preheader2042 2043loop.preheader:                                   ; preds = %entry2044  %widenable_cond = call i1 @llvm.experimental.widenable.condition()2045  br label %loop2046 2047loop:                                             ; preds = %guarded, %loop.preheader2048  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]2049  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]2050  %within.bounds = icmp ult i32 %i, %length2051  %exiplicit_guard_cond = and i1 %widenable_cond, %within.bounds2052  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !02053 2054deopt:                                            ; preds = %loop2055  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]2056  ret i32 %deoptcall2057 2058guarded:                                          ; preds = %loop2059  %i.i64 = zext i32 %i to i642060  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i642061  %array.i = load i32, ptr %array.i.ptr, align 42062  %loop.acc.next = add i32 %loop.acc, %array.i2063  %i.next = add nuw i32 %i, 12064  %continue = icmp ult i32 %i.next, %n2065  br i1 %continue, label %loop, label %exit, !prof !22066 2067exit:                                             ; preds = %guarded, %entry2068  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]2069  ret i32 %result2070}2071 2072define i32 @unsigned_loop_0_to_n_ult_check_deep_deopt(ptr %array, i32 %length, i32 %n) {2073; CHECK-LABEL: @unsigned_loop_0_to_n_ult_check_deep_deopt(2074; CHECK-NEXT:  entry:2075; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[N:%.*]], 02076; CHECK-NEXT:    br i1 [[TMP5]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]2077; CHECK:       loop.preheader:2078; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule i32 [[N]], [[LENGTH:%.*]]2079; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 0, [[LENGTH]]2080; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]2081; CHECK-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]2082; CHECK-NEXT:    br label [[LOOP:%.*]]2083; CHECK:       loop:2084; CHECK-NEXT:    [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]2085; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]2086; CHECK-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]2087; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()2088; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]2089; CHECK-NEXT:    br i1 [[TMP4]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]2090; CHECK:       deopt:2091; CHECK-NEXT:    br label [[REAL_DEOPT:%.*]]2092; CHECK:       real_deopt:2093; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]2094; CHECK-NEXT:    ret i32 [[DEOPTCALL]]2095; CHECK:       guarded:2096; CHECK-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])2097; CHECK-NEXT:    [[I_I64:%.*]] = zext i32 [[I]] to i642098; CHECK-NEXT:    [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]2099; CHECK-NEXT:    [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 42100; CHECK-NEXT:    [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]2101; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 12102; CHECK-NEXT:    [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]2103; CHECK-NEXT:    br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !prof [[PROF1]]2104; CHECK:       exit.loopexit:2105; CHECK-NEXT:    [[LOOP_ACC_NEXT_LCSSA:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]2106; CHECK-NEXT:    br label [[EXIT]]2107; CHECK:       exit:2108; CHECK-NEXT:    [[RESULT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[LOOP_ACC_NEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]2109; CHECK-NEXT:    ret i32 [[RESULT]]2110;2111entry:2112  %tmp5 = icmp eq i32 %n, 02113  br i1 %tmp5, label %exit, label %loop.preheader2114 2115loop.preheader:                                   ; preds = %entry2116  br label %loop2117 2118loop:                                             ; preds = %guarded, %loop.preheader2119  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]2120  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]2121  %within.bounds = icmp ult i32 %i, %length2122  %widenable_cond = call i1 @llvm.experimental.widenable.condition()2123  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond2124  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !02125 2126deopt:                                            ; preds = %loop2127  br label %real_deopt2128 2129real_deopt:                                       ; preds = %deopt2130  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]2131  ret i32 %deoptcall2132 2133guarded:                                          ; preds = %loop2134  %i.i64 = zext i32 %i to i642135  %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i642136  %array.i = load i32, ptr %array.i.ptr, align 42137  %loop.acc.next = add i32 %loop.acc, %array.i2138  %i.next = add nuw i32 %i, 12139  %continue = icmp ult i32 %i.next, %n2140  br i1 %continue, label %loop, label %exit, !prof !22141 2142exit:                                             ; preds = %guarded, %entry2143  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]2144  ret i32 %result2145}2146 2147; TODO: Support widenable branch in the form of br((wc and cond0) and cond1)2148; At present LoopPredication assumes the form of br(wc && (...)) only.2149define i32 @wc_deep_in_expression_tree(i1 %cond0, i1 %cond1, i32 %limit) {2150; CHECK-LABEL: @wc_deep_in_expression_tree(2151; CHECK-NEXT:  entry:2152; CHECK-NEXT:    [[WC:%.*]] = call i1 @llvm.experimental.widenable.condition()2153; CHECK-NEXT:    [[AND0:%.*]] = and i1 [[WC]], [[COND0:%.*]]2154; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[AND0]], [[COND1:%.*]]2155; CHECK-NEXT:    br i1 [[AND1]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]]2156; CHECK:       loop.preheader:2157; CHECK-NEXT:    br label [[LOOP:%.*]]2158; CHECK:       loop:2159; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]2160; CHECK-NEXT:    [[GUARD_COND:%.*]] = icmp sgt i32 [[IV]], 1002161; CHECK-NEXT:    br i1 [[GUARD_COND]], label [[DEOPT_LOOPEXIT:%.*]], label [[GUARDED]]2162; CHECK:       guarded:2163; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 12164; CHECK-NEXT:    [[EXIT_COND:%.*]] = icmp ult i32 [[IV]], [[LIMIT:%.*]]2165; CHECK-NEXT:    br i1 [[EXIT_COND]], label [[LOOP]], label [[EXIT:%.*]]2166; CHECK:       deopt.loopexit:2167; CHECK-NEXT:    br label [[DEOPT]]2168; CHECK:       deopt:2169; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]2170; CHECK-NEXT:    ret i32 [[DEOPTCALL]]2171; CHECK:       exit:2172; CHECK-NEXT:    ret i32 02173;2174entry:2175  %wc = call i1 @llvm.experimental.widenable.condition()2176  %and0 = and i1 %wc, %cond02177  %and1 = and i1 %and0, %cond12178  br i1 %and1, label %loop, label %deopt2179 2180loop:2181  %iv = phi i32 [ %iv.next, %guarded ], [ 0, %entry ]2182  %guard.cond = icmp sgt i32 %iv, 1002183  br i1 %guard.cond, label %deopt, label %guarded2184 2185guarded:2186  %iv.next = add i32 %iv, 12187  %exit.cond = icmp ult i32 %iv, %limit2188  br i1 %exit.cond, label %loop, label %exit2189 2190deopt:2191  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]2192  ret i32 %deoptcall2193exit:2194  ret i32 02195}2196 2197declare i32 @llvm.experimental.deoptimize.i32(...)2198 2199; Function Attrs: inaccessiblememonly nounwind2200declare i1 @llvm.experimental.widenable.condition() #02201 2202attributes #0 = { inaccessiblememonly nounwind }2203 2204!0 = !{!"branch_weights", i32 1048576, i32 1}2205!1 = !{i32 1, i32 -2147483648}2206!2 = !{!"branch_weights", i32 1024, i32 1}2207