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