1345 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --replace-value-regex "!llvm.loop ![0-9]+" --version 52; RUN: opt -S -passes=loop-vectorize -force-vector-interleave=1 -force-vector-width=2 < %s | FileCheck --check-prefixes=CHECK,VEC %s3; RUN: opt -S -passes=loop-vectorize -force-vector-interleave=2 -force-vector-width=1 < %s | FileCheck --check-prefixes=CHECK,INTERLEAVE %s4 5define i32 @postinc(i32 %k) {6; CHECK-LABEL: define i32 @postinc(7; CHECK-SAME: i32 [[K:%.*]]) {8; CHECK-NEXT: [[ENTRY:.*]]:9; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 210; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]11; CHECK: [[VECTOR_PH]]:12; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[K]], 213; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]14; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]15; CHECK: [[VECTOR_BODY]]:16; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]17; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 218; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]19; CHECK-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}20; CHECK: [[MIDDLE_BLOCK]]:21; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]22; CHECK-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]23; CHECK: [[SCALAR_PH]]:24; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]25; CHECK-NEXT: br label %[[FOR_BODY:.*]]26; CHECK: [[FOR_BODY]]:27; CHECK-NEXT: [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]28; CHECK-NEXT: [[INC]] = add nsw i32 [[INC_PHI]], 129; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]30; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}31; CHECK: [[FOR_END]]:32; CHECK-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ [[N_VEC]], %[[MIDDLE_BLOCK]] ]33; CHECK-NEXT: ret i32 [[INC_LCSSA]]34;35entry:36 br label %for.body37 38for.body:39 %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]40 %inc = add nsw i32 %inc.phi, 141 %cmp = icmp eq i32 %inc, %k42 br i1 %cmp, label %for.end, label %for.body43 44for.end:45 ret i32 %inc46}47 48define i32 @preinc(i32 %k) {49; CHECK-LABEL: define i32 @preinc(50; CHECK-SAME: i32 [[K:%.*]]) {51; CHECK-NEXT: [[ENTRY:.*]]:52; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 253; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]54; CHECK: [[VECTOR_PH]]:55; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[K]], 256; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]57; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]58; CHECK: [[VECTOR_BODY]]:59; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]60; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 261; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]62; CHECK-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}63; CHECK: [[MIDDLE_BLOCK]]:64; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]65; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i32 [[N_VEC]], 166; CHECK-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]67; CHECK: [[SCALAR_PH]]:68; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]69; CHECK-NEXT: br label %[[FOR_BODY:.*]]70; CHECK: [[FOR_BODY]]:71; CHECK-NEXT: [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]72; CHECK-NEXT: [[INC]] = add nsw i32 [[INC_PHI]], 173; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]74; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}75; CHECK: [[FOR_END]]:76; CHECK-NEXT: [[INC_PHI_LCSSA:%.*]] = phi i32 [ [[INC_PHI]], %[[FOR_BODY]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ]77; CHECK-NEXT: ret i32 [[INC_PHI_LCSSA]]78;79entry:80 br label %for.body81 82for.body:83 %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]84 %inc = add nsw i32 %inc.phi, 185 %cmp = icmp eq i32 %inc, %k86 br i1 %cmp, label %for.end, label %for.body87 88for.end:89 ret i32 %inc.phi90}91 92define i32 @constpre() {93; CHECK-LABEL: define i32 @constpre() {94; CHECK-NEXT: [[ENTRY:.*:]]95; CHECK-NEXT: br label %[[VECTOR_PH:.*]]96; CHECK: [[VECTOR_PH]]:97; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]98; CHECK: [[VECTOR_BODY]]:99; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]100; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2101; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], 16102; CHECK-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}103; CHECK: [[MIDDLE_BLOCK]]:104; CHECK-NEXT: br label %[[FOR_END:.*]]105; CHECK: [[FOR_END]]:106; CHECK-NEXT: ret i32 2107;108entry:109 br label %for.body110 111for.body:112 %inc.phi = phi i32 [ 32, %entry ], [ %inc, %for.body ]113 %inc = sub nsw i32 %inc.phi, 2114 %cmp = icmp eq i32 %inc, 0115 br i1 %cmp, label %for.end, label %for.body116 117for.end:118 ret i32 %inc.phi119}120 121define ptr @geppre(ptr %ptr) {122; CHECK-LABEL: define ptr @geppre(123; CHECK-SAME: ptr [[PTR:%.*]]) {124; CHECK-NEXT: [[ENTRY:.*:]]125; CHECK-NEXT: br label %[[VECTOR_PH:.*]]126; CHECK: [[VECTOR_PH]]:127; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[PTR]], i64 512128; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]129; CHECK: [[VECTOR_BODY]]:130; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]131; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2132; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[INDEX_NEXT]], 32133; CHECK-NEXT: br i1 [[TMP1]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}134; CHECK: [[MIDDLE_BLOCK]]:135; CHECK-NEXT: [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[TMP0]], i64 -16136; CHECK-NEXT: br label %[[FOR_END:.*]]137; CHECK: [[FOR_END]]:138; CHECK-NEXT: ret ptr [[IND_ESCAPE]]139;140entry:141 br label %for.body142 143for.body:144 %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]145 %ptr.phi = phi ptr [ %ptr, %entry ], [ %inc.ptr, %for.body ]146 %inc = add nsw i32 %inc.phi, 1147 %inc.ptr = getelementptr i32, ptr %ptr.phi, i32 4148 %cmp = icmp eq i32 %inc, 32149 br i1 %cmp, label %for.end, label %for.body150 151for.end:152 ret ptr %ptr.phi153}154 155define ptr @both(ptr %p, i32 %k) {156; VEC-LABEL: define ptr @both(157; VEC-SAME: ptr [[P:%.*]], i32 [[K:%.*]]) {158; VEC-NEXT: [[ENTRY:.*]]:159; VEC-NEXT: [[BASE:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 1160; VEC-NEXT: [[TMP0:%.*]] = add i32 [[K]], -1161; VEC-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64162; VEC-NEXT: [[TMP2:%.*]] = add nuw nsw i64 [[TMP1]], 1163; VEC-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP2]], 2164; VEC-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]165; VEC: [[VECTOR_PH]]:166; VEC-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP2]], 2167; VEC-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP2]], [[N_MOD_VF]]168; VEC-NEXT: [[TMP3:%.*]] = trunc i64 [[N_VEC]] to i32169; VEC-NEXT: [[TMP4:%.*]] = mul i64 [[N_VEC]], 4170; VEC-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[TMP4]]171; VEC-NEXT: br label %[[VECTOR_BODY:.*]]172; VEC: [[VECTOR_BODY]]:173; VEC-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]174; VEC-NEXT: [[POINTER_PHI:%.*]] = phi ptr [ [[BASE]], %[[VECTOR_PH]] ], [ [[PTR_IND:%.*]], %[[VECTOR_BODY]] ]175; VEC-NEXT: [[VECTOR_GEP:%.*]] = getelementptr i8, ptr [[POINTER_PHI]], <2 x i64> <i64 0, i64 4>176; VEC-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2177; VEC-NEXT: [[PTR_IND]] = getelementptr i8, ptr [[POINTER_PHI]], i64 8178; VEC-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]179; VEC-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}180; VEC: [[MIDDLE_BLOCK]]:181; VEC-NEXT: [[VECTOR_RECUR_EXTRACT:%.*]] = extractelement <2 x ptr> [[VECTOR_GEP]], i32 1182; VEC-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP2]], [[N_VEC]]183; VEC-NEXT: [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[TMP5]], i64 -4184; VEC-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]185; VEC: [[SCALAR_PH]]:186; VEC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[TMP3]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]187; VEC-NEXT: [[BC_RESUME_VAL1:%.*]] = phi ptr [ [[TMP5]], %[[MIDDLE_BLOCK]] ], [ [[BASE]], %[[ENTRY]] ]188; VEC-NEXT: [[SCALAR_RECUR_INIT:%.*]] = phi ptr [ [[VECTOR_RECUR_EXTRACT]], %[[MIDDLE_BLOCK]] ], [ [[BASE]], %[[ENTRY]] ]189; VEC-NEXT: br label %[[FOR_BODY:.*]]190; VEC: [[FOR_BODY]]:191; VEC-NEXT: [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]192; VEC-NEXT: [[INC_LAG1:%.*]] = phi ptr [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[TMP:%.*]], %[[FOR_BODY]] ]193; VEC-NEXT: [[INC_LAG2:%.*]] = phi ptr [ [[SCALAR_RECUR_INIT]], %[[SCALAR_PH]] ], [ [[INC_LAG1]], %[[FOR_BODY]] ]194; VEC-NEXT: [[TMP]] = getelementptr inbounds i32, ptr [[INC_LAG1]], i64 1195; VEC-NEXT: [[INC]] = add nsw i32 [[INC_PHI]], 1196; VEC-NEXT: [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]197; VEC-NEXT: br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}198; VEC: [[FOR_END]]:199; VEC-NEXT: [[INC_LAG1_LCSSA:%.*]] = phi ptr [ [[INC_LAG1]], %[[FOR_BODY]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ]200; VEC-NEXT: ret ptr [[INC_LAG1_LCSSA]]201;202; INTERLEAVE-LABEL: define ptr @both(203; INTERLEAVE-SAME: ptr [[P:%.*]], i32 [[K:%.*]]) {204; INTERLEAVE-NEXT: [[ENTRY:.*]]:205; INTERLEAVE-NEXT: [[BASE:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 1206; INTERLEAVE-NEXT: [[TMP0:%.*]] = add i32 [[K]], -1207; INTERLEAVE-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64208; INTERLEAVE-NEXT: [[TMP2:%.*]] = add nuw nsw i64 [[TMP1]], 1209; INTERLEAVE-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP2]], 2210; INTERLEAVE-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]211; INTERLEAVE: [[VECTOR_PH]]:212; INTERLEAVE-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP2]], 2213; INTERLEAVE-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP2]], [[N_MOD_VF]]214; INTERLEAVE-NEXT: [[TMP3:%.*]] = trunc i64 [[N_VEC]] to i32215; INTERLEAVE-NEXT: [[TMP6:%.*]] = mul i64 [[N_VEC]], 4216; INTERLEAVE-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[TMP6]]217; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]218; INTERLEAVE: [[VECTOR_BODY]]:219; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]220; INTERLEAVE-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 4221; INTERLEAVE-NEXT: [[TMP8:%.*]] = add i64 [[OFFSET_IDX]], 4222; INTERLEAVE-NEXT: [[NEXT_GEP1:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[TMP8]]223; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2224; INTERLEAVE-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]225; INTERLEAVE-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}226; INTERLEAVE: [[MIDDLE_BLOCK]]:227; INTERLEAVE-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP2]], [[N_VEC]]228; INTERLEAVE-NEXT: [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[NEXT_GEP]], i64 -4229; INTERLEAVE-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]230; INTERLEAVE: [[SCALAR_PH]]:231; INTERLEAVE-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[TMP3]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]232; INTERLEAVE-NEXT: [[BC_RESUME_VAL1:%.*]] = phi ptr [ [[NEXT_GEP]], %[[MIDDLE_BLOCK]] ], [ [[BASE]], %[[ENTRY]] ]233; INTERLEAVE-NEXT: [[SCALAR_RECUR_INIT:%.*]] = phi ptr [ [[NEXT_GEP1]], %[[MIDDLE_BLOCK]] ], [ [[BASE]], %[[ENTRY]] ]234; INTERLEAVE-NEXT: br label %[[FOR_BODY:.*]]235; INTERLEAVE: [[FOR_BODY]]:236; INTERLEAVE-NEXT: [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]237; INTERLEAVE-NEXT: [[INC_LAG1:%.*]] = phi ptr [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[TMP:%.*]], %[[FOR_BODY]] ]238; INTERLEAVE-NEXT: [[INC_LAG2:%.*]] = phi ptr [ [[SCALAR_RECUR_INIT]], %[[SCALAR_PH]] ], [ [[INC_LAG1]], %[[FOR_BODY]] ]239; INTERLEAVE-NEXT: [[TMP]] = getelementptr inbounds i32, ptr [[INC_LAG1]], i64 1240; INTERLEAVE-NEXT: [[INC]] = add nsw i32 [[INC_PHI]], 1241; INTERLEAVE-NEXT: [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]242; INTERLEAVE-NEXT: br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}243; INTERLEAVE: [[FOR_END]]:244; INTERLEAVE-NEXT: [[INC_LAG1_LCSSA:%.*]] = phi ptr [ [[INC_LAG1]], %[[FOR_BODY]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ]245; INTERLEAVE-NEXT: ret ptr [[INC_LAG1_LCSSA]]246;247entry:248 %base = getelementptr inbounds i32, ptr %p, i64 1249 br label %for.body250 251for.body:252 %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]253 %inc.lag1 = phi ptr [ %base, %entry ], [ %tmp, %for.body]254 %inc.lag2 = phi ptr [ %base, %entry ], [ %inc.lag1, %for.body]255 %tmp = getelementptr inbounds i32, ptr %inc.lag1, i64 1256 %inc = add nsw i32 %inc.phi, 1257 %cmp = icmp eq i32 %inc, %k258 br i1 %cmp, label %for.end, label %for.body259 260for.end:261 ret ptr %inc.lag1262}263 264define i32 @multiphi(i32 %k, ptr %p) {265; CHECK-LABEL: define i32 @multiphi(266; CHECK-SAME: i32 [[K:%.*]], ptr [[P:%.*]]) {267; CHECK-NEXT: [[ENTRY:.*]]:268; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2269; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]270; CHECK: [[VECTOR_PH]]:271; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[K]], 2272; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]273; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]274; CHECK: [[VECTOR_BODY]]:275; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]276; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2277; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]278; CHECK-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}279; CHECK: [[MIDDLE_BLOCK]]:280; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]281; CHECK-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]282; CHECK: [[SCALAR_PH]]:283; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]284; CHECK-NEXT: br label %[[FOR_BODY:.*]]285; CHECK: [[FOR_BODY]]:286; CHECK-NEXT: [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]287; CHECK-NEXT: [[INC]] = add nsw i32 [[INC_PHI]], 1288; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]289; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}290; CHECK: [[FOR_END]]:291; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ [[N_VEC]], %[[MIDDLE_BLOCK]] ]292; CHECK-NEXT: [[PHI2:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ [[N_VEC]], %[[MIDDLE_BLOCK]] ]293; CHECK-NEXT: store i32 [[PHI2]], ptr [[P]], align 4294; CHECK-NEXT: ret i32 [[PHI]]295;296entry:297 br label %for.body298 299for.body:300 %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]301 %inc = add nsw i32 %inc.phi, 1302 %cmp = icmp eq i32 %inc, %k303 br i1 %cmp, label %for.end, label %for.body304 305for.end:306 %phi = phi i32 [ %inc, %for.body ]307 %phi2 = phi i32 [ %inc, %for.body ]308 store i32 %phi2, ptr %p309 ret i32 %phi310}311 312define void @PR30742(ptr %p) {313; CHECK-LABEL: define void @PR30742(314; CHECK-SAME: ptr [[P:%.*]]) {315; CHECK-NEXT: [[BB0:.*:]]316; CHECK-NEXT: br label %[[BB1:.*]]317; CHECK: [[BB1_LOOPEXIT:.*]]:318; CHECK-NEXT: br label %[[BB1]]319; CHECK: [[BB1]]:320; CHECK-NEXT: [[TMP00:%.*]] = load i32, ptr [[P]], align 16321; CHECK-NEXT: [[TMP01:%.*]] = sub i32 [[TMP00]], 3322; CHECK-NEXT: [[TMP02:%.*]] = icmp slt i32 [[TMP01]], 1323; CHECK-NEXT: [[TMP03:%.*]] = select i1 [[TMP02]], i32 1, i32 [[TMP01]]324; CHECK-NEXT: [[TMP04:%.*]] = add nsw i32 [[TMP03]], -7325; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[TMP03]], -8326; CHECK-NEXT: [[TMP1:%.*]] = add nsw i32 [[TMP03]], -15327; CHECK-NEXT: [[SMIN1:%.*]] = call i32 @llvm.smin.i32(i32 [[TMP1]], i32 0)328; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[TMP0]], [[SMIN1]]329; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[TMP2]], 3330; CHECK-NEXT: [[TMP4:%.*]] = add nuw nsw i32 [[TMP3]], 1331; CHECK-NEXT: [[MIN_ITERS_CHECK4:%.*]] = icmp ult i32 [[TMP4]], 2332; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK4]], label %[[SCALAR_PH2:.*]], label %[[VECTOR_PH4:.*]]333; CHECK: [[VECTOR_PH4]]:334; CHECK-NEXT: [[N_MOD_VF6:%.*]] = urem i32 [[TMP4]], 2335; CHECK-NEXT: [[N_VEC7:%.*]] = sub i32 [[TMP4]], [[N_MOD_VF6]]336; CHECK-NEXT: [[TMP5:%.*]] = mul i32 [[N_VEC7]], -8337; CHECK-NEXT: [[IND_END8:%.*]] = add i32 [[TMP04]], [[TMP5]]338; CHECK-NEXT: br label %[[VECTOR_BODY7:.*]]339; CHECK: [[VECTOR_BODY7]]:340; CHECK-NEXT: [[INDEX10:%.*]] = phi i32 [ 0, %[[VECTOR_PH4]] ], [ [[INDEX_NEXT11:%.*]], %[[VECTOR_BODY7]] ]341; CHECK-NEXT: [[INDEX_NEXT11]] = add nuw i32 [[INDEX10]], 2342; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT11]], [[N_VEC7]]343; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK10:.*]], label %[[VECTOR_BODY7]], {{!llvm.loop ![0-9]+}}344; CHECK: [[MIDDLE_BLOCK10]]:345; CHECK-NEXT: [[CMP_N12:%.*]] = icmp eq i32 [[TMP4]], [[N_VEC7]]346; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i32 [[IND_END8]], -8347; CHECK-NEXT: br i1 [[CMP_N12]], label %[[BB3:.*]], label %[[SCALAR_PH2]]348; CHECK: [[SCALAR_PH2]]:349; CHECK-NEXT: [[BC_RESUME_VAL12:%.*]] = phi i32 [ [[IND_END8]], %[[MIDDLE_BLOCK10]] ], [ [[TMP04]], %[[BB1]] ]350; CHECK-NEXT: br label %[[BB2:.*]]351; CHECK: [[BB2]]:352; CHECK-NEXT: [[TMP05:%.*]] = phi i32 [ [[BC_RESUME_VAL12]], %[[SCALAR_PH2]] ], [ [[TMP06:%.*]], %[[BB2]] ]353; CHECK-NEXT: [[TMP06]] = add i32 [[TMP05]], -8354; CHECK-NEXT: [[TMP07:%.*]] = icmp sgt i32 [[TMP06]], 0355; CHECK-NEXT: br i1 [[TMP07]], label %[[BB2]], label %[[BB3]], {{!llvm.loop ![0-9]+}}356; CHECK: [[BB3]]:357; CHECK-NEXT: [[TMP08:%.*]] = phi i32 [ [[TMP05]], %[[BB2]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK10]] ]358; CHECK-NEXT: [[TMP09:%.*]] = sub i32 [[TMP00]], 4359; CHECK-NEXT: [[TMP10:%.*]] = icmp slt i32 [[TMP09]], 1360; CHECK-NEXT: [[TMP11:%.*]] = select i1 [[TMP10]], i32 1, i32 [[TMP09]]361; CHECK-NEXT: [[TMP12:%.*]] = add nsw i32 [[TMP11]], -7362; CHECK-NEXT: [[TMP7:%.*]] = add i32 [[TMP11]], -8363; CHECK-NEXT: [[TMP8:%.*]] = add nsw i32 [[TMP11]], -15364; CHECK-NEXT: [[SMIN:%.*]] = call i32 @llvm.smin.i32(i32 [[TMP8]], i32 0)365; CHECK-NEXT: [[TMP10:%.*]] = sub i32 [[TMP7]], [[SMIN]]366; CHECK-NEXT: [[TMP11:%.*]] = lshr i32 [[TMP10]], 3367; CHECK-NEXT: [[TMP14:%.*]] = add nuw nsw i32 [[TMP11]], 1368; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[TMP14]], 2369; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]370; CHECK: [[VECTOR_PH]]:371; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[TMP14]], 2372; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[TMP14]], [[N_MOD_VF]]373; CHECK-NEXT: [[TMP16:%.*]] = mul i32 [[N_VEC]], -8374; CHECK-NEXT: [[IND_END:%.*]] = add i32 [[TMP12]], [[TMP16]]375; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]376; CHECK: [[VECTOR_BODY]]:377; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]378; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2379; CHECK-NEXT: [[TMP13:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]380; CHECK-NEXT: br i1 [[TMP13]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}381; CHECK: [[MIDDLE_BLOCK]]:382; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[TMP14]], [[N_VEC]]383; CHECK-NEXT: br i1 [[CMP_N]], label %[[BB1_LOOPEXIT]], label %[[SCALAR_PH]]384; CHECK: [[SCALAR_PH]]:385; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[IND_END]], %[[MIDDLE_BLOCK]] ], [ [[TMP12]], %[[BB3]] ]386; CHECK-NEXT: br label %[[BB4:.*]]387; CHECK: [[BB4]]:388; CHECK-NEXT: [[TMP16:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IND_END:%.*]], %[[BB4]] ]389; CHECK-NEXT: [[IND_END]] = add i32 [[TMP16]], -8390; CHECK-NEXT: [[TMP13:%.*]] = icmp sgt i32 [[IND_END]], 0391; CHECK-NEXT: br i1 [[TMP13]], label %[[BB4]], label %[[BB1_LOOPEXIT]], {{!llvm.loop ![0-9]+}}392;393BB0:394 br label %BB1395 396BB1:397 %tmp00 = load i32, ptr %p, align 16398 %tmp01 = sub i32 %tmp00, 3399 %tmp02 = icmp slt i32 %tmp01, 1400 %tmp03 = select i1 %tmp02, i32 1, i32 %tmp01401 %tmp04 = add nsw i32 %tmp03, -7402 br label %BB2403 404BB2:405 %tmp05 = phi i32 [ %tmp04, %BB1 ], [ %tmp06, %BB2 ]406 %tmp06 = add i32 %tmp05, -8407 %tmp07 = icmp sgt i32 %tmp06, 0408 br i1 %tmp07, label %BB2, label %BB3409 410BB3:411 %tmp08 = phi i32 [ %tmp05, %BB2 ]412 %tmp09 = sub i32 %tmp00, 4413 %tmp10 = icmp slt i32 %tmp09, 1414 %tmp11 = select i1 %tmp10, i32 1, i32 %tmp09415 %tmp11.inc = add nsw i32 %tmp11, -7416 br label %BB4417 418BB4:419 %tmp13 = phi i32 [ %tmp11.inc, %BB3 ], [ %tmp14, %BB4 ]420 %tmp14 = add i32 %tmp13, -8421 %tmp15 = icmp sgt i32 %tmp14, 0422 br i1 %tmp15, label %BB4, label %BB1423}424 425;426define i64 @iv_scalar_steps_and_outside_users(ptr %ptr) {427; VEC-LABEL: define i64 @iv_scalar_steps_and_outside_users(428; VEC-SAME: ptr [[PTR:%.*]]) {429; VEC-NEXT: [[ENTRY:.*:]]430; VEC-NEXT: br label %[[VECTOR_PH:.*]]431; VEC: [[VECTOR_PH]]:432; VEC-NEXT: br label %[[VECTOR_BODY:.*]]433; VEC: [[VECTOR_BODY]]:434; VEC-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]435; VEC-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]436; VEC-NEXT: [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[INDEX]]437; VEC-NEXT: store <2 x i64> [[VEC_IND]], ptr [[TMP1]], align 4438; VEC-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2439; VEC-NEXT: [[VEC_IND_NEXT]] = add nuw <2 x i64> [[VEC_IND]], splat (i64 2)440; VEC-NEXT: [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1002441; VEC-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}442; VEC: [[MIDDLE_BLOCK]]:443; VEC-NEXT: br label %[[EXIT:.*]]444; VEC: [[EXIT]]:445; VEC-NEXT: ret i64 1001446;447; INTERLEAVE-LABEL: define i64 @iv_scalar_steps_and_outside_users(448; INTERLEAVE-SAME: ptr [[PTR:%.*]]) {449; INTERLEAVE-NEXT: [[ENTRY:.*:]]450; INTERLEAVE-NEXT: br label %[[VECTOR_PH:.*]]451; INTERLEAVE: [[VECTOR_PH]]:452; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]453; INTERLEAVE: [[VECTOR_BODY]]:454; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]455; INTERLEAVE-NEXT: [[TMP1:%.*]] = add i64 [[INDEX]], 1456; INTERLEAVE-NEXT: [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[INDEX]]457; INTERLEAVE-NEXT: [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[TMP1]]458; INTERLEAVE-NEXT: store i64 [[INDEX]], ptr [[TMP2]], align 4459; INTERLEAVE-NEXT: store i64 [[TMP1]], ptr [[TMP3]], align 4460; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2461; INTERLEAVE-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1002462; INTERLEAVE-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}463; INTERLEAVE: [[MIDDLE_BLOCK]]:464; INTERLEAVE-NEXT: br label %[[EXIT:.*]]465; INTERLEAVE: [[EXIT]]:466; INTERLEAVE-NEXT: ret i64 1001467;468entry:469 br label %loop470 471loop:472 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]473 %iv.next = add nuw i64 %iv, 1474 %gep.ptr = getelementptr inbounds i64, ptr %ptr, i64 %iv475 store i64 %iv, ptr %gep.ptr476 %exitcond = icmp ugt i64 %iv, 1000477 br i1 %exitcond, label %exit, label %loop478 479exit:480 %iv.lcssa = phi i64 [ %iv, %loop ]481 ret i64 %iv.lcssa482}483 484 485; %iv.2 is dead in the vector loop and only used outside the loop.486define i32 @iv_2_dead_in_loop_only_used_outside(ptr %ptr) {487; VEC-LABEL: define i32 @iv_2_dead_in_loop_only_used_outside(488; VEC-SAME: ptr [[PTR:%.*]]) {489; VEC-NEXT: [[ENTRY:.*:]]490; VEC-NEXT: br label %[[VECTOR_PH:.*]]491; VEC: [[VECTOR_PH]]:492; VEC-NEXT: br label %[[VECTOR_BODY:.*]]493; VEC: [[VECTOR_BODY]]:494; VEC-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]495; VEC-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]496; VEC-NEXT: [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[INDEX]]497; VEC-NEXT: store <2 x i64> [[VEC_IND]], ptr [[TMP1]], align 4498; VEC-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2499; VEC-NEXT: [[VEC_IND_NEXT]] = add nuw <2 x i64> [[VEC_IND]], splat (i64 2)500; VEC-NEXT: [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1002501; VEC-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}502; VEC: [[MIDDLE_BLOCK]]:503; VEC-NEXT: br label %[[EXIT:.*]]504; VEC: [[EXIT]]:505; VEC-NEXT: ret i32 2002506;507; INTERLEAVE-LABEL: define i32 @iv_2_dead_in_loop_only_used_outside(508; INTERLEAVE-SAME: ptr [[PTR:%.*]]) {509; INTERLEAVE-NEXT: [[ENTRY:.*:]]510; INTERLEAVE-NEXT: br label %[[VECTOR_PH:.*]]511; INTERLEAVE: [[VECTOR_PH]]:512; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]513; INTERLEAVE: [[VECTOR_BODY]]:514; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]515; INTERLEAVE-NEXT: [[TMP1:%.*]] = add i64 [[INDEX]], 1516; INTERLEAVE-NEXT: [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[INDEX]]517; INTERLEAVE-NEXT: [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[TMP1]]518; INTERLEAVE-NEXT: store i64 [[INDEX]], ptr [[TMP2]], align 4519; INTERLEAVE-NEXT: store i64 [[TMP1]], ptr [[TMP3]], align 4520; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2521; INTERLEAVE-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1002522; INTERLEAVE-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}523; INTERLEAVE: [[MIDDLE_BLOCK]]:524; INTERLEAVE-NEXT: br label %[[EXIT:.*]]525; INTERLEAVE: [[EXIT]]:526; INTERLEAVE-NEXT: ret i32 2002527;528entry:529 br label %loop530 531loop:532 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]533 %iv.2 = phi i32 [ 0, %entry ], [ %iv.2.next, %loop ]534 %iv.next = add nuw i64 %iv, 1535 %iv.2.next = add nuw i32 %iv.2, 2536 %gep.ptr = getelementptr inbounds i64, ptr %ptr, i64 %iv537 store i64 %iv, ptr %gep.ptr538 %exitcond = icmp ugt i64 %iv, 1000539 br i1 %exitcond, label %exit, label %loop540 541exit:542 %iv.2.lcssa = phi i32 [ %iv.2, %loop ]543 ret i32 %iv.2.lcssa544}545 546define i32 @postinc_sub(i32 %k) {547; CHECK-LABEL: define i32 @postinc_sub(548; CHECK-SAME: i32 [[K:%.*]]) {549; CHECK-NEXT: [[ENTRY:.*]]:550; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2551; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]552; CHECK: [[VECTOR_PH]]:553; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[K]], 2554; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]555; CHECK-NEXT: [[TMP0:%.*]] = sub i32 [[K]], [[N_VEC]]556; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]557; CHECK: [[VECTOR_BODY]]:558; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]559; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2560; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]561; CHECK-NEXT: br i1 [[TMP1]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}562; CHECK: [[MIDDLE_BLOCK]]:563; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]564; CHECK-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]565; CHECK: [[SCALAR_PH]]:566; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[TMP0]], %[[MIDDLE_BLOCK]] ], [ [[K]], %[[ENTRY]] ]567; CHECK-NEXT: br label %[[FOR_BODY:.*]]568; CHECK: [[FOR_BODY]]:569; CHECK-NEXT: [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]570; CHECK-NEXT: [[INC]] = sub nsw i32 [[INC_PHI]], 1571; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[INC]], 0572; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}573; CHECK: [[FOR_END]]:574; CHECK-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ [[TMP0]], %[[MIDDLE_BLOCK]] ]575; CHECK-NEXT: ret i32 [[INC_LCSSA]]576;577entry:578 br label %for.body579 580for.body:581 %inc.phi = phi i32 [ %k, %entry ], [ %inc, %for.body ]582 %inc = sub nsw i32 %inc.phi, 1583 %cmp = icmp eq i32 %inc, 0584 br i1 %cmp, label %for.end, label %for.body585 586for.end:587 ret i32 %inc588}589 590define i32 @postinc_swapped_ops(i32 %k) {591; CHECK-LABEL: define i32 @postinc_swapped_ops(592; CHECK-SAME: i32 [[K:%.*]]) {593; CHECK-NEXT: [[ENTRY:.*]]:594; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2595; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]596; CHECK: [[VECTOR_PH]]:597; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[K]], 2598; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]599; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]600; CHECK: [[VECTOR_BODY]]:601; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]602; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2603; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]604; CHECK-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}605; CHECK: [[MIDDLE_BLOCK]]:606; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]607; CHECK-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]608; CHECK: [[SCALAR_PH]]:609; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]610; CHECK-NEXT: br label %[[FOR_BODY:.*]]611; CHECK: [[FOR_BODY]]:612; CHECK-NEXT: [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]613; CHECK-NEXT: [[INC]] = add nsw i32 1, [[INC_PHI]]614; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]615; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}616; CHECK: [[FOR_END]]:617; CHECK-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ [[N_VEC]], %[[MIDDLE_BLOCK]] ]618; CHECK-NEXT: ret i32 [[INC_LCSSA]]619;620entry:621 br label %for.body622 623for.body:624 %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]625 %inc = add nsw i32 1, %inc.phi626 %cmp = icmp eq i32 %inc, %k627 br i1 %cmp, label %for.end, label %for.body628 629for.end:630 ret i32 %inc631}632 633define i32 @postinc_not_iv_backedge_value(i32 %k) {634; VEC-LABEL: define i32 @postinc_not_iv_backedge_value(635; VEC-SAME: i32 [[K:%.*]]) {636; VEC-NEXT: [[ENTRY:.*]]:637; VEC-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2638; VEC-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]639; VEC: [[VECTOR_PH]]:640; VEC-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[K]], 2641; VEC-NEXT: [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]642; VEC-NEXT: br label %[[VECTOR_BODY:.*]]643; VEC: [[VECTOR_BODY]]:644; VEC-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]645; VEC-NEXT: [[VEC_IND:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]646; VEC-NEXT: [[TMP0:%.*]] = add <2 x i32> [[VEC_IND]], splat (i32 2)647; VEC-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2648; VEC-NEXT: [[VEC_IND_NEXT]] = add nsw <2 x i32> [[VEC_IND]], splat (i32 2)649; VEC-NEXT: [[TMP1:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]650; VEC-NEXT: br i1 [[TMP1]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}651; VEC: [[MIDDLE_BLOCK]]:652; VEC-NEXT: [[TMP2:%.*]] = extractelement <2 x i32> [[TMP0]], i32 1653; VEC-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]654; VEC-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]655; VEC: [[SCALAR_PH]]:656; VEC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]657; VEC-NEXT: br label %[[FOR_BODY:.*]]658; VEC: [[FOR_BODY]]:659; VEC-NEXT: [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]660; VEC-NEXT: [[INC]] = add nsw i32 [[INC_PHI]], 1661; VEC-NEXT: [[INC_2:%.*]] = add i32 [[INC_PHI]], 2662; VEC-NEXT: [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]663; VEC-NEXT: br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}664; VEC: [[FOR_END]]:665; VEC-NEXT: [[INC_2_LCSSA:%.*]] = phi i32 [ [[INC_2]], %[[FOR_BODY]] ], [ [[TMP2]], %[[MIDDLE_BLOCK]] ]666; VEC-NEXT: ret i32 [[INC_2_LCSSA]]667;668; INTERLEAVE-LABEL: define i32 @postinc_not_iv_backedge_value(669; INTERLEAVE-SAME: i32 [[K:%.*]]) {670; INTERLEAVE-NEXT: [[ENTRY:.*]]:671; INTERLEAVE-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2672; INTERLEAVE-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]673; INTERLEAVE: [[VECTOR_PH]]:674; INTERLEAVE-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[K]], 2675; INTERLEAVE-NEXT: [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]676; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]677; INTERLEAVE: [[VECTOR_BODY]]:678; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]679; INTERLEAVE-NEXT: [[TMP0:%.*]] = add i32 [[INDEX]], 1680; INTERLEAVE-NEXT: [[TMP1:%.*]] = add i32 [[TMP0]], 2681; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2682; INTERLEAVE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]683; INTERLEAVE-NEXT: br i1 [[TMP2]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}684; INTERLEAVE: [[MIDDLE_BLOCK]]:685; INTERLEAVE-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]686; INTERLEAVE-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]687; INTERLEAVE: [[SCALAR_PH]]:688; INTERLEAVE-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]689; INTERLEAVE-NEXT: br label %[[FOR_BODY:.*]]690; INTERLEAVE: [[FOR_BODY]]:691; INTERLEAVE-NEXT: [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]692; INTERLEAVE-NEXT: [[INC]] = add nsw i32 [[INC_PHI]], 1693; INTERLEAVE-NEXT: [[INC_2:%.*]] = add i32 [[INC_PHI]], 2694; INTERLEAVE-NEXT: [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]695; INTERLEAVE-NEXT: br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}696; INTERLEAVE: [[FOR_END]]:697; INTERLEAVE-NEXT: [[INC_2_LCSSA:%.*]] = phi i32 [ [[INC_2]], %[[FOR_BODY]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]698; INTERLEAVE-NEXT: ret i32 [[INC_2_LCSSA]]699;700entry:701 br label %for.body702 703for.body:704 %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]705 %inc = add nsw i32 %inc.phi, 1706 %inc.2 = add i32 %inc.phi, 2707 %cmp = icmp eq i32 %inc, %k708 br i1 %cmp, label %for.end, label %for.body709 710for.end:711 ret i32 %inc.2712}713 714define float @fp_postinc_use_fadd(float %init, ptr noalias nocapture %A, i64 %N, float %fpinc) {715; VEC-LABEL: define float @fp_postinc_use_fadd(716; VEC-SAME: float [[INIT:%.*]], ptr noalias captures(none) [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {717; VEC-NEXT: [[ENTRY:.*]]:718; VEC-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2719; VEC-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]720; VEC: [[VECTOR_PH]]:721; VEC-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 2722; VEC-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]723; VEC-NEXT: [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float724; VEC-NEXT: [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]725; VEC-NEXT: [[TMP1:%.*]] = fadd fast float [[INIT]], [[TMP0]]726; VEC-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x float> poison, float [[INIT]], i64 0727; VEC-NEXT: [[DOTSPLAT:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT]], <2 x float> poison, <2 x i32> zeroinitializer728; VEC-NEXT: [[DOTSPLATINSERT1:%.*]] = insertelement <2 x float> poison, float [[FPINC]], i64 0729; VEC-NEXT: [[DOTSPLAT2:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT1]], <2 x float> poison, <2 x i32> zeroinitializer730; VEC-NEXT: [[TMP2:%.*]] = fmul fast <2 x float> <float 0.000000e+00, float 1.000000e+00>, [[DOTSPLAT2]]731; VEC-NEXT: [[INDUCTION:%.*]] = fadd fast <2 x float> [[DOTSPLAT]], [[TMP2]]732; VEC-NEXT: [[TMP3:%.*]] = fmul fast float [[FPINC]], 2.000000e+00733; VEC-NEXT: [[DOTSPLATINSERT3:%.*]] = insertelement <2 x float> poison, float [[TMP3]], i64 0734; VEC-NEXT: [[DOTSPLAT4:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT3]], <2 x float> poison, <2 x i32> zeroinitializer735; VEC-NEXT: br label %[[VECTOR_BODY:.*]]736; VEC: [[VECTOR_BODY]]:737; VEC-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]738; VEC-NEXT: [[VEC_IND:%.*]] = phi <2 x float> [ [[INDUCTION]], %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]739; VEC-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]740; VEC-NEXT: store <2 x float> [[VEC_IND]], ptr [[TMP5]], align 4741; VEC-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2742; VEC-NEXT: [[VEC_IND_NEXT]] = fadd fast <2 x float> [[VEC_IND]], [[DOTSPLAT4]]743; VEC-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]744; VEC-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}745; VEC: [[MIDDLE_BLOCK]]:746; VEC-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]747; VEC-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]748; VEC: [[SCALAR_PH]]:749; VEC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]750; VEC-NEXT: [[BC_RESUME_VAL5:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]751; VEC-NEXT: br label %[[LOOP:.*]]752; VEC: [[LOOP]]:753; VEC-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]754; VEC-NEXT: [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL5]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]755; VEC-NEXT: [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]756; VEC-NEXT: store float [[FP_IV]], ptr [[GEP_A]], align 4757; VEC-NEXT: [[ADD]] = fadd fast float [[FP_IV]], [[FPINC]]758; VEC-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1759; VEC-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]760; VEC-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}761; VEC: [[EXIT]]:762; VEC-NEXT: [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]763; VEC-NEXT: ret float [[ADD_LCSSA]]764;765; INTERLEAVE-LABEL: define float @fp_postinc_use_fadd(766; INTERLEAVE-SAME: float [[INIT:%.*]], ptr noalias captures(none) [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {767; INTERLEAVE-NEXT: [[ENTRY:.*]]:768; INTERLEAVE-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2769; INTERLEAVE-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]770; INTERLEAVE: [[VECTOR_PH]]:771; INTERLEAVE-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 2772; INTERLEAVE-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]773; INTERLEAVE-NEXT: [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float774; INTERLEAVE-NEXT: [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]775; INTERLEAVE-NEXT: [[TMP1:%.*]] = fadd fast float [[INIT]], [[TMP0]]776; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]777; INTERLEAVE: [[VECTOR_BODY]]:778; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]779; INTERLEAVE-NEXT: [[TMP3:%.*]] = add i64 [[INDEX]], 1780; INTERLEAVE-NEXT: [[DOTCAST1:%.*]] = sitofp i64 [[INDEX]] to float781; INTERLEAVE-NEXT: [[TMP4:%.*]] = fmul fast float [[FPINC]], [[DOTCAST1]]782; INTERLEAVE-NEXT: [[OFFSET_IDX:%.*]] = fadd fast float [[INIT]], [[TMP4]]783; INTERLEAVE-NEXT: [[TMP7:%.*]] = fmul fast float 1.000000e+00, [[FPINC]]784; INTERLEAVE-NEXT: [[TMP8:%.*]] = fadd fast float [[OFFSET_IDX]], [[TMP7]]785; INTERLEAVE-NEXT: [[TMP6:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]786; INTERLEAVE-NEXT: [[TMP10:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP3]]787; INTERLEAVE-NEXT: store float [[OFFSET_IDX]], ptr [[TMP6]], align 4788; INTERLEAVE-NEXT: store float [[TMP8]], ptr [[TMP10]], align 4789; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2790; INTERLEAVE-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]791; INTERLEAVE-NEXT: br i1 [[TMP11]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}792; INTERLEAVE: [[MIDDLE_BLOCK]]:793; INTERLEAVE-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]794; INTERLEAVE-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]795; INTERLEAVE: [[SCALAR_PH]]:796; INTERLEAVE-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]797; INTERLEAVE-NEXT: [[BC_RESUME_VAL2:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]798; INTERLEAVE-NEXT: br label %[[LOOP:.*]]799; INTERLEAVE: [[LOOP]]:800; INTERLEAVE-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]801; INTERLEAVE-NEXT: [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL2]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]802; INTERLEAVE-NEXT: [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]803; INTERLEAVE-NEXT: store float [[FP_IV]], ptr [[GEP_A]], align 4804; INTERLEAVE-NEXT: [[ADD]] = fadd fast float [[FP_IV]], [[FPINC]]805; INTERLEAVE-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1806; INTERLEAVE-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]807; INTERLEAVE-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}808; INTERLEAVE: [[EXIT]]:809; INTERLEAVE-NEXT: [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]810; INTERLEAVE-NEXT: ret float [[ADD_LCSSA]]811;812entry:813 br label %loop814 815loop:816 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]817 %fp.iv = phi float [ %init, %entry ], [ %add, %loop ]818 %gep.A = getelementptr inbounds float, ptr %A, i64 %iv819 store float %fp.iv, ptr %gep.A, align 4820 %add = fadd fast float %fp.iv, %fpinc821 %iv.next = add nuw nsw i64 %iv, 1822 %ec = icmp eq i64 %iv.next, %N823 br i1 %ec, label %exit, label %loop824 825exit:826 ret float %add827}828 829define float @fp_postinc_use_fadd_ops_swapped(float %init, ptr noalias nocapture %A, i64 %N, float %fpinc) {830; VEC-LABEL: define float @fp_postinc_use_fadd_ops_swapped(831; VEC-SAME: float [[INIT:%.*]], ptr noalias captures(none) [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {832; VEC-NEXT: [[ENTRY:.*]]:833; VEC-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2834; VEC-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]835; VEC: [[VECTOR_PH]]:836; VEC-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 2837; VEC-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]838; VEC-NEXT: [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float839; VEC-NEXT: [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]840; VEC-NEXT: [[TMP1:%.*]] = fadd fast float [[INIT]], [[TMP0]]841; VEC-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x float> poison, float [[INIT]], i64 0842; VEC-NEXT: [[DOTSPLAT:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT]], <2 x float> poison, <2 x i32> zeroinitializer843; VEC-NEXT: [[DOTSPLATINSERT1:%.*]] = insertelement <2 x float> poison, float [[FPINC]], i64 0844; VEC-NEXT: [[DOTSPLAT2:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT1]], <2 x float> poison, <2 x i32> zeroinitializer845; VEC-NEXT: [[TMP2:%.*]] = fmul fast <2 x float> <float 0.000000e+00, float 1.000000e+00>, [[DOTSPLAT2]]846; VEC-NEXT: [[INDUCTION:%.*]] = fadd fast <2 x float> [[DOTSPLAT]], [[TMP2]]847; VEC-NEXT: [[TMP3:%.*]] = fmul fast float [[FPINC]], 2.000000e+00848; VEC-NEXT: [[DOTSPLATINSERT3:%.*]] = insertelement <2 x float> poison, float [[TMP3]], i64 0849; VEC-NEXT: [[DOTSPLAT4:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT3]], <2 x float> poison, <2 x i32> zeroinitializer850; VEC-NEXT: br label %[[VECTOR_BODY:.*]]851; VEC: [[VECTOR_BODY]]:852; VEC-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]853; VEC-NEXT: [[VEC_IND:%.*]] = phi <2 x float> [ [[INDUCTION]], %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]854; VEC-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]855; VEC-NEXT: store <2 x float> [[VEC_IND]], ptr [[TMP5]], align 4856; VEC-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2857; VEC-NEXT: [[VEC_IND_NEXT]] = fadd fast <2 x float> [[VEC_IND]], [[DOTSPLAT4]]858; VEC-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]859; VEC-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}860; VEC: [[MIDDLE_BLOCK]]:861; VEC-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]862; VEC-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]863; VEC: [[SCALAR_PH]]:864; VEC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]865; VEC-NEXT: [[BC_RESUME_VAL5:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]866; VEC-NEXT: br label %[[LOOP:.*]]867; VEC: [[LOOP]]:868; VEC-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]869; VEC-NEXT: [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL5]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]870; VEC-NEXT: [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]871; VEC-NEXT: store float [[FP_IV]], ptr [[GEP_A]], align 4872; VEC-NEXT: [[ADD]] = fadd fast float [[FPINC]], [[FP_IV]]873; VEC-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1874; VEC-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]875; VEC-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}876; VEC: [[EXIT]]:877; VEC-NEXT: [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]878; VEC-NEXT: ret float [[ADD_LCSSA]]879;880; INTERLEAVE-LABEL: define float @fp_postinc_use_fadd_ops_swapped(881; INTERLEAVE-SAME: float [[INIT:%.*]], ptr noalias captures(none) [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {882; INTERLEAVE-NEXT: [[ENTRY:.*]]:883; INTERLEAVE-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2884; INTERLEAVE-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]885; INTERLEAVE: [[VECTOR_PH]]:886; INTERLEAVE-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 2887; INTERLEAVE-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]888; INTERLEAVE-NEXT: [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float889; INTERLEAVE-NEXT: [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]890; INTERLEAVE-NEXT: [[TMP1:%.*]] = fadd fast float [[INIT]], [[TMP0]]891; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]892; INTERLEAVE: [[VECTOR_BODY]]:893; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]894; INTERLEAVE-NEXT: [[TMP3:%.*]] = add i64 [[INDEX]], 1895; INTERLEAVE-NEXT: [[DOTCAST1:%.*]] = sitofp i64 [[INDEX]] to float896; INTERLEAVE-NEXT: [[TMP4:%.*]] = fmul fast float [[FPINC]], [[DOTCAST1]]897; INTERLEAVE-NEXT: [[OFFSET_IDX:%.*]] = fadd fast float [[INIT]], [[TMP4]]898; INTERLEAVE-NEXT: [[TMP7:%.*]] = fmul fast float 1.000000e+00, [[FPINC]]899; INTERLEAVE-NEXT: [[TMP8:%.*]] = fadd fast float [[OFFSET_IDX]], [[TMP7]]900; INTERLEAVE-NEXT: [[TMP6:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]901; INTERLEAVE-NEXT: [[TMP10:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP3]]902; INTERLEAVE-NEXT: store float [[OFFSET_IDX]], ptr [[TMP6]], align 4903; INTERLEAVE-NEXT: store float [[TMP8]], ptr [[TMP10]], align 4904; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2905; INTERLEAVE-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]906; INTERLEAVE-NEXT: br i1 [[TMP11]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}907; INTERLEAVE: [[MIDDLE_BLOCK]]:908; INTERLEAVE-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]909; INTERLEAVE-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]910; INTERLEAVE: [[SCALAR_PH]]:911; INTERLEAVE-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]912; INTERLEAVE-NEXT: [[BC_RESUME_VAL2:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]913; INTERLEAVE-NEXT: br label %[[LOOP:.*]]914; INTERLEAVE: [[LOOP]]:915; INTERLEAVE-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]916; INTERLEAVE-NEXT: [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL2]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]917; INTERLEAVE-NEXT: [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]918; INTERLEAVE-NEXT: store float [[FP_IV]], ptr [[GEP_A]], align 4919; INTERLEAVE-NEXT: [[ADD]] = fadd fast float [[FPINC]], [[FP_IV]]920; INTERLEAVE-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1921; INTERLEAVE-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]922; INTERLEAVE-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}923; INTERLEAVE: [[EXIT]]:924; INTERLEAVE-NEXT: [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]925; INTERLEAVE-NEXT: ret float [[ADD_LCSSA]]926;927entry:928 br label %loop929 930loop:931 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]932 %fp.iv = phi float [ %init, %entry ], [ %add, %loop ]933 %gep.A = getelementptr inbounds float, ptr %A, i64 %iv934 store float %fp.iv, ptr %gep.A, align 4935 %add = fadd fast float %fpinc, %fp.iv936 %iv.next = add nuw nsw i64 %iv, 1937 %ec = icmp eq i64 %iv.next, %N938 br i1 %ec, label %exit, label %loop939 940exit:941 ret float %add942}943 944define float @fp_postinc_use_fsub(float %init, ptr noalias nocapture %A, i64 %N, float %fpinc) {945; VEC-LABEL: define float @fp_postinc_use_fsub(946; VEC-SAME: float [[INIT:%.*]], ptr noalias captures(none) [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {947; VEC-NEXT: [[ENTRY:.*]]:948; VEC-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2949; VEC-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]950; VEC: [[VECTOR_PH]]:951; VEC-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 2952; VEC-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]953; VEC-NEXT: [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float954; VEC-NEXT: [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]955; VEC-NEXT: [[TMP1:%.*]] = fsub fast float [[INIT]], [[TMP0]]956; VEC-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x float> poison, float [[INIT]], i64 0957; VEC-NEXT: [[DOTSPLAT:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT]], <2 x float> poison, <2 x i32> zeroinitializer958; VEC-NEXT: [[DOTSPLATINSERT1:%.*]] = insertelement <2 x float> poison, float [[FPINC]], i64 0959; VEC-NEXT: [[DOTSPLAT2:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT1]], <2 x float> poison, <2 x i32> zeroinitializer960; VEC-NEXT: [[TMP2:%.*]] = fmul fast <2 x float> <float 0.000000e+00, float 1.000000e+00>, [[DOTSPLAT2]]961; VEC-NEXT: [[INDUCTION:%.*]] = fsub fast <2 x float> [[DOTSPLAT]], [[TMP2]]962; VEC-NEXT: [[TMP3:%.*]] = fmul fast float [[FPINC]], 2.000000e+00963; VEC-NEXT: [[DOTSPLATINSERT3:%.*]] = insertelement <2 x float> poison, float [[TMP3]], i64 0964; VEC-NEXT: [[DOTSPLAT4:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT3]], <2 x float> poison, <2 x i32> zeroinitializer965; VEC-NEXT: br label %[[VECTOR_BODY:.*]]966; VEC: [[VECTOR_BODY]]:967; VEC-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]968; VEC-NEXT: [[VEC_IND:%.*]] = phi <2 x float> [ [[INDUCTION]], %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]969; VEC-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]970; VEC-NEXT: store <2 x float> [[VEC_IND]], ptr [[TMP5]], align 4971; VEC-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2972; VEC-NEXT: [[VEC_IND_NEXT]] = fsub fast <2 x float> [[VEC_IND]], [[DOTSPLAT4]]973; VEC-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]974; VEC-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}975; VEC: [[MIDDLE_BLOCK]]:976; VEC-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]977; VEC-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]978; VEC: [[SCALAR_PH]]:979; VEC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]980; VEC-NEXT: [[BC_RESUME_VAL5:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]981; VEC-NEXT: br label %[[LOOP:.*]]982; VEC: [[LOOP]]:983; VEC-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]984; VEC-NEXT: [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL5]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]985; VEC-NEXT: [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]986; VEC-NEXT: store float [[FP_IV]], ptr [[GEP_A]], align 4987; VEC-NEXT: [[ADD]] = fsub fast float [[FP_IV]], [[FPINC]]988; VEC-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1989; VEC-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]990; VEC-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}991; VEC: [[EXIT]]:992; VEC-NEXT: [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]993; VEC-NEXT: ret float [[ADD_LCSSA]]994;995; INTERLEAVE-LABEL: define float @fp_postinc_use_fsub(996; INTERLEAVE-SAME: float [[INIT:%.*]], ptr noalias captures(none) [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {997; INTERLEAVE-NEXT: [[ENTRY:.*]]:998; INTERLEAVE-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2999; INTERLEAVE-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1000; INTERLEAVE: [[VECTOR_PH]]:1001; INTERLEAVE-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 21002; INTERLEAVE-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]1003; INTERLEAVE-NEXT: [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float1004; INTERLEAVE-NEXT: [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]1005; INTERLEAVE-NEXT: [[TMP1:%.*]] = fsub fast float [[INIT]], [[TMP0]]1006; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]1007; INTERLEAVE: [[VECTOR_BODY]]:1008; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1009; INTERLEAVE-NEXT: [[TMP3:%.*]] = add i64 [[INDEX]], 11010; INTERLEAVE-NEXT: [[DOTCAST1:%.*]] = sitofp i64 [[INDEX]] to float1011; INTERLEAVE-NEXT: [[TMP4:%.*]] = fmul fast float [[FPINC]], [[DOTCAST1]]1012; INTERLEAVE-NEXT: [[OFFSET_IDX:%.*]] = fsub fast float [[INIT]], [[TMP4]]1013; INTERLEAVE-NEXT: [[TMP7:%.*]] = fmul fast float 1.000000e+00, [[FPINC]]1014; INTERLEAVE-NEXT: [[TMP8:%.*]] = fsub fast float [[OFFSET_IDX]], [[TMP7]]1015; INTERLEAVE-NEXT: [[TMP6:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]1016; INTERLEAVE-NEXT: [[TMP10:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP3]]1017; INTERLEAVE-NEXT: store float [[OFFSET_IDX]], ptr [[TMP6]], align 41018; INTERLEAVE-NEXT: store float [[TMP8]], ptr [[TMP10]], align 41019; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 21020; INTERLEAVE-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1021; INTERLEAVE-NEXT: br i1 [[TMP11]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}1022; INTERLEAVE: [[MIDDLE_BLOCK]]:1023; INTERLEAVE-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]1024; INTERLEAVE-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]1025; INTERLEAVE: [[SCALAR_PH]]:1026; INTERLEAVE-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]1027; INTERLEAVE-NEXT: [[BC_RESUME_VAL2:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]1028; INTERLEAVE-NEXT: br label %[[LOOP:.*]]1029; INTERLEAVE: [[LOOP]]:1030; INTERLEAVE-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]1031; INTERLEAVE-NEXT: [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL2]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]1032; INTERLEAVE-NEXT: [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]1033; INTERLEAVE-NEXT: store float [[FP_IV]], ptr [[GEP_A]], align 41034; INTERLEAVE-NEXT: [[ADD]] = fsub fast float [[FP_IV]], [[FPINC]]1035; INTERLEAVE-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 11036; INTERLEAVE-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]1037; INTERLEAVE-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}1038; INTERLEAVE: [[EXIT]]:1039; INTERLEAVE-NEXT: [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]1040; INTERLEAVE-NEXT: ret float [[ADD_LCSSA]]1041;1042entry:1043 br label %loop1044 1045loop:1046 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]1047 %fp.iv = phi float [ %init, %entry ], [ %add, %loop ]1048 %gep.A = getelementptr inbounds float, ptr %A, i64 %iv1049 store float %fp.iv, ptr %gep.A, align 41050 %add = fsub fast float %fp.iv, %fpinc1051 %iv.next = add nuw nsw i64 %iv, 11052 %ec = icmp eq i64 %iv.next, %N1053 br i1 %ec, label %exit, label %loop1054 1055exit:1056 ret float %add1057}1058 1059; Test case for https://github.com/llvm/llvm-project/issues/121745.1060define i32 @test_iv_uniform_with_outside_use_scev_simplification(ptr %dst) {1061; VEC-LABEL: define i32 @test_iv_uniform_with_outside_use_scev_simplification(1062; VEC-SAME: ptr [[DST:%.*]]) {1063; VEC-NEXT: [[ENTRY:.*:]]1064; VEC-NEXT: [[STEP_1:%.*]] = sext i8 0 to i321065; VEC-NEXT: [[STEP_2:%.*]] = add nsw i32 [[STEP_1]], 11066; VEC-NEXT: br label %[[VECTOR_PH:.*]]1067; VEC: [[VECTOR_PH]]:1068; VEC-NEXT: br label %[[VECTOR_BODY:.*]]1069; VEC: [[VECTOR_BODY]]:1070; VEC-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1071; VEC-NEXT: [[TMP0:%.*]] = add i32 [[INDEX]], 01072; VEC-NEXT: [[TMP6:%.*]] = add i32 [[INDEX]], 11073; VEC-NEXT: [[TMP1:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP0]]1074; VEC-NEXT: store <2 x i16> zeroinitializer, ptr [[TMP1]], align 21075; VEC-NEXT: [[TMP5:%.*]] = add i32 [[STEP_2]], [[TMP6]]1076; VEC-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 21077; VEC-NEXT: [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 81078; VEC-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}1079; VEC: [[MIDDLE_BLOCK]]:1080; VEC-NEXT: br label %[[E_EXIT:.*]]1081; VEC: [[E_EXIT]]:1082; VEC-NEXT: ret i32 [[TMP5]]1083;1084; INTERLEAVE-LABEL: define i32 @test_iv_uniform_with_outside_use_scev_simplification(1085; INTERLEAVE-SAME: ptr [[DST:%.*]]) {1086; INTERLEAVE-NEXT: [[ENTRY:.*:]]1087; INTERLEAVE-NEXT: [[STEP_1:%.*]] = sext i8 0 to i321088; INTERLEAVE-NEXT: [[STEP_2:%.*]] = add nsw i32 [[STEP_1]], 11089; INTERLEAVE-NEXT: br label %[[VECTOR_PH:.*]]1090; INTERLEAVE: [[VECTOR_PH]]:1091; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]1092; INTERLEAVE: [[VECTOR_BODY]]:1093; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1094; INTERLEAVE-NEXT: [[TMP1:%.*]] = add i32 [[INDEX]], 11095; INTERLEAVE-NEXT: [[TMP2:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[INDEX]]1096; INTERLEAVE-NEXT: [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP1]]1097; INTERLEAVE-NEXT: store i16 0, ptr [[TMP2]], align 21098; INTERLEAVE-NEXT: store i16 0, ptr [[TMP3]], align 21099; INTERLEAVE-NEXT: [[TMP5:%.*]] = add i32 [[STEP_2]], [[TMP1]]1100; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 21101; INTERLEAVE-NEXT: [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 81102; INTERLEAVE-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}1103; INTERLEAVE: [[MIDDLE_BLOCK]]:1104; INTERLEAVE-NEXT: br label %[[E_EXIT:.*]]1105; INTERLEAVE: [[E_EXIT]]:1106; INTERLEAVE-NEXT: ret i32 [[TMP5]]1107;1108entry:1109 %step.1 = sext i8 0 to i321110 %step.2 = add nsw i32 %step.1, 11111 br label %loop1112 1113loop:1114 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]1115 %gep.dst = getelementptr inbounds i16, ptr %dst, i32 %iv1116 store i16 0, ptr %gep.dst, align 21117 %iv.next = add i32 %step.2, %iv1118 %cmp.i = icmp slt i32 %iv.next, 81119 br i1 %cmp.i, label %loop, label %e.exit1120 1121e.exit:1122 %res = phi i32 [ %iv.next, %loop ]1123 ret i32 %res1124}1125 1126define i32 @test_iv_uniform_with_outside_use_scev_simplification_2(ptr %dst) {1127; VEC-LABEL: define i32 @test_iv_uniform_with_outside_use_scev_simplification_2(1128; VEC-SAME: ptr [[DST:%.*]]) {1129; VEC-NEXT: [[ENTRY:.*:]]1130; VEC-NEXT: [[STEP_1:%.*]] = sext i8 0 to i321131; VEC-NEXT: [[STEP_2:%.*]] = add nsw i32 [[STEP_1]], 11132; VEC-NEXT: br label %[[VECTOR_PH:.*]]1133; VEC: [[VECTOR_PH]]:1134; VEC-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i32> poison, i32 [[STEP_2]], i64 01135; VEC-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i32> [[BROADCAST_SPLATINSERT]], <2 x i32> poison, <2 x i32> zeroinitializer1136; VEC-NEXT: br label %[[VECTOR_BODY:.*]]1137; VEC: [[VECTOR_BODY]]:1138; VEC-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1139; VEC-NEXT: [[VEC_IND:%.*]] = phi <2 x i32> [ <i32 0, i32 2>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]1140; VEC-NEXT: [[OFFSET_IDX:%.*]] = mul i32 [[INDEX]], 21141; VEC-NEXT: [[TMP0:%.*]] = add i32 [[OFFSET_IDX]], 01142; VEC-NEXT: [[TMP1:%.*]] = add i32 [[OFFSET_IDX]], 21143; VEC-NEXT: [[TMP2:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP0]]1144; VEC-NEXT: [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP1]]1145; VEC-NEXT: store i16 0, ptr [[TMP2]], align 21146; VEC-NEXT: store i16 0, ptr [[TMP3]], align 21147; VEC-NEXT: [[TMP4:%.*]] = add <2 x i32> [[VEC_IND]], splat (i32 1)1148; VEC-NEXT: [[TMP5:%.*]] = add <2 x i32> [[BROADCAST_SPLAT]], [[TMP4]]1149; VEC-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 21150; VEC-NEXT: [[VEC_IND_NEXT]] = add <2 x i32> [[VEC_IND]], splat (i32 4)1151; VEC-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 41152; VEC-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}1153; VEC: [[MIDDLE_BLOCK]]:1154; VEC-NEXT: [[TMP7:%.*]] = extractelement <2 x i32> [[TMP5]], i32 11155; VEC-NEXT: br label %[[E_EXIT:.*]]1156; VEC: [[E_EXIT]]:1157; VEC-NEXT: ret i32 [[TMP7]]1158;1159; INTERLEAVE-LABEL: define i32 @test_iv_uniform_with_outside_use_scev_simplification_2(1160; INTERLEAVE-SAME: ptr [[DST:%.*]]) {1161; INTERLEAVE-NEXT: [[ENTRY:.*:]]1162; INTERLEAVE-NEXT: [[STEP_1:%.*]] = sext i8 0 to i321163; INTERLEAVE-NEXT: [[STEP_2:%.*]] = add nsw i32 [[STEP_1]], 11164; INTERLEAVE-NEXT: br label %[[VECTOR_PH:.*]]1165; INTERLEAVE: [[VECTOR_PH]]:1166; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]1167; INTERLEAVE: [[VECTOR_BODY]]:1168; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1169; INTERLEAVE-NEXT: [[OFFSET_IDX:%.*]] = mul i32 [[INDEX]], 21170; INTERLEAVE-NEXT: [[TMP1:%.*]] = add i32 [[OFFSET_IDX]], 21171; INTERLEAVE-NEXT: [[TMP2:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[OFFSET_IDX]]1172; INTERLEAVE-NEXT: [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP1]]1173; INTERLEAVE-NEXT: store i16 0, ptr [[TMP2]], align 21174; INTERLEAVE-NEXT: store i16 0, ptr [[TMP3]], align 21175; INTERLEAVE-NEXT: [[TMP4:%.*]] = add i32 [[TMP1]], 11176; INTERLEAVE-NEXT: [[TMP5:%.*]] = add i32 [[STEP_2]], [[TMP4]]1177; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 21178; INTERLEAVE-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 41179; INTERLEAVE-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}1180; INTERLEAVE: [[MIDDLE_BLOCK]]:1181; INTERLEAVE-NEXT: br label %[[E_EXIT:.*]]1182; INTERLEAVE: [[E_EXIT]]:1183; INTERLEAVE-NEXT: ret i32 [[TMP5]]1184;1185entry:1186 %step.1 = sext i8 0 to i321187 %step.2 = add nsw i32 %step.1, 11188 br label %loop1189 1190loop:1191 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]1192 %gep.dst = getelementptr inbounds i16, ptr %dst, i32 %iv1193 store i16 0, ptr %gep.dst, align 21194 %inc = add i32 %iv, 11195 %iv.next = add i32 %step.2, %inc1196 %cmp.i = icmp slt i32 %iv.next, 81197 br i1 %cmp.i, label %loop, label %e.exit1198 1199e.exit:1200 %res = phi i32 [ %iv.next, %loop ]1201 ret i32 %res1202}1203 1204; Test case for https://github.com/llvm/llvm-project/issues/122496.1205define i32 @iv_ext_used_outside( ptr %dst) {1206; VEC-LABEL: define i32 @iv_ext_used_outside(1207; VEC-SAME: ptr [[DST:%.*]]) {1208; VEC-NEXT: [[ENTRY:.*:]]1209; VEC-NEXT: br label %[[VECTOR_PH:.*]]1210; VEC: [[VECTOR_PH]]:1211; VEC-NEXT: br label %[[VECTOR_BODY:.*]]1212; VEC: [[VECTOR_BODY]]:1213; VEC-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1214; VEC-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i161215; VEC-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[OFFSET_IDX]]1216; VEC-NEXT: store <2 x i32> zeroinitializer, ptr [[TMP1]], align 41217; VEC-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 21218; VEC-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1281219; VEC-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}1220; VEC: [[MIDDLE_BLOCK]]:1221; VEC-NEXT: br label %[[SCALAR_PH:.*]]1222; VEC: [[SCALAR_PH]]:1223; VEC-NEXT: br label %[[LOOP:.*]]1224; VEC: [[LOOP]]:1225; VEC-NEXT: [[IV_1:%.*]] = phi i16 [ 128, %[[SCALAR_PH]] ], [ [[IV_1_NEXT:%.*]], %[[LOOP]] ]1226; VEC-NEXT: [[IV_2:%.*]] = phi i32 [ 128, %[[SCALAR_PH]] ], [ [[IV_1_EXT:%.*]], %[[LOOP]] ]1227; VEC-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[IV_1]]1228; VEC-NEXT: store i32 0, ptr [[GEP]], align 41229; VEC-NEXT: [[IV_1_NEXT]] = add nuw nsw i16 [[IV_1]], 11230; VEC-NEXT: [[IV_1_EXT]] = zext nneg i16 [[IV_1_NEXT]] to i321231; VEC-NEXT: [[EC:%.*]] = icmp samesign ult i16 [[IV_1]], 1281232; VEC-NEXT: br i1 [[EC]], label %[[LOOP]], label %[[EXIT:.*]], {{!llvm.loop ![0-9]+}}1233; VEC: [[EXIT]]:1234; VEC-NEXT: [[IV_1_EXT_LCSSA:%.*]] = phi i32 [ [[IV_1_EXT]], %[[LOOP]] ]1235; VEC-NEXT: ret i32 [[IV_1_EXT_LCSSA]]1236;1237; INTERLEAVE-LABEL: define i32 @iv_ext_used_outside(1238; INTERLEAVE-SAME: ptr [[DST:%.*]]) {1239; INTERLEAVE-NEXT: [[ENTRY:.*:]]1240; INTERLEAVE-NEXT: br label %[[VECTOR_PH:.*]]1241; INTERLEAVE: [[VECTOR_PH]]:1242; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]1243; INTERLEAVE: [[VECTOR_BODY]]:1244; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1245; INTERLEAVE-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i161246; INTERLEAVE-NEXT: [[TMP1:%.*]] = add i16 [[OFFSET_IDX]], 11247; INTERLEAVE-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[OFFSET_IDX]]1248; INTERLEAVE-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[TMP1]]1249; INTERLEAVE-NEXT: store i32 0, ptr [[TMP2]], align 41250; INTERLEAVE-NEXT: store i32 0, ptr [[TMP3]], align 41251; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 21252; INTERLEAVE-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1281253; INTERLEAVE-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}1254; INTERLEAVE: [[MIDDLE_BLOCK]]:1255; INTERLEAVE-NEXT: br label %[[SCALAR_PH:.*]]1256; INTERLEAVE: [[SCALAR_PH]]:1257; INTERLEAVE-NEXT: br label %[[LOOP:.*]]1258; INTERLEAVE: [[LOOP]]:1259; INTERLEAVE-NEXT: [[IV_1:%.*]] = phi i16 [ 128, %[[SCALAR_PH]] ], [ [[IV_1_NEXT:%.*]], %[[LOOP]] ]1260; INTERLEAVE-NEXT: [[IV_2:%.*]] = phi i32 [ 128, %[[SCALAR_PH]] ], [ [[IV_1_EXT:%.*]], %[[LOOP]] ]1261; INTERLEAVE-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[IV_1]]1262; INTERLEAVE-NEXT: store i32 0, ptr [[GEP]], align 41263; INTERLEAVE-NEXT: [[IV_1_NEXT]] = add nuw nsw i16 [[IV_1]], 11264; INTERLEAVE-NEXT: [[IV_1_EXT]] = zext nneg i16 [[IV_1_NEXT]] to i321265; INTERLEAVE-NEXT: [[EC:%.*]] = icmp samesign ult i16 [[IV_1]], 1281266; INTERLEAVE-NEXT: br i1 [[EC]], label %[[LOOP]], label %[[EXIT:.*]], {{!llvm.loop ![0-9]+}}1267; INTERLEAVE: [[EXIT]]:1268; INTERLEAVE-NEXT: [[IV_1_EXT_LCSSA:%.*]] = phi i32 [ [[IV_1_EXT]], %[[LOOP]] ]1269; INTERLEAVE-NEXT: ret i32 [[IV_1_EXT_LCSSA]]1270;1271entry:1272 br label %loop1273 1274loop:1275 %iv.1 = phi i16 [ 0, %entry ], [ %iv.1.next, %loop ]1276 %iv.2 = phi i32 [ 0, %entry ], [ %iv.1.ext, %loop ]1277 %gep = getelementptr inbounds nuw i32, ptr %dst, i16 %iv.11278 store i32 0, ptr %gep, align 41279 %iv.1.next = add nuw nsw i16 %iv.1, 11280 %iv.1.ext = zext nneg i16 %iv.1.next to i321281 %ec = icmp samesign ult i16 %iv.1, 1281282 br i1 %ec, label %loop, label %exit1283 1284exit:1285 %iv.1.ext.lcssa = phi i32 [ %iv.1.ext, %loop ]1286 ret i32 %iv.1.ext.lcssa1287}1288 1289; Test case for https://github.com/llvm/llvm-project/issues/122602.1290define i64 @test_iv_increment_incremented(ptr %dst) {1291; VEC-LABEL: define i64 @test_iv_increment_incremented(1292; VEC-SAME: ptr [[DST:%.*]]) {1293; VEC-NEXT: [[ENTRY:.*:]]1294; VEC-NEXT: br label %[[VECTOR_PH:.*]]1295; VEC: [[VECTOR_PH]]:1296; VEC-NEXT: br label %[[VECTOR_BODY:.*]]1297; VEC: [[VECTOR_BODY]]:1298; VEC-NEXT: [[TMP0:%.*]] = getelementptr i16, ptr [[DST]], i64 31299; VEC-NEXT: [[TMP1:%.*]] = getelementptr i16, ptr [[TMP0]], i64 01300; VEC-NEXT: [[TMP2:%.*]] = getelementptr i16, ptr [[TMP1]], i64 -11301; VEC-NEXT: store <2 x i16> splat (i16 1), ptr [[TMP2]], align 21302; VEC-NEXT: [[TMP5:%.*]] = add i64 1, -11303; VEC-NEXT: [[IV_1_NEXT_LCSSA1:%.*]] = add i64 [[TMP5]], 11304; VEC-NEXT: br label %[[MIDDLE_BLOCK:.*]]1305; VEC: [[MIDDLE_BLOCK]]:1306; VEC-NEXT: br label %[[EXIT:.*]]1307; VEC: [[EXIT]]:1308; VEC-NEXT: ret i64 [[IV_1_NEXT_LCSSA1]]1309;1310; INTERLEAVE-LABEL: define i64 @test_iv_increment_incremented(1311; INTERLEAVE-SAME: ptr [[DST:%.*]]) {1312; INTERLEAVE-NEXT: [[ENTRY:.*:]]1313; INTERLEAVE-NEXT: br label %[[VECTOR_PH:.*]]1314; INTERLEAVE: [[VECTOR_PH]]:1315; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]1316; INTERLEAVE: [[VECTOR_BODY]]:1317; INTERLEAVE-NEXT: [[TMP0:%.*]] = getelementptr i16, ptr [[DST]], i64 31318; INTERLEAVE-NEXT: [[TMP1:%.*]] = getelementptr i16, ptr [[DST]], i64 21319; INTERLEAVE-NEXT: store i16 1, ptr [[TMP0]], align 21320; INTERLEAVE-NEXT: store i16 1, ptr [[TMP1]], align 21321; INTERLEAVE-NEXT: [[TMP2:%.*]] = add i64 1, -11322; INTERLEAVE-NEXT: [[IV_1_NEXT_LCSSA1:%.*]] = add i64 [[TMP2]], 11323; INTERLEAVE-NEXT: br label %[[MIDDLE_BLOCK:.*]]1324; INTERLEAVE: [[MIDDLE_BLOCK]]:1325; INTERLEAVE-NEXT: br label %[[EXIT:.*]]1326; INTERLEAVE: [[EXIT]]:1327; INTERLEAVE-NEXT: ret i64 [[IV_1_NEXT_LCSSA1]]1328;1329entry:1330 br label %loop1331 1332loop:1333 %iv.1 = phi i64 [ 3, %entry ], [ %iv.1.next, %loop ]1334 %iv.2 = phi i64 [ 2, %entry ], [ %iv.2.next, %loop ]1335 %gep = getelementptr i16, ptr %dst, i64 %iv.11336 store i16 1, ptr %gep, align 21337 %iv.2.next = add i64 %iv.2, -11338 %ec = icmp eq i64 %iv.2.next, 01339 %iv.1.next = add i64 %iv.2.next, 11340 br i1 %ec, label %exit, label %loop1341 1342exit:1343 ret i64 %iv.1.next1344}1345