brintos

brintos / llvm-project-archived public Read only

0
0
Text · 75.7 KiB · 1773b2a Raw
1481 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --filter-out-after "scalar.ph:" --version 62; RUN: opt -p loop-vectorize -force-vector-width=2 -S %s | FileCheck %s3 4declare void @llvm.assume(i1)5 6define void @deref_assumption_in_header_constant_trip_count(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nofree nosync{7; CHECK-LABEL: define void @deref_assumption_in_header_constant_trip_count(8; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1:[0-9]+]] {9; CHECK-NEXT:  [[ENTRY:.*:]]10; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]11; CHECK:       [[VECTOR_PH]]:12; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]13; CHECK:       [[VECTOR_BODY]]:14; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]15; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2]] ]16; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[A]], <2 x i64> [[VEC_IND]]17; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 018; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 119; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[TMP4]], i64 4), "dereferenceable"(ptr [[TMP4]], i64 4) ]20; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[TMP5]], i64 4), "dereferenceable"(ptr [[TMP5]], i64 4) ]21; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]22; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP6]], align 423; CHECK-NEXT:    [[TMP10:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer24; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <2 x i1> [[TMP10]], i32 025; CHECK-NEXT:    br i1 [[TMP8]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]26; CHECK:       [[PRED_LOAD_IF]]:27; CHECK-NEXT:    [[TMP21:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 028; CHECK-NEXT:    [[TMP22:%.*]] = load i32, ptr [[TMP21]], align 429; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <2 x i32> poison, i32 [[TMP22]], i32 030; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]31; CHECK:       [[PRED_LOAD_CONTINUE]]:32; CHECK-NEXT:    [[TMP12:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP11]], %[[PRED_LOAD_IF]] ]33; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <2 x i1> [[TMP10]], i32 134; CHECK-NEXT:    br i1 [[TMP13]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]35; CHECK:       [[PRED_LOAD_IF1]]:36; CHECK-NEXT:    [[TMP26:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 137; CHECK-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 438; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <2 x i32> [[TMP12]], i32 [[TMP27]], i32 139; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]40; CHECK:       [[PRED_LOAD_CONTINUE2]]:41; CHECK-NEXT:    [[TMP14:%.*]] = phi <2 x i32> [ [[TMP12]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP16]], %[[PRED_LOAD_IF1]] ]42; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP10]], <2 x i32> [[TMP14]], <2 x i32> [[WIDE_LOAD]]43; CHECK-NEXT:    [[TMP30:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]44; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP30]], align 445; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 246; CHECK-NEXT:    [[VEC_IND_NEXT]] = add nuw nsw <2 x i64> [[VEC_IND]], splat (i64 2)47; CHECK-NEXT:    [[TMP32:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100048; CHECK-NEXT:    br i1 [[TMP32]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]49; CHECK:       [[MIDDLE_BLOCK]]:50; CHECK-NEXT:    br label %[[EXIT:.*]]51; CHECK:       [[EXIT]]:52; CHECK-NEXT:    ret void53;54entry:55  br label %loop.header56 57loop.header:58  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]59  %gep.a = getelementptr i32, ptr %a, i64 %iv60  call void @llvm.assume(i1 true) [ "align"(ptr %gep.a, i64 4), "dereferenceable"(ptr %gep.a, i64 4) ]61  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv62  %l.b = load i32, ptr %gep.b, align 463  %c.1 = icmp sge i32 %l.b, 064  br i1 %c.1, label %loop.latch, label %loop.then65 66loop.then:67  %l.a = load i32, ptr %gep.a, align 468  br label %loop.latch69 70loop.latch:71  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]72  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv73  store i32 %merge, ptr %gep.c, align 474  %iv.next = add nuw nsw i64 %iv, 175  %ec = icmp eq i64 %iv.next, 100076  br i1 %ec, label %exit, label %loop.header77 78exit:79  ret void80}81 82define void @align_deref_assumption_in_header_constant_trip_count_loop_invariant_ptr(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nofree nosync{83; CHECK-LABEL: define void @align_deref_assumption_in_header_constant_trip_count_loop_invariant_ptr(84; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {85; CHECK-NEXT:  [[ENTRY:.*:]]86; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 4), "dereferenceable"(ptr [[A]], i64 4) ]87; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]88; CHECK:       [[VECTOR_PH]]:89; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]90; CHECK:       [[VECTOR_BODY]]:91; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]92; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]93; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP1]], align 494; CHECK-NEXT:    [[TMP3:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer95; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[A]], align 496; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[A]], align 497; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i32> poison, i32 [[TMP4]], i32 098; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <2 x i32> [[TMP6]], i32 [[TMP5]], i32 199; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[TMP7]]100; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]101; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP8]], align 4102; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2103; CHECK-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000104; CHECK-NEXT:    br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]105; CHECK:       [[MIDDLE_BLOCK]]:106; CHECK-NEXT:    br label %[[EXIT:.*]]107; CHECK:       [[EXIT]]:108; CHECK-NEXT:    ret void109;110entry:111  call void @llvm.assume(i1 true) [ "align"(ptr %a, i64 4), "dereferenceable"(ptr %a, i64 4) ]112  br label %loop.header113 114loop.header:115  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]116  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv117  %l.b = load i32, ptr %gep.b, align 4118  %c.1 = icmp sge i32 %l.b, 0119  br i1 %c.1, label %loop.latch, label %loop.then120 121loop.then:122  %l.a = load i32, ptr %a, align 4123  br label %loop.latch124 125loop.latch:126  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]127  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv128  store i32 %merge, ptr %gep.c, align 4129  %iv.next = add nuw nsw i64 %iv, 1130  %ec = icmp eq i64 %iv.next, 1000131  br i1 %ec, label %exit, label %loop.header132 133exit:134  ret void135}136 137define void @deref_assumption_too_small_in_header_constant_trip_count(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nofree nosync{138; CHECK-LABEL: define void @deref_assumption_too_small_in_header_constant_trip_count(139; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {140; CHECK-NEXT:  [[ENTRY:.*:]]141; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]142; CHECK:       [[VECTOR_PH]]:143; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]144; CHECK:       [[VECTOR_BODY]]:145; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]146; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2]] ]147; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[A]], <2 x i64> [[VEC_IND]]148; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0149; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1150; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[TMP4]], i64 4), "dereferenceable"(ptr [[TMP4]], i64 2) ]151; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[TMP5]], i64 4), "dereferenceable"(ptr [[TMP5]], i64 2) ]152; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]153; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP6]], align 4154; CHECK-NEXT:    [[TMP10:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer155; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <2 x i1> [[TMP10]], i32 0156; CHECK-NEXT:    br i1 [[TMP8]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]157; CHECK:       [[PRED_LOAD_IF]]:158; CHECK-NEXT:    [[TMP21:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0159; CHECK-NEXT:    [[TMP22:%.*]] = load i32, ptr [[TMP21]], align 4160; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <2 x i32> poison, i32 [[TMP22]], i32 0161; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]162; CHECK:       [[PRED_LOAD_CONTINUE]]:163; CHECK-NEXT:    [[TMP12:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP11]], %[[PRED_LOAD_IF]] ]164; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <2 x i1> [[TMP10]], i32 1165; CHECK-NEXT:    br i1 [[TMP13]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]166; CHECK:       [[PRED_LOAD_IF1]]:167; CHECK-NEXT:    [[TMP26:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1168; CHECK-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4169; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <2 x i32> [[TMP12]], i32 [[TMP27]], i32 1170; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]171; CHECK:       [[PRED_LOAD_CONTINUE2]]:172; CHECK-NEXT:    [[TMP14:%.*]] = phi <2 x i32> [ [[TMP12]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP16]], %[[PRED_LOAD_IF1]] ]173; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP10]], <2 x i32> [[TMP14]], <2 x i32> [[WIDE_LOAD]]174; CHECK-NEXT:    [[TMP30:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]175; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP30]], align 4176; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2177; CHECK-NEXT:    [[VEC_IND_NEXT]] = add nuw nsw <2 x i64> [[VEC_IND]], splat (i64 2)178; CHECK-NEXT:    [[TMP32:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000179; CHECK-NEXT:    br i1 [[TMP32]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]180; CHECK:       [[MIDDLE_BLOCK]]:181; CHECK-NEXT:    br label %[[EXIT:.*]]182; CHECK:       [[EXIT]]:183; CHECK-NEXT:    ret void184;185entry:186  br label %loop.header187 188loop.header:189  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]190  %gep.a = getelementptr i32, ptr %a, i64 %iv191  call void @llvm.assume(i1 true) [ "align"(ptr %gep.a, i64 4), "dereferenceable"(ptr %gep.a, i64 2) ]192  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv193  %l.b = load i32, ptr %gep.b, align 4194  %c.1 = icmp sge i32 %l.b, 0195  br i1 %c.1, label %loop.latch, label %loop.then196 197loop.then:198  %l.a = load i32, ptr %gep.a, align 4199  br label %loop.latch200 201loop.latch:202  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]203  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv204  store i32 %merge, ptr %gep.c, align 4205  %iv.next = add nuw nsw i64 %iv, 1206  %ec = icmp eq i64 %iv.next, 1000207  br i1 %ec, label %exit, label %loop.header208 209exit:210  ret void211}212 213define void @deref_assumption_in_header_constant_trip_count_align_1(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nofree nosync{214; CHECK-LABEL: define void @deref_assumption_in_header_constant_trip_count_align_1(215; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {216; CHECK-NEXT:  [[ENTRY:.*:]]217; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]218; CHECK:       [[VECTOR_PH]]:219; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]220; CHECK:       [[VECTOR_BODY]]:221; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]222; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2]] ]223; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[A]], <2 x i64> [[VEC_IND]]224; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0225; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1226; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[TMP2]], i64 4) ]227; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[TMP3]], i64 4) ]228; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]229; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP4]], align 4230; CHECK-NEXT:    [[TMP7:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer231; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <2 x i1> [[TMP7]], i32 0232; CHECK-NEXT:    br i1 [[TMP8]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]233; CHECK:       [[PRED_LOAD_IF]]:234; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0235; CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP9]], align 1236; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <2 x i32> poison, i32 [[TMP10]], i32 0237; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]238; CHECK:       [[PRED_LOAD_CONTINUE]]:239; CHECK-NEXT:    [[TMP12:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP11]], %[[PRED_LOAD_IF]] ]240; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <2 x i1> [[TMP7]], i32 1241; CHECK-NEXT:    br i1 [[TMP13]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]242; CHECK:       [[PRED_LOAD_IF1]]:243; CHECK-NEXT:    [[TMP14:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1244; CHECK-NEXT:    [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 1245; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <2 x i32> [[TMP12]], i32 [[TMP15]], i32 1246; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]247; CHECK:       [[PRED_LOAD_CONTINUE2]]:248; CHECK-NEXT:    [[TMP17:%.*]] = phi <2 x i32> [ [[TMP12]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP16]], %[[PRED_LOAD_IF1]] ]249; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP7]], <2 x i32> [[TMP17]], <2 x i32> [[WIDE_LOAD]]250; CHECK-NEXT:    [[TMP18:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]251; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP18]], align 4252; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2253; CHECK-NEXT:    [[VEC_IND_NEXT]] = add nuw nsw <2 x i64> [[VEC_IND]], splat (i64 2)254; CHECK-NEXT:    [[TMP20:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000255; CHECK-NEXT:    br i1 [[TMP20]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]256; CHECK:       [[MIDDLE_BLOCK]]:257; CHECK-NEXT:    br label %[[EXIT:.*]]258; CHECK:       [[EXIT]]:259; CHECK-NEXT:    ret void260;261entry:262  br label %loop.header263 264loop.header:265  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]266  %gep.a = getelementptr i32, ptr %a, i64 %iv267  call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %gep.a, i64 4) ]268  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv269  %l.b = load i32, ptr %gep.b, align 4270  %c.1 = icmp sge i32 %l.b, 0271  br i1 %c.1, label %loop.latch, label %loop.then272 273loop.then:274  %l.a = load i32, ptr %gep.a, align 1275  br label %loop.latch276 277loop.latch:278  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]279  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv280  store i32 %merge, ptr %gep.c, align 4281  %iv.next = add nuw nsw i64 %iv, 1282  %ec = icmp eq i64 %iv.next, 1000283  br i1 %ec, label %exit, label %loop.header284 285exit:286  ret void287}288 289define void @deref_assumption_in_header_constant_trip_count_align_via_arg_attribute(ptr noalias align 4 %a, ptr noalias %b, ptr noalias %c) nofree nosync{290; CHECK-LABEL: define void @deref_assumption_in_header_constant_trip_count_align_via_arg_attribute(291; CHECK-SAME: ptr noalias align 4 [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {292; CHECK-NEXT:  [[ENTRY:.*:]]293; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]294; CHECK:       [[VECTOR_PH]]:295; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]296; CHECK:       [[VECTOR_BODY]]:297; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]298; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2]] ]299; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[A]], <2 x i64> [[VEC_IND]]300; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0301; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1302; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[TMP2]], i64 4) ]303; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[TMP3]], i64 4) ]304; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]305; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP4]], align 4306; CHECK-NEXT:    [[TMP7:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer307; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <2 x i1> [[TMP7]], i32 0308; CHECK-NEXT:    br i1 [[TMP8]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]309; CHECK:       [[PRED_LOAD_IF]]:310; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0311; CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP9]], align 4312; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <2 x i32> poison, i32 [[TMP10]], i32 0313; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]314; CHECK:       [[PRED_LOAD_CONTINUE]]:315; CHECK-NEXT:    [[TMP12:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP11]], %[[PRED_LOAD_IF]] ]316; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <2 x i1> [[TMP7]], i32 1317; CHECK-NEXT:    br i1 [[TMP13]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]318; CHECK:       [[PRED_LOAD_IF1]]:319; CHECK-NEXT:    [[TMP14:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1320; CHECK-NEXT:    [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 4321; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <2 x i32> [[TMP12]], i32 [[TMP15]], i32 1322; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]323; CHECK:       [[PRED_LOAD_CONTINUE2]]:324; CHECK-NEXT:    [[TMP17:%.*]] = phi <2 x i32> [ [[TMP12]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP16]], %[[PRED_LOAD_IF1]] ]325; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP7]], <2 x i32> [[TMP17]], <2 x i32> [[WIDE_LOAD]]326; CHECK-NEXT:    [[TMP18:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]327; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP18]], align 4328; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2329; CHECK-NEXT:    [[VEC_IND_NEXT]] = add nuw nsw <2 x i64> [[VEC_IND]], splat (i64 2)330; CHECK-NEXT:    [[TMP20:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000331; CHECK-NEXT:    br i1 [[TMP20]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]332; CHECK:       [[MIDDLE_BLOCK]]:333; CHECK-NEXT:    br label %[[EXIT:.*]]334; CHECK:       [[EXIT]]:335; CHECK-NEXT:    ret void336;337entry:338  br label %loop.header339 340loop.header:341  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]342  %gep.a = getelementptr i32, ptr %a, i64 %iv343  call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %gep.a, i64 4) ]344  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv345  %l.b = load i32, ptr %gep.b, align 4346  %c.1 = icmp sge i32 %l.b, 0347  br i1 %c.1, label %loop.latch, label %loop.then348 349loop.then:350  %l.a = load i32, ptr %gep.a, align 4351  br label %loop.latch352 353loop.latch:354  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]355  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv356  store i32 %merge, ptr %gep.c, align 4357  %iv.next = add nuw nsw i64 %iv, 1358  %ec = icmp eq i64 %iv.next, 1000359  br i1 %ec, label %exit, label %loop.header360 361exit:362  ret void363}364 365define void @deref_assumption_in_header_constant_trip_count_align_not_known(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nofree nosync{366; CHECK-LABEL: define void @deref_assumption_in_header_constant_trip_count_align_not_known(367; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {368; CHECK-NEXT:  [[ENTRY:.*:]]369; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]370; CHECK:       [[VECTOR_PH]]:371; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]372; CHECK:       [[VECTOR_BODY]]:373; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]374; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2]] ]375; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[A]], <2 x i64> [[VEC_IND]]376; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0377; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1378; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[TMP2]], i64 4) ]379; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[TMP3]], i64 4) ]380; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]381; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP4]], align 4382; CHECK-NEXT:    [[TMP7:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer383; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <2 x i1> [[TMP7]], i32 0384; CHECK-NEXT:    br i1 [[TMP8]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]385; CHECK:       [[PRED_LOAD_IF]]:386; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0387; CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP9]], align 4388; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <2 x i32> poison, i32 [[TMP10]], i32 0389; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]390; CHECK:       [[PRED_LOAD_CONTINUE]]:391; CHECK-NEXT:    [[TMP12:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP11]], %[[PRED_LOAD_IF]] ]392; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <2 x i1> [[TMP7]], i32 1393; CHECK-NEXT:    br i1 [[TMP13]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]394; CHECK:       [[PRED_LOAD_IF1]]:395; CHECK-NEXT:    [[TMP14:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1396; CHECK-NEXT:    [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 4397; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <2 x i32> [[TMP12]], i32 [[TMP15]], i32 1398; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]399; CHECK:       [[PRED_LOAD_CONTINUE2]]:400; CHECK-NEXT:    [[TMP17:%.*]] = phi <2 x i32> [ [[TMP12]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP16]], %[[PRED_LOAD_IF1]] ]401; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP7]], <2 x i32> [[TMP17]], <2 x i32> [[WIDE_LOAD]]402; CHECK-NEXT:    [[TMP18:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]403; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP18]], align 4404; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2405; CHECK-NEXT:    [[VEC_IND_NEXT]] = add nuw nsw <2 x i64> [[VEC_IND]], splat (i64 2)406; CHECK-NEXT:    [[TMP20:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000407; CHECK-NEXT:    br i1 [[TMP20]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]408; CHECK:       [[MIDDLE_BLOCK]]:409; CHECK-NEXT:    br label %[[EXIT:.*]]410; CHECK:       [[EXIT]]:411; CHECK-NEXT:    ret void412;413entry:414  br label %loop.header415 416loop.header:417  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]418  %gep.a = getelementptr i32, ptr %a, i64 %iv419  call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %gep.a, i64 4) ]420  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv421  %l.b = load i32, ptr %gep.b, align 4422  %c.1 = icmp sge i32 %l.b, 0423  br i1 %c.1, label %loop.latch, label %loop.then424 425loop.then:426  %l.a = load i32, ptr %gep.a, align 4427  br label %loop.latch428 429loop.latch:430  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]431  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv432  store i32 %merge, ptr %gep.c, align 4433  %iv.next = add nuw nsw i64 %iv, 1434  %ec = icmp eq i64 %iv.next, 1000435  br i1 %ec, label %exit, label %loop.header436 437exit:438  ret void439}440 441define void @deref_assumption_in_then_constant_trip_count(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nofree nosync{442; CHECK-LABEL: define void @deref_assumption_in_then_constant_trip_count(443; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {444; CHECK-NEXT:  [[ENTRY:.*:]]445; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]446; CHECK:       [[VECTOR_PH]]:447; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]448; CHECK:       [[VECTOR_BODY]]:449; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]450; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2]] ]451; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]452; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP1]], align 4453; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer454; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr i32, ptr [[A]], <2 x i64> [[VEC_IND]]455; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <2 x i1> [[TMP4]], i32 0456; CHECK-NEXT:    br i1 [[TMP6]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]457; CHECK:       [[PRED_LOAD_IF]]:458; CHECK-NEXT:    [[TMP17:%.*]] = extractelement <2 x ptr> [[TMP5]], i32 0459; CHECK-NEXT:    [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4460; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <2 x i32> poison, i32 [[TMP18]], i32 0461; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]462; CHECK:       [[PRED_LOAD_CONTINUE]]:463; CHECK-NEXT:    [[TMP10:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP9]], %[[PRED_LOAD_IF]] ]464; CHECK-NEXT:    [[TMP11:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1465; CHECK-NEXT:    br i1 [[TMP11]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]466; CHECK:       [[PRED_LOAD_IF1]]:467; CHECK-NEXT:    [[TMP22:%.*]] = extractelement <2 x ptr> [[TMP5]], i32 1468; CHECK-NEXT:    [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4469; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <2 x i32> [[TMP10]], i32 [[TMP23]], i32 1470; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]471; CHECK:       [[PRED_LOAD_CONTINUE2]]:472; CHECK-NEXT:    [[TMP12:%.*]] = phi <2 x i32> [ [[TMP10]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]473; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP4]], <2 x i32> [[TMP12]], <2 x i32> [[WIDE_LOAD]]474; CHECK-NEXT:    [[TMP26:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]475; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP26]], align 4476; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2477; CHECK-NEXT:    [[VEC_IND_NEXT]] = add nuw nsw <2 x i64> [[VEC_IND]], splat (i64 2)478; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000479; CHECK-NEXT:    br i1 [[TMP28]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]480; CHECK:       [[MIDDLE_BLOCK]]:481; CHECK-NEXT:    br label %[[EXIT:.*]]482; CHECK:       [[EXIT]]:483; CHECK-NEXT:    ret void484;485entry:486  br label %loop.header487 488loop.header:489  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]490  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv491  %l.b = load i32, ptr %gep.b, align 4492  %c.1 = icmp sge i32 %l.b, 0493  br i1 %c.1, label %loop.latch, label %loop.then494 495loop.then:496  %gep.a = getelementptr i32, ptr %a, i64 %iv497  call void @llvm.assume(i1 true) [ "align"(ptr %gep.a, i64 4), "dereferenceable"(ptr %gep.a, i64 4) ]498  %l.a = load i32, ptr %gep.a, align 4499  br label %loop.latch500 501loop.latch:502  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]503  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv504  store i32 %merge, ptr %gep.c, align 4505  %iv.next = add nuw nsw i64 %iv, 1506  %ec = icmp eq i64 %iv.next, 1000507  br i1 %ec, label %exit, label %loop.header508 509exit:510  ret void511}512 513define void @deref_assumption_in_latch_constant_trip_count(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nofree nosync{514; CHECK-LABEL: define void @deref_assumption_in_latch_constant_trip_count(515; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {516; CHECK-NEXT:  [[ENTRY:.*:]]517; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]518; CHECK:       [[VECTOR_PH]]:519; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]520; CHECK:       [[VECTOR_BODY]]:521; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]522; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2]] ]523; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[A]], <2 x i64> [[VEC_IND]]524; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0525; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1526; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]527; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP2]], align 4528; CHECK-NEXT:    [[TMP5:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer529; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <2 x i1> [[TMP5]], i32 0530; CHECK-NEXT:    br i1 [[TMP6]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]531; CHECK:       [[PRED_LOAD_IF]]:532; CHECK-NEXT:    [[TMP17:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0533; CHECK-NEXT:    [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4534; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <2 x i32> poison, i32 [[TMP18]], i32 0535; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]536; CHECK:       [[PRED_LOAD_CONTINUE]]:537; CHECK-NEXT:    [[TMP10:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP9]], %[[PRED_LOAD_IF]] ]538; CHECK-NEXT:    [[TMP11:%.*]] = extractelement <2 x i1> [[TMP5]], i32 1539; CHECK-NEXT:    br i1 [[TMP11]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]540; CHECK:       [[PRED_LOAD_IF1]]:541; CHECK-NEXT:    [[TMP22:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1542; CHECK-NEXT:    [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4543; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <2 x i32> [[TMP10]], i32 [[TMP23]], i32 1544; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]545; CHECK:       [[PRED_LOAD_CONTINUE2]]:546; CHECK-NEXT:    [[TMP12:%.*]] = phi <2 x i32> [ [[TMP10]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]547; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP5]], <2 x i32> [[TMP12]], <2 x i32> [[WIDE_LOAD]]548; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[TMP3]], i64 4), "dereferenceable"(ptr [[TMP3]], i64 4) ]549; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[TMP4]], i64 4), "dereferenceable"(ptr [[TMP4]], i64 4) ]550; CHECK-NEXT:    [[TMP30:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]551; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP30]], align 4552; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2553; CHECK-NEXT:    [[VEC_IND_NEXT]] = add nuw nsw <2 x i64> [[VEC_IND]], splat (i64 2)554; CHECK-NEXT:    [[TMP32:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000555; CHECK-NEXT:    br i1 [[TMP32]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]556; CHECK:       [[MIDDLE_BLOCK]]:557; CHECK-NEXT:    br label %[[EXIT:.*]]558; CHECK:       [[EXIT]]:559; CHECK-NEXT:    ret void560;561entry:562  br label %loop.header563 564loop.header:565  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]566  %gep.a = getelementptr i32, ptr %a, i64 %iv567  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv568  %l.b = load i32, ptr %gep.b, align 4569  %c.1 = icmp sge i32 %l.b, 0570  br i1 %c.1, label %loop.latch, label %loop.then571 572loop.then:573  %l.a = load i32, ptr %gep.a, align 4574  br label %loop.latch575 576loop.latch:577  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]578  call void @llvm.assume(i1 true) [ "align"(ptr %gep.a, i64 4), "dereferenceable"(ptr %gep.a, i64 4) ]579  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv580  store i32 %merge, ptr %gep.c, align 4581  %iv.next = add nuw nsw i64 %iv, 1582  %ec = icmp eq i64 %iv.next, 1000583  br i1 %ec, label %exit, label %loop.header584 585exit:586  ret void587}588 589define void @deref_assumption_in_header_variable_trip_count(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c, i64 %N) nofree nosync{590; CHECK-LABEL: define void @deref_assumption_in_header_variable_trip_count(591; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]], i64 [[N:%.*]]) #[[ATTR1]] {592; CHECK-NEXT:  [[ENTRY:.*:]]593; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2594; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]595; CHECK:       [[VECTOR_PH]]:596; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 2597; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]598; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]599; CHECK:       [[VECTOR_BODY]]:600; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]601; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2]] ]602; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[A]], <2 x i64> [[VEC_IND]]603; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0604; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1605; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[TMP4]], i64 4), "dereferenceable"(ptr [[TMP4]], i64 4) ]606; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[TMP5]], i64 4), "dereferenceable"(ptr [[TMP5]], i64 4) ]607; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]608; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP6]], align 4609; CHECK-NEXT:    [[TMP10:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer610; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <2 x i1> [[TMP10]], i32 0611; CHECK-NEXT:    br i1 [[TMP8]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]612; CHECK:       [[PRED_LOAD_IF]]:613; CHECK-NEXT:    [[TMP21:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0614; CHECK-NEXT:    [[TMP22:%.*]] = load i32, ptr [[TMP21]], align 4615; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <2 x i32> poison, i32 [[TMP22]], i32 0616; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]617; CHECK:       [[PRED_LOAD_CONTINUE]]:618; CHECK-NEXT:    [[TMP12:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP11]], %[[PRED_LOAD_IF]] ]619; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <2 x i1> [[TMP10]], i32 1620; CHECK-NEXT:    br i1 [[TMP13]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]621; CHECK:       [[PRED_LOAD_IF1]]:622; CHECK-NEXT:    [[TMP26:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1623; CHECK-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4624; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <2 x i32> [[TMP12]], i32 [[TMP27]], i32 1625; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]626; CHECK:       [[PRED_LOAD_CONTINUE2]]:627; CHECK-NEXT:    [[TMP14:%.*]] = phi <2 x i32> [ [[TMP12]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP16]], %[[PRED_LOAD_IF1]] ]628; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP10]], <2 x i32> [[TMP14]], <2 x i32> [[WIDE_LOAD]]629; CHECK-NEXT:    [[TMP30:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]630; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP30]], align 4631; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2632; CHECK-NEXT:    [[VEC_IND_NEXT]] = add nuw nsw <2 x i64> [[VEC_IND]], splat (i64 2)633; CHECK-NEXT:    [[TMP32:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]634; CHECK-NEXT:    br i1 [[TMP32]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]635; CHECK:       [[MIDDLE_BLOCK]]:636; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]637; CHECK-NEXT:    br i1 [[CMP_N]], [[EXIT:label %.*]], label %[[SCALAR_PH]]638; CHECK:       [[SCALAR_PH]]:639;640entry:641  br label %loop.header642 643loop.header:644  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]645  %gep.a = getelementptr i32, ptr %a, i64 %iv646  call void @llvm.assume(i1 true) [ "align"(ptr %gep.a, i64 4), "dereferenceable"(ptr %gep.a, i64 4) ]647  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv648  %l.b = load i32, ptr %gep.b, align 4649  %c.1 = icmp sge i32 %l.b, 0650  br i1 %c.1, label %loop.latch, label %loop.then651 652loop.then:653  %l.a = load i32, ptr %gep.a, align 4654  br label %loop.latch655 656loop.latch:657  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]658  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv659  store i32 %merge, ptr %gep.c, align 4660  %iv.next = add nuw nsw i64 %iv, 1661  %ec = icmp eq i64 %iv.next, %N662  br i1 %ec, label %exit, label %loop.header663 664exit:665  ret void666}667 668define void @deref_assumption_in_preheader_constant_trip_count_align_1(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nofree nosync{669; CHECK-LABEL: define void @deref_assumption_in_preheader_constant_trip_count_align_1(670; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {671; CHECK-NEXT:  [[ENTRY:.*:]]672; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[A]], i64 4000) ]673; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]674; CHECK:       [[VECTOR_PH]]:675; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]676; CHECK:       [[VECTOR_BODY]]:677; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]678; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]679; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP1]], align 4680; CHECK-NEXT:    [[TMP3:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer681; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP0]]682; CHECK-NEXT:    [[TMP15:%.*]] = load <2 x i32>, ptr [[TMP6]], align 1683; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[TMP15]]684; CHECK-NEXT:    [[TMP16:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]685; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP16]], align 4686; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2687; CHECK-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000688; CHECK-NEXT:    br i1 [[TMP18]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]689; CHECK:       [[MIDDLE_BLOCK]]:690; CHECK-NEXT:    br label %[[EXIT:.*]]691; CHECK:       [[EXIT]]:692; CHECK-NEXT:    ret void693;694entry:695  call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %a, i64 4000) ]696  br label %loop.header697 698loop.header:699  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]700  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv701  %l.b = load i32, ptr %gep.b, align 4702  %c.1 = icmp sge i32 %l.b, 0703  br i1 %c.1, label %loop.latch, label %loop.then704 705loop.then:706  %gep.a = getelementptr i32, ptr %a, i64 %iv707  %l.a = load i32, ptr %gep.a, align 1708  br label %loop.latch709 710loop.latch:711  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]712  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv713  store i32 %merge, ptr %gep.c, align 4714  %iv.next = add nuw nsw i64 %iv, 1715  %ec = icmp eq i64 %iv.next, 1000716  br i1 %ec, label %exit, label %loop.header717 718exit:719  ret void720}721 722define void @deref_assumption_too_small_in_preheader_constant_trip_count_align_1(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nofree nosync{723; CHECK-LABEL: define void @deref_assumption_too_small_in_preheader_constant_trip_count_align_1(724; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {725; CHECK-NEXT:  [[ENTRY:.*:]]726; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[A]], i64 3999) ]727; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]728; CHECK:       [[VECTOR_PH]]:729; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]730; CHECK:       [[VECTOR_BODY]]:731; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]732; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]733; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP1]], align 4734; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer735; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x i1> [[TMP4]], i32 0736; CHECK-NEXT:    br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]737; CHECK:       [[PRED_LOAD_IF]]:738; CHECK-NEXT:    [[TMP19:%.*]] = add i64 [[TMP0]], 0739; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP19]]740; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 1741; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0742; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]743; CHECK:       [[PRED_LOAD_CONTINUE]]:744; CHECK-NEXT:    [[TMP9:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP8]], %[[PRED_LOAD_IF]] ]745; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1746; CHECK-NEXT:    br i1 [[TMP10]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]747; CHECK:       [[PRED_LOAD_IF1]]:748; CHECK-NEXT:    [[TMP11:%.*]] = add i64 [[TMP0]], 1749; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP11]]750; CHECK-NEXT:    [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 1751; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <2 x i32> [[TMP9]], i32 [[TMP13]], i32 1752; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]753; CHECK:       [[PRED_LOAD_CONTINUE2]]:754; CHECK-NEXT:    [[TMP15:%.*]] = phi <2 x i32> [ [[TMP9]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]755; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP4]], <2 x i32> [[TMP15]], <2 x i32> [[WIDE_LOAD]]756; CHECK-NEXT:    [[TMP16:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]757; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP16]], align 4758; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2759; CHECK-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000760; CHECK-NEXT:    br i1 [[TMP18]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]761; CHECK:       [[MIDDLE_BLOCK]]:762; CHECK-NEXT:    br label %[[EXIT:.*]]763; CHECK:       [[EXIT]]:764; CHECK-NEXT:    ret void765;766entry:767  call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %a, i64 3999) ]768  br label %loop.header769 770loop.header:771  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]772  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv773  %l.b = load i32, ptr %gep.b, align 4774  %c.1 = icmp sge i32 %l.b, 0775  br i1 %c.1, label %loop.latch, label %loop.then776 777loop.then:778  %gep.a = getelementptr i32, ptr %a, i64 %iv779  %l.a = load i32, ptr %gep.a, align 1780  br label %loop.latch781 782loop.latch:783  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]784  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv785  store i32 %merge, ptr %gep.c, align 4786  %iv.next = add nuw nsw i64 %iv, 1787  %ec = icmp eq i64 %iv.next, 1000788  br i1 %ec, label %exit, label %loop.header789 790exit:791  ret void792}793 794define void @align_and_deref_assumption_in_preheader_constant_trip_count_align_4(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nofree nosync{795; CHECK-LABEL: define void @align_and_deref_assumption_in_preheader_constant_trip_count_align_4(796; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {797; CHECK-NEXT:  [[ENTRY:.*:]]798; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 4), "dereferenceable"(ptr [[A]], i64 4000) ]799; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]800; CHECK:       [[VECTOR_PH]]:801; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]802; CHECK:       [[VECTOR_BODY]]:803; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]804; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]805; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP1]], align 4806; CHECK-NEXT:    [[TMP3:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer807; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP0]]808; CHECK-NEXT:    [[WIDE_LOAD1:%.*]] = load <2 x i32>, ptr [[TMP4]], align 4809; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[WIDE_LOAD1]]810; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]811; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP6]], align 4812; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2813; CHECK-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000814; CHECK-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]815; CHECK:       [[MIDDLE_BLOCK]]:816; CHECK-NEXT:    br label %[[EXIT:.*]]817; CHECK:       [[EXIT]]:818; CHECK-NEXT:    ret void819;820entry:821  call void @llvm.assume(i1 true) [ "align"(ptr %a, i64 4), "dereferenceable"(ptr %a, i64 4000) ]822  br label %loop.header823 824loop.header:825  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]826  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv827  %l.b = load i32, ptr %gep.b, align 4828  %c.1 = icmp sge i32 %l.b, 0829  br i1 %c.1, label %loop.latch, label %loop.then830 831loop.then:832  %gep.a = getelementptr i32, ptr %a, i64 %iv833  %l.a = load i32, ptr %gep.a, align 4834  br label %loop.latch835 836loop.latch:837  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]838  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv839  store i32 %merge, ptr %gep.c, align 4840  %iv.next = add nuw nsw i64 %iv, 1841  %ec = icmp eq i64 %iv.next, 1000842  br i1 %ec, label %exit, label %loop.header843 844exit:845  ret void846}847 848 849define void @deref_assumption_in_preheader_constant_trip_count_align_4_known_via_argument_attr(ptr noalias noundef align 4 %a, ptr noalias %b, ptr noalias %c) nofree nosync{850; CHECK-LABEL: define void @deref_assumption_in_preheader_constant_trip_count_align_4_known_via_argument_attr(851; CHECK-SAME: ptr noalias noundef align 4 [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {852; CHECK-NEXT:  [[ENTRY:.*:]]853; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[A]], i64 4000) ]854; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]855; CHECK:       [[VECTOR_PH]]:856; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]857; CHECK:       [[VECTOR_BODY]]:858; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]859; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]860; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP1]], align 4861; CHECK-NEXT:    [[TMP3:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer862; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP0]]863; CHECK-NEXT:    [[TMP15:%.*]] = load <2 x i32>, ptr [[TMP5]], align 4864; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[TMP15]]865; CHECK-NEXT:    [[TMP16:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]866; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP16]], align 4867; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2868; CHECK-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000869; CHECK-NEXT:    br i1 [[TMP18]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]870; CHECK:       [[MIDDLE_BLOCK]]:871; CHECK-NEXT:    br label %[[EXIT:.*]]872; CHECK:       [[EXIT]]:873; CHECK-NEXT:    ret void874;875entry:876  call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %a, i64 4000) ]877  br label %loop.header878 879loop.header:880  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]881  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv882  %l.b = load i32, ptr %gep.b, align 4883  %c.1 = icmp sge i32 %l.b, 0884  br i1 %c.1, label %loop.latch, label %loop.then885 886loop.then:887  %gep.a = getelementptr i32, ptr %a, i64 %iv888  %l.a = load i32, ptr %gep.a, align 4889  br label %loop.latch890 891loop.latch:892  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]893  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv894  store i32 %merge, ptr %gep.c, align 4895  %iv.next = add nuw nsw i64 %iv, 1896  %ec = icmp eq i64 %iv.next, 1000897  br i1 %ec, label %exit, label %loop.header898 899exit:900  ret void901}902 903define void @deref_assumption_in_preheader_constant_trip_count_align_4_not_known(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nofree nosync{904; CHECK-LABEL: define void @deref_assumption_in_preheader_constant_trip_count_align_4_not_known(905; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {906; CHECK-NEXT:  [[ENTRY:.*:]]907; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[A]], i64 4000) ]908; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]909; CHECK:       [[VECTOR_PH]]:910; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]911; CHECK:       [[VECTOR_BODY]]:912; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]913; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]914; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP1]], align 4915; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer916; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x i1> [[TMP4]], i32 0917; CHECK-NEXT:    br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]918; CHECK:       [[PRED_LOAD_IF]]:919; CHECK-NEXT:    [[TMP19:%.*]] = add i64 [[TMP0]], 0920; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP19]]921; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4922; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0923; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]924; CHECK:       [[PRED_LOAD_CONTINUE]]:925; CHECK-NEXT:    [[TMP9:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP8]], %[[PRED_LOAD_IF]] ]926; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1927; CHECK-NEXT:    br i1 [[TMP10]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]928; CHECK:       [[PRED_LOAD_IF1]]:929; CHECK-NEXT:    [[TMP11:%.*]] = add i64 [[TMP0]], 1930; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP11]]931; CHECK-NEXT:    [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4932; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <2 x i32> [[TMP9]], i32 [[TMP13]], i32 1933; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]934; CHECK:       [[PRED_LOAD_CONTINUE2]]:935; CHECK-NEXT:    [[TMP15:%.*]] = phi <2 x i32> [ [[TMP9]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]936; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP4]], <2 x i32> [[TMP15]], <2 x i32> [[WIDE_LOAD]]937; CHECK-NEXT:    [[TMP16:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]938; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP16]], align 4939; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2940; CHECK-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000941; CHECK-NEXT:    br i1 [[TMP18]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]942; CHECK:       [[MIDDLE_BLOCK]]:943; CHECK-NEXT:    br label %[[EXIT:.*]]944; CHECK:       [[EXIT]]:945; CHECK-NEXT:    ret void946;947entry:948  call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %a, i64 4000) ]949  br label %loop.header950 951loop.header:952  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]953  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv954  %l.b = load i32, ptr %gep.b, align 4955  %c.1 = icmp sge i32 %l.b, 0956  br i1 %c.1, label %loop.latch, label %loop.then957 958loop.then:959  %gep.a = getelementptr i32, ptr %a, i64 %iv960  %l.a = load i32, ptr %gep.a, align 4961  br label %loop.latch962 963loop.latch:964  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]965  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv966  store i32 %merge, ptr %gep.c, align 4967  %iv.next = add nuw nsw i64 %iv, 1968  %ec = icmp eq i64 %iv.next, 1000969  br i1 %ec, label %exit, label %loop.header970 971exit:972  ret void973}974 975define void @deref_assumption_too_small_in_preheader_constant_trip_count_align_4(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nofree nosync{976; CHECK-LABEL: define void @deref_assumption_too_small_in_preheader_constant_trip_count_align_4(977; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {978; CHECK-NEXT:  [[ENTRY:.*:]]979; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[A]], i64 3999) ]980; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]981; CHECK:       [[VECTOR_PH]]:982; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]983; CHECK:       [[VECTOR_BODY]]:984; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]985; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]986; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP1]], align 4987; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer988; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x i1> [[TMP4]], i32 0989; CHECK-NEXT:    br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]990; CHECK:       [[PRED_LOAD_IF]]:991; CHECK-NEXT:    [[TMP19:%.*]] = add i64 [[TMP0]], 0992; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP19]]993; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4994; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0995; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]996; CHECK:       [[PRED_LOAD_CONTINUE]]:997; CHECK-NEXT:    [[TMP9:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP8]], %[[PRED_LOAD_IF]] ]998; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1999; CHECK-NEXT:    br i1 [[TMP10]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]1000; CHECK:       [[PRED_LOAD_IF1]]:1001; CHECK-NEXT:    [[TMP11:%.*]] = add i64 [[TMP0]], 11002; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP11]]1003; CHECK-NEXT:    [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 41004; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <2 x i32> [[TMP9]], i32 [[TMP13]], i32 11005; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]1006; CHECK:       [[PRED_LOAD_CONTINUE2]]:1007; CHECK-NEXT:    [[TMP15:%.*]] = phi <2 x i32> [ [[TMP9]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]1008; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP4]], <2 x i32> [[TMP15]], <2 x i32> [[WIDE_LOAD]]1009; CHECK-NEXT:    [[TMP16:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]1010; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP16]], align 41011; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 21012; CHECK-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10001013; CHECK-NEXT:    br i1 [[TMP18]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]1014; CHECK:       [[MIDDLE_BLOCK]]:1015; CHECK-NEXT:    br label %[[EXIT:.*]]1016; CHECK:       [[EXIT]]:1017; CHECK-NEXT:    ret void1018;1019entry:1020  call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %a, i64 3999) ]1021  br label %loop.header1022 1023loop.header:1024  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]1025  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv1026  %l.b = load i32, ptr %gep.b, align 41027  %c.1 = icmp sge i32 %l.b, 01028  br i1 %c.1, label %loop.latch, label %loop.then1029 1030loop.then:1031  %gep.a = getelementptr i32, ptr %a, i64 %iv1032  %l.a = load i32, ptr %gep.a, align 41033  br label %loop.latch1034 1035loop.latch:1036  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]1037  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv1038  store i32 %merge, ptr %gep.c, align 41039  %iv.next = add nuw nsw i64 %iv, 11040  %ec = icmp eq i64 %iv.next, 10001041  br i1 %ec, label %exit, label %loop.header1042 1043exit:1044  ret void1045}1046 1047; %a may be freed between the dereferenceable assumption and accesses.1048define void @may_free_align_deref_assumption_in_header_constant_trip_count_loop_invariant_ptr(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) {1049; CHECK-LABEL: define void @may_free_align_deref_assumption_in_header_constant_trip_count_loop_invariant_ptr(1050; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) {1051; CHECK-NEXT:  [[ENTRY:.*:]]1052; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 4), "dereferenceable"(ptr [[A]], i64 4) ]1053; CHECK-NEXT:    call void @may_free()1054; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]1055; CHECK:       [[VECTOR_PH]]:1056; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]1057; CHECK:       [[VECTOR_BODY]]:1058; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]1059; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]1060; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP1]], align 41061; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer1062; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x i1> [[TMP4]], i32 01063; CHECK-NEXT:    br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]1064; CHECK:       [[PRED_LOAD_IF]]:1065; CHECK-NEXT:    [[TMP15:%.*]] = load i32, ptr [[A]], align 41066; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <2 x i32> poison, i32 [[TMP15]], i32 01067; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]1068; CHECK:       [[PRED_LOAD_CONTINUE]]:1069; CHECK-NEXT:    [[TMP12:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP7]], %[[PRED_LOAD_IF]] ]1070; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <2 x i1> [[TMP4]], i32 11071; CHECK-NEXT:    br i1 [[TMP13]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]1072; CHECK:       [[PRED_LOAD_IF1]]:1073; CHECK-NEXT:    [[TMP14:%.*]] = load i32, ptr [[A]], align 41074; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <2 x i32> [[TMP12]], i32 [[TMP14]], i32 11075; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]1076; CHECK:       [[PRED_LOAD_CONTINUE2]]:1077; CHECK-NEXT:    [[TMP9:%.*]] = phi <2 x i32> [ [[TMP12]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP16]], %[[PRED_LOAD_IF1]] ]1078; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP4]], <2 x i32> [[TMP9]], <2 x i32> [[WIDE_LOAD]]1079; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]1080; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP8]], align 41081; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 21082; CHECK-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10001083; CHECK-NEXT:    br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]1084; CHECK:       [[MIDDLE_BLOCK]]:1085; CHECK-NEXT:    br label %[[EXIT:.*]]1086; CHECK:       [[EXIT]]:1087; CHECK-NEXT:    ret void1088;1089entry:1090  call void @llvm.assume(i1 true) [ "align"(ptr %a, i64 4), "dereferenceable"(ptr %a, i64 4) ]1091  call void @may_free()1092  br label %loop.header1093 1094loop.header:1095  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]1096  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv1097  %l.b = load i32, ptr %gep.b, align 41098  %c.1 = icmp sge i32 %l.b, 01099  br i1 %c.1, label %loop.latch, label %loop.then1100 1101loop.then:1102  %l.a = load i32, ptr %a, align 41103  br label %loop.latch1104 1105loop.latch:1106  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]1107  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv1108  store i32 %merge, ptr %gep.c, align 41109  %iv.next = add nuw nsw i64 %iv, 11110  %ec = icmp eq i64 %iv.next, 10001111  br i1 %ec, label %exit, label %loop.header1112 1113exit:1114  ret void1115}1116 1117; %a may be freed between the dereferenceable assumption and accesses.1118define void @may_free_local_ptr_align_deref_assumption_in_header_constant_trip_count_loop_invariant_ptr(ptr noalias %b, ptr noalias %c) nofree nosync {1119; CHECK-LABEL: define void @may_free_local_ptr_align_deref_assumption_in_header_constant_trip_count_loop_invariant_ptr(1120; CHECK-SAME: ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR1]] {1121; CHECK-NEXT:  [[ENTRY:.*:]]1122; CHECK-NEXT:    [[A:%.*]] = call ptr @get_ptr()1123; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 4), "dereferenceable"(ptr [[A]], i64 4) ]1124; CHECK-NEXT:    call void @may_free()1125; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]1126; CHECK:       [[VECTOR_PH]]:1127; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]1128; CHECK:       [[VECTOR_BODY]]:1129; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]1130; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]1131; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP1]], align 41132; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer1133; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x i1> [[TMP4]], i32 01134; CHECK-NEXT:    br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]1135; CHECK:       [[PRED_LOAD_IF]]:1136; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[A]], align 41137; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <2 x i32> poison, i32 [[TMP6]], i32 01138; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]1139; CHECK:       [[PRED_LOAD_CONTINUE]]:1140; CHECK-NEXT:    [[TMP8:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP7]], %[[PRED_LOAD_IF]] ]1141; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <2 x i1> [[TMP4]], i32 11142; CHECK-NEXT:    br i1 [[TMP9]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]1143; CHECK:       [[PRED_LOAD_IF1]]:1144; CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr [[A]], align 41145; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <2 x i32> [[TMP8]], i32 [[TMP10]], i32 11146; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]1147; CHECK:       [[PRED_LOAD_CONTINUE2]]:1148; CHECK-NEXT:    [[TMP12:%.*]] = phi <2 x i32> [ [[TMP8]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP11]], %[[PRED_LOAD_IF1]] ]1149; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP4]], <2 x i32> [[TMP12]], <2 x i32> [[WIDE_LOAD]]1150; CHECK-NEXT:    [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]1151; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP13]], align 41152; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 21153; CHECK-NEXT:    [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10001154; CHECK-NEXT:    br i1 [[TMP15]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]1155; CHECK:       [[MIDDLE_BLOCK]]:1156; CHECK-NEXT:    br label %[[EXIT:.*]]1157; CHECK:       [[EXIT]]:1158; CHECK-NEXT:    ret void1159;1160entry:1161  %a = call ptr @get_ptr()1162  call void @llvm.assume(i1 true) [ "align"(ptr %a, i64 4), "dereferenceable"(ptr %a, i64 4) ]1163  call void @may_free()1164  br label %loop.header1165 1166loop.header:1167  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]1168  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv1169  %l.b = load i32, ptr %gep.b, align 41170  %c.1 = icmp sge i32 %l.b, 01171  br i1 %c.1, label %loop.latch, label %loop.then1172 1173loop.then:1174  %l.a = load i32, ptr %a, align 41175  br label %loop.latch1176 1177loop.latch:1178  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]1179  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv1180  store i32 %merge, ptr %gep.c, align 41181  %iv.next = add nuw nsw i64 %iv, 11182  %ec = icmp eq i64 %iv.next, 10001183  br i1 %ec, label %exit, label %loop.header1184 1185exit:1186  ret void1187}1188 1189declare ptr @get_ptr()1190declare void @may_free()1191 1192define void @deref_assumption_in_header_constant_trip_count_nofree_via_context(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nosync {1193; CHECK-LABEL: define void @deref_assumption_in_header_constant_trip_count_nofree_via_context(1194; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR2:[0-9]+]] {1195; CHECK-NEXT:  [[ENTRY:.*:]]1196; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 4), "dereferenceable"(ptr [[A]], i64 4000) ]1197; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]1198; CHECK:       [[VECTOR_PH]]:1199; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]1200; CHECK:       [[VECTOR_BODY]]:1201; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1202; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]1203; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]1204; CHECK-NEXT:    [[WIDE_LOAD1:%.*]] = load <2 x i32>, ptr [[TMP0]], align 41205; CHECK-NEXT:    [[TMP2:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD1]], zeroinitializer1206; CHECK-NEXT:    [[WIDE_LOAD2:%.*]] = load <2 x i32>, ptr [[TMP1]], align 41207; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP2]], <2 x i32> [[WIDE_LOAD1]], <2 x i32> [[WIDE_LOAD2]]1208; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[INDEX]]1209; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP14]], align 41210; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 21211; CHECK-NEXT:    [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10001212; CHECK-NEXT:    br i1 [[TMP15]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]1213; CHECK:       [[MIDDLE_BLOCK]]:1214; CHECK-NEXT:    br label %[[EXIT:.*]]1215; CHECK:       [[EXIT]]:1216; CHECK-NEXT:    ret void1217;1218entry:1219  call void @llvm.assume(i1 true) [ "align"(ptr %a, i64 4), "dereferenceable"(ptr %a, i64 4000) ]1220  br label %loop.header1221 1222loop.header:1223  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]1224  %gep.a = getelementptr i32, ptr %a, i64 %iv1225  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv1226  %l.b = load i32, ptr %gep.b, align 41227  %c.1 = icmp sge i32 %l.b, 01228  br i1 %c.1, label %loop.latch, label %loop.then1229 1230loop.then:1231  %l.a = load i32, ptr %gep.a, align 41232  br label %loop.latch1233 1234loop.latch:1235  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]1236  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv1237  store i32 %merge, ptr %gep.c, align 41238  %iv.next = add nuw nsw i64 %iv, 11239  %ec = icmp eq i64 %iv.next, 10001240  br i1 %ec, label %exit, label %loop.header1241 1242exit:1243  ret void1244}1245 1246define void @deref_assumption_in_header_constant_trip_count_may_free(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) nosync {1247; CHECK-LABEL: define void @deref_assumption_in_header_constant_trip_count_may_free(1248; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) #[[ATTR2]] {1249; CHECK-NEXT:  [[ENTRY:.*:]]1250; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 4), "dereferenceable"(ptr [[A]], i64 4000) ]1251; CHECK-NEXT:    call void @may_free()1252; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]1253; CHECK:       [[VECTOR_PH]]:1254; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]1255; CHECK:       [[VECTOR_BODY]]:1256; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]1257; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]1258; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP3]], align 41259; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer1260; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x i1> [[TMP4]], i32 01261; CHECK-NEXT:    br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]1262; CHECK:       [[PRED_LOAD_IF]]:1263; CHECK-NEXT:    [[TMP17:%.*]] = add i64 [[INDEX]], 01264; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP17]]1265; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 41266; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 01267; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]1268; CHECK:       [[PRED_LOAD_CONTINUE]]:1269; CHECK-NEXT:    [[TMP9:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP8]], %[[PRED_LOAD_IF]] ]1270; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <2 x i1> [[TMP4]], i32 11271; CHECK-NEXT:    br i1 [[TMP10]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]1272; CHECK:       [[PRED_LOAD_IF1]]:1273; CHECK-NEXT:    [[TMP18:%.*]] = add i64 [[INDEX]], 11274; CHECK-NEXT:    [[TMP11:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP18]]1275; CHECK-NEXT:    [[TMP12:%.*]] = load i32, ptr [[TMP11]], align 41276; CHECK-NEXT:    [[TMP13:%.*]] = insertelement <2 x i32> [[TMP9]], i32 [[TMP12]], i32 11277; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]1278; CHECK:       [[PRED_LOAD_CONTINUE2]]:1279; CHECK-NEXT:    [[TMP14:%.*]] = phi <2 x i32> [ [[TMP9]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP13]], %[[PRED_LOAD_IF1]] ]1280; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP4]], <2 x i32> [[TMP14]], <2 x i32> [[WIDE_LOAD]]1281; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[INDEX]]1282; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP15]], align 41283; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 21284; CHECK-NEXT:    [[TMP16:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10001285; CHECK-NEXT:    br i1 [[TMP16]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]1286; CHECK:       [[MIDDLE_BLOCK]]:1287; CHECK-NEXT:    br label %[[EXIT:.*]]1288; CHECK:       [[EXIT]]:1289; CHECK-NEXT:    ret void1290;1291entry:1292  call void @llvm.assume(i1 true) [ "align"(ptr %a, i64 4), "dereferenceable"(ptr %a, i64 4000) ]1293  call void @may_free()1294  br label %loop.header1295 1296loop.header:1297  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]1298  %gep.a = getelementptr i32, ptr %a, i64 %iv1299  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv1300  %l.b = load i32, ptr %gep.b, align 41301  %c.1 = icmp sge i32 %l.b, 01302  br i1 %c.1, label %loop.latch, label %loop.then1303 1304loop.then:1305  %l.a = load i32, ptr %gep.a, align 41306  br label %loop.latch1307 1308loop.latch:1309  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]1310  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv1311  store i32 %merge, ptr %gep.c, align 41312  %iv.next = add nuw nsw i64 %iv, 11313  %ec = icmp eq i64 %iv.next, 10001314  br i1 %ec, label %exit, label %loop.header1315 1316exit:1317  ret void1318}1319 1320define void @deref_assumption_in_header_constant_trip_count_nofree_via_context_but_missing_nosync(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c) {1321; CHECK-LABEL: define void @deref_assumption_in_header_constant_trip_count_nofree_via_context_but_missing_nosync(1322; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) {1323; CHECK-NEXT:  [[ENTRY:.*:]]1324; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 4), "dereferenceable"(ptr [[A]], i64 4000) ]1325; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]1326; CHECK:       [[VECTOR_PH]]:1327; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]1328; CHECK:       [[VECTOR_BODY]]:1329; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]1330; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]1331; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP0]], align 41332; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer1333; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x i1> [[TMP1]], i32 01334; CHECK-NEXT:    br i1 [[TMP2]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]1335; CHECK:       [[PRED_LOAD_IF]]:1336; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[INDEX]], 01337; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP3]]1338; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 41339; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i32> poison, i32 [[TMP5]], i32 01340; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]1341; CHECK:       [[PRED_LOAD_CONTINUE]]:1342; CHECK-NEXT:    [[TMP7:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP6]], %[[PRED_LOAD_IF]] ]1343; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <2 x i1> [[TMP1]], i32 11344; CHECK-NEXT:    br i1 [[TMP8]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]1345; CHECK:       [[PRED_LOAD_IF1]]:1346; CHECK-NEXT:    [[TMP9:%.*]] = add i64 [[INDEX]], 11347; CHECK-NEXT:    [[TMP10:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP9]]1348; CHECK-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 41349; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <2 x i32> [[TMP7]], i32 [[TMP11]], i32 11350; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]1351; CHECK:       [[PRED_LOAD_CONTINUE2]]:1352; CHECK-NEXT:    [[TMP13:%.*]] = phi <2 x i32> [ [[TMP7]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP12]], %[[PRED_LOAD_IF1]] ]1353; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP1]], <2 x i32> [[TMP13]], <2 x i32> [[WIDE_LOAD]]1354; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[INDEX]]1355; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP14]], align 41356; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 21357; CHECK-NEXT:    [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10001358; CHECK-NEXT:    br i1 [[TMP15]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]1359; CHECK:       [[MIDDLE_BLOCK]]:1360; CHECK-NEXT:    br label %[[EXIT:.*]]1361; CHECK:       [[EXIT]]:1362; CHECK-NEXT:    ret void1363;1364entry:1365  call void @llvm.assume(i1 true) [ "align"(ptr %a, i64 4), "dereferenceable"(ptr %a, i64 4000) ]1366  br label %loop.header1367 1368loop.header:1369  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]1370  %gep.a = getelementptr i32, ptr %a, i64 %iv1371  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv1372  %l.b = load i32, ptr %gep.b, align 41373  %c.1 = icmp sge i32 %l.b, 01374  br i1 %c.1, label %loop.latch, label %loop.then1375 1376loop.then:1377  %l.a = load i32, ptr %gep.a, align 41378  br label %loop.latch1379 1380loop.latch:1381  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]1382  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv1383  store i32 %merge, ptr %gep.c, align 41384  %iv.next = add nuw nsw i64 %iv, 11385  %ec = icmp eq i64 %iv.next, 10001386  br i1 %ec, label %exit, label %loop.header1387 1388exit:1389  ret void1390}1391 1392define void @deref_assumption_in_header_constant_trip_count_multiple_loop_predecessors(ptr noalias noundef %a, ptr noalias %b, ptr noalias %c, i1 %pre) nosync {1393; CHECK-LABEL: define void @deref_assumption_in_header_constant_trip_count_multiple_loop_predecessors(1394; CHECK-SAME: ptr noalias noundef [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]], i1 [[PRE:%.*]]) #[[ATTR2]] {1395; CHECK-NEXT:  [[ENTRY:.*:]]1396; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 4), "dereferenceable"(ptr [[A]], i64 4000) ]1397; CHECK-NEXT:    br i1 [[PRE]], label %[[THEN:.*]], label %[[ELSE:.*]]1398; CHECK:       [[THEN]]:1399; CHECK-NEXT:    store i32 0, ptr [[A]], align 41400; CHECK-NEXT:    br label %[[LOOP_HEADER_PREHEADER:.*]]1401; CHECK:       [[ELSE]]:1402; CHECK-NEXT:    store i32 0, ptr [[B]], align 41403; CHECK-NEXT:    br label %[[LOOP_HEADER_PREHEADER]]1404; CHECK:       [[LOOP_HEADER_PREHEADER]]:1405; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]1406; CHECK:       [[VECTOR_PH]]:1407; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]1408; CHECK:       [[VECTOR_BODY]]:1409; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]1410; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDEX]]1411; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP0]], align 41412; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt <2 x i32> [[WIDE_LOAD]], zeroinitializer1413; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x i1> [[TMP1]], i32 01414; CHECK-NEXT:    br i1 [[TMP2]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]1415; CHECK:       [[PRED_LOAD_IF]]:1416; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[INDEX]], 01417; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP3]]1418; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 41419; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i32> poison, i32 [[TMP5]], i32 01420; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE]]1421; CHECK:       [[PRED_LOAD_CONTINUE]]:1422; CHECK-NEXT:    [[TMP7:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP6]], %[[PRED_LOAD_IF]] ]1423; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <2 x i1> [[TMP1]], i32 11424; CHECK-NEXT:    br i1 [[TMP8]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]1425; CHECK:       [[PRED_LOAD_IF1]]:1426; CHECK-NEXT:    [[TMP9:%.*]] = add i64 [[INDEX]], 11427; CHECK-NEXT:    [[TMP10:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP9]]1428; CHECK-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 41429; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <2 x i32> [[TMP7]], i32 [[TMP11]], i32 11430; CHECK-NEXT:    br label %[[PRED_LOAD_CONTINUE2]]1431; CHECK:       [[PRED_LOAD_CONTINUE2]]:1432; CHECK-NEXT:    [[TMP13:%.*]] = phi <2 x i32> [ [[TMP7]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP12]], %[[PRED_LOAD_IF1]] ]1433; CHECK-NEXT:    [[PREDPHI:%.*]] = select <2 x i1> [[TMP1]], <2 x i32> [[TMP13]], <2 x i32> [[WIDE_LOAD]]1434; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[INDEX]]1435; CHECK-NEXT:    store <2 x i32> [[PREDPHI]], ptr [[TMP14]], align 41436; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 21437; CHECK-NEXT:    [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10001438; CHECK-NEXT:    br i1 [[TMP15]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]]1439; CHECK:       [[MIDDLE_BLOCK]]:1440; CHECK-NEXT:    br label %[[EXIT:.*]]1441; CHECK:       [[EXIT]]:1442; CHECK-NEXT:    ret void1443;1444entry:1445  call void @llvm.assume(i1 true) [ "align"(ptr %a, i64 4), "dereferenceable"(ptr %a, i64 4000) ]1446  br i1 %pre, label %then, label %else1447 1448then:1449  store i32 0, ptr %a1450  br label %loop.header1451 1452else:1453  store i32 0, ptr %b1454  br label %loop.header1455 1456loop.header:1457  %iv = phi i64 [ 0, %then ], [ 0, %else ], [ %iv.next, %loop.latch ]1458  %gep.a = getelementptr i32, ptr %a, i64 %iv1459  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv1460  %l.b = load i32, ptr %gep.b, align 41461  %c.1 = icmp sge i32 %l.b, 01462  br i1 %c.1, label %loop.latch, label %loop.then1463 1464loop.then:1465  %l.a = load i32, ptr %gep.a, align 41466  br label %loop.latch1467 1468loop.latch:1469  %merge = phi i32 [ %l.a, %loop.then ], [ %l.b, %loop.header ]1470  %gep.c = getelementptr inbounds i32, ptr %c, i64 %iv1471  store i32 %merge, ptr %gep.c, align 41472  %iv.next = add nuw nsw i64 %iv, 11473  %ec = icmp eq i64 %iv.next, 10001474  br i1 %ec, label %exit, label %loop.header1475 1476exit:1477  ret void1478}1479 1480 1481