Index: llvm/test/Transforms/LoopVectorize/loop-form.ll =================================================================== --- llvm/test/Transforms/LoopVectorize/loop-form.ll +++ llvm/test/Transforms/LoopVectorize/loop-form.ll @@ -169,50 +169,17 @@ ; ; TAILFOLD-LABEL: @early_exit( ; TAILFOLD-NEXT: entry: -; TAILFOLD-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[N:%.*]], 0 -; TAILFOLD-NEXT: [[SMAX:%.*]] = select i1 [[TMP0]], i32 [[N]], i32 0 -; TAILFOLD-NEXT: [[TMP1:%.*]] = add nuw i32 [[SMAX]], 1 -; TAILFOLD-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ule i32 [[TMP1]], 2 -; TAILFOLD-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] -; TAILFOLD: vector.ph: -; TAILFOLD-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[TMP1]], 2 -; TAILFOLD-NEXT: [[TMP2:%.*]] = icmp eq i32 [[N_MOD_VF]], 0 -; TAILFOLD-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i32 2, i32 [[N_MOD_VF]] -; TAILFOLD-NEXT: [[N_VEC:%.*]] = sub i32 [[TMP1]], [[TMP3]] -; TAILFOLD-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i32> undef, i32 [[N]], i32 0 -; TAILFOLD-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i32> [[BROADCAST_SPLATINSERT]], <2 x i32> undef, <2 x i32> zeroinitializer -; TAILFOLD-NEXT: br label [[VECTOR_BODY:%.*]] -; TAILFOLD: vector.body: -; TAILFOLD-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] -; TAILFOLD-NEXT: [[VEC_IND:%.*]] = phi <2 x i32> [ , [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ] -; TAILFOLD-NEXT: [[TMP4:%.*]] = add i32 [[INDEX]], 0 -; TAILFOLD-NEXT: [[TMP5:%.*]] = add i32 [[INDEX]], 1 -; TAILFOLD-NEXT: [[TMP6:%.*]] = icmp slt <2 x i32> [[VEC_IND]], [[BROADCAST_SPLAT]] -; TAILFOLD-NEXT: [[TMP7:%.*]] = sext i32 [[TMP4]] to i64 -; TAILFOLD-NEXT: [[TMP8:%.*]] = getelementptr inbounds i16, i16* [[P:%.*]], i64 [[TMP7]] -; TAILFOLD-NEXT: [[TMP9:%.*]] = getelementptr inbounds i16, i16* [[TMP8]], i32 0 -; TAILFOLD-NEXT: [[TMP10:%.*]] = bitcast i16* [[TMP9]] to <2 x i16>* -; TAILFOLD-NEXT: store <2 x i16> zeroinitializer, <2 x i16>* [[TMP10]], align 4 -; TAILFOLD-NEXT: [[INDEX_NEXT]] = add i32 [[INDEX]], 2 -; TAILFOLD-NEXT: [[VEC_IND_NEXT]] = add <2 x i32> [[VEC_IND]], -; TAILFOLD-NEXT: [[TMP11:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]] -; TAILFOLD-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], [[LOOP4:!llvm.loop !.*]] -; TAILFOLD: middle.block: -; TAILFOLD-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[TMP1]], [[N_VEC]] -; TAILFOLD-NEXT: br i1 [[CMP_N]], label [[IF_END:%.*]], label [[SCALAR_PH]] -; TAILFOLD: scalar.ph: -; TAILFOLD-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ] ; TAILFOLD-NEXT: br label [[FOR_COND:%.*]] ; TAILFOLD: for.cond: -; TAILFOLD-NEXT: [[I:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INC:%.*]], [[FOR_BODY:%.*]] ] -; TAILFOLD-NEXT: [[CMP:%.*]] = icmp slt i32 [[I]], [[N]] -; TAILFOLD-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[IF_END]] +; TAILFOLD-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY:%.*]] ] +; TAILFOLD-NEXT: [[CMP:%.*]] = icmp slt i32 [[I]], [[N:%.*]] +; TAILFOLD-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[IF_END:%.*]] ; TAILFOLD: for.body: ; TAILFOLD-NEXT: [[IPROM:%.*]] = sext i32 [[I]] to i64 -; TAILFOLD-NEXT: [[B:%.*]] = getelementptr inbounds i16, i16* [[P]], i64 [[IPROM]] +; TAILFOLD-NEXT: [[B:%.*]] = getelementptr inbounds i16, i16* [[P:%.*]], i64 [[IPROM]] ; TAILFOLD-NEXT: store i16 0, i16* [[B]], align 4 ; TAILFOLD-NEXT: [[INC]] = add nsw i32 [[I]], 1 -; TAILFOLD-NEXT: br label [[FOR_COND]], [[LOOP5:!llvm.loop !.*]] +; TAILFOLD-NEXT: br label [[FOR_COND]] ; TAILFOLD: if.end: ; TAILFOLD-NEXT: ret void ; @@ -346,53 +313,18 @@ ; ; TAILFOLD-LABEL: @multiple_unique_exit( ; TAILFOLD-NEXT: entry: -; TAILFOLD-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[N:%.*]], 0 -; TAILFOLD-NEXT: [[SMAX:%.*]] = select i1 [[TMP0]], i32 [[N]], i32 0 -; TAILFOLD-NEXT: [[TMP1:%.*]] = icmp ult i32 [[SMAX]], 2096 -; TAILFOLD-NEXT: [[UMIN:%.*]] = select i1 [[TMP1]], i32 [[SMAX]], i32 2096 -; TAILFOLD-NEXT: [[TMP2:%.*]] = add nuw nsw i32 [[UMIN]], 1 -; TAILFOLD-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ule i32 [[TMP2]], 2 -; TAILFOLD-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] -; TAILFOLD: vector.ph: -; TAILFOLD-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[TMP2]], 2 -; TAILFOLD-NEXT: [[TMP3:%.*]] = icmp eq i32 [[N_MOD_VF]], 0 -; TAILFOLD-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 2, i32 [[N_MOD_VF]] -; TAILFOLD-NEXT: [[N_VEC:%.*]] = sub i32 [[TMP2]], [[TMP4]] -; TAILFOLD-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i32> undef, i32 [[N]], i32 0 -; TAILFOLD-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i32> [[BROADCAST_SPLATINSERT]], <2 x i32> undef, <2 x i32> zeroinitializer -; TAILFOLD-NEXT: br label [[VECTOR_BODY:%.*]] -; TAILFOLD: vector.body: -; TAILFOLD-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] -; TAILFOLD-NEXT: [[VEC_IND:%.*]] = phi <2 x i32> [ , [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ] -; TAILFOLD-NEXT: [[TMP5:%.*]] = add i32 [[INDEX]], 0 -; TAILFOLD-NEXT: [[TMP6:%.*]] = add i32 [[INDEX]], 1 -; TAILFOLD-NEXT: [[TMP7:%.*]] = icmp slt <2 x i32> [[VEC_IND]], [[BROADCAST_SPLAT]] -; TAILFOLD-NEXT: [[TMP8:%.*]] = sext i32 [[TMP5]] to i64 -; TAILFOLD-NEXT: [[TMP9:%.*]] = getelementptr inbounds i16, i16* [[P:%.*]], i64 [[TMP8]] -; TAILFOLD-NEXT: [[TMP10:%.*]] = getelementptr inbounds i16, i16* [[TMP9]], i32 0 -; TAILFOLD-NEXT: [[TMP11:%.*]] = bitcast i16* [[TMP10]] to <2 x i16>* -; TAILFOLD-NEXT: store <2 x i16> zeroinitializer, <2 x i16>* [[TMP11]], align 4 -; TAILFOLD-NEXT: [[INDEX_NEXT]] = add i32 [[INDEX]], 2 -; TAILFOLD-NEXT: [[VEC_IND_NEXT]] = add <2 x i32> [[VEC_IND]], -; TAILFOLD-NEXT: [[TMP12:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]] -; TAILFOLD-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], [[LOOP6:!llvm.loop !.*]] -; TAILFOLD: middle.block: -; TAILFOLD-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[TMP2]], [[N_VEC]] -; TAILFOLD-NEXT: br i1 [[CMP_N]], label [[IF_END:%.*]], label [[SCALAR_PH]] -; TAILFOLD: scalar.ph: -; TAILFOLD-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ] ; TAILFOLD-NEXT: br label [[FOR_COND:%.*]] ; TAILFOLD: for.cond: -; TAILFOLD-NEXT: [[I:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INC:%.*]], [[FOR_BODY:%.*]] ] -; TAILFOLD-NEXT: [[CMP:%.*]] = icmp slt i32 [[I]], [[N]] -; TAILFOLD-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[IF_END]] +; TAILFOLD-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY:%.*]] ] +; TAILFOLD-NEXT: [[CMP:%.*]] = icmp slt i32 [[I]], [[N:%.*]] +; TAILFOLD-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[IF_END:%.*]] ; TAILFOLD: for.body: ; TAILFOLD-NEXT: [[IPROM:%.*]] = sext i32 [[I]] to i64 -; TAILFOLD-NEXT: [[B:%.*]] = getelementptr inbounds i16, i16* [[P]], i64 [[IPROM]] +; TAILFOLD-NEXT: [[B:%.*]] = getelementptr inbounds i16, i16* [[P:%.*]], i64 [[IPROM]] ; TAILFOLD-NEXT: store i16 0, i16* [[B]], align 4 ; TAILFOLD-NEXT: [[INC]] = add nsw i32 [[I]], 1 ; TAILFOLD-NEXT: [[CMP2:%.*]] = icmp slt i32 [[I]], 2096 -; TAILFOLD-NEXT: br i1 [[CMP2]], label [[FOR_COND]], label [[IF_END]], [[LOOP7:!llvm.loop !.*]] +; TAILFOLD-NEXT: br i1 [[CMP2]], label [[FOR_COND]], label [[IF_END]] ; TAILFOLD: if.end: ; TAILFOLD-NEXT: ret void ;