322 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -passes=loop-vectorize -force-vector-interleave=2 -force-vector-width=4 -S | FileCheck %s3 4target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"5 6; Make sure consecutive vector generates correct negative indices.7; PR158828 9define i32 @reverse_induction_i64(i64 %startval, ptr %ptr) {10; CHECK-LABEL: define i32 @reverse_induction_i64(11; CHECK-SAME: i64 [[STARTVAL:%.*]], ptr [[PTR:%.*]]) {12; CHECK-NEXT: [[ENTRY:.*:]]13; CHECK-NEXT: br label %[[VECTOR_PH:.*]]14; CHECK: [[VECTOR_PH]]:15; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]16; CHECK: [[VECTOR_BODY]]:17; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]18; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, %[[VECTOR_PH]] ], [ [[TMP10:%.*]], %[[VECTOR_BODY]] ]19; CHECK-NEXT: [[VEC_PHI2:%.*]] = phi <4 x i32> [ zeroinitializer, %[[VECTOR_PH]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY]] ]20; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i64 [[STARTVAL]], [[INDEX]]21; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[OFFSET_IDX]], -122; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i64 [[TMP3]]23; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i64 024; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 -325; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i64 -426; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP4]], i64 -327; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP7]], align 428; CHECK-NEXT: [[REVERSE:%.*]] = shufflevector <4 x i32> [[WIDE_LOAD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>29; CHECK-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP9]], align 430; CHECK-NEXT: [[REVERSE4:%.*]] = shufflevector <4 x i32> [[WIDE_LOAD3]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>31; CHECK-NEXT: [[TMP10]] = add <4 x i32> [[REVERSE]], [[VEC_PHI]]32; CHECK-NEXT: [[TMP11]] = add <4 x i32> [[REVERSE4]], [[VEC_PHI2]]33; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 834; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 102435; CHECK-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]36; CHECK: [[MIDDLE_BLOCK]]:37; CHECK-NEXT: [[BIN_RDX:%.*]] = add <4 x i32> [[TMP11]], [[TMP10]]38; CHECK-NEXT: [[TMP13:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[BIN_RDX]])39; CHECK-NEXT: br label %[[LOOPEND:.*]]40; CHECK: [[LOOPEND]]:41; CHECK-NEXT: ret i32 [[TMP13]]42;43entry:44 br label %for.body45 46for.body:47 %add.i7 = phi i64 [ %startval, %entry ], [ %add.i, %for.body ]48 %i.06 = phi i32 [ 0, %entry ], [ %inc4, %for.body ]49 %redux5 = phi i32 [ 0, %entry ], [ %inc.redux, %for.body ]50 %add.i = add i64 %add.i7, -151 %kind_.i = getelementptr inbounds i32, ptr %ptr, i64 %add.i52 %tmp.i1 = load i32, ptr %kind_.i, align 453 %inc.redux = add i32 %tmp.i1, %redux554 %inc4 = add i32 %i.06, 155 %exitcond = icmp ne i32 %inc4, 102456 br i1 %exitcond, label %for.body, label %loopend57 58loopend:59 ret i32 %inc.redux60}61 62 63define i32 @reverse_induction_i128(i128 %startval, ptr %ptr) {64; CHECK-LABEL: define i32 @reverse_induction_i128(65; CHECK-SAME: i128 [[STARTVAL:%.*]], ptr [[PTR:%.*]]) {66; CHECK-NEXT: [[ENTRY:.*:]]67; CHECK-NEXT: br label %[[VECTOR_PH:.*]]68; CHECK: [[VECTOR_PH]]:69; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]70; CHECK: [[VECTOR_BODY]]:71; CHECK-NEXT: [[INDEX:%.*]] = phi i128 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]72; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, %[[VECTOR_PH]] ], [ [[TMP10:%.*]], %[[VECTOR_BODY]] ]73; CHECK-NEXT: [[VEC_PHI2:%.*]] = phi <4 x i32> [ zeroinitializer, %[[VECTOR_PH]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY]] ]74; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i128 [[STARTVAL]], [[INDEX]]75; CHECK-NEXT: [[TMP3:%.*]] = add i128 [[OFFSET_IDX]], -176; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i128 [[TMP3]]77; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i64 078; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 -379; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i64 -480; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP4]], i64 -381; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP7]], align 482; CHECK-NEXT: [[REVERSE:%.*]] = shufflevector <4 x i32> [[WIDE_LOAD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>83; CHECK-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP9]], align 484; CHECK-NEXT: [[REVERSE4:%.*]] = shufflevector <4 x i32> [[WIDE_LOAD3]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>85; CHECK-NEXT: [[TMP10]] = add <4 x i32> [[REVERSE]], [[VEC_PHI]]86; CHECK-NEXT: [[TMP11]] = add <4 x i32> [[REVERSE4]], [[VEC_PHI2]]87; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i128 [[INDEX]], 888; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i128 [[INDEX_NEXT]], 102489; CHECK-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]90; CHECK: [[MIDDLE_BLOCK]]:91; CHECK-NEXT: [[BIN_RDX:%.*]] = add <4 x i32> [[TMP11]], [[TMP10]]92; CHECK-NEXT: [[TMP13:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[BIN_RDX]])93; CHECK-NEXT: br label %[[LOOPEND:.*]]94; CHECK: [[LOOPEND]]:95; CHECK-NEXT: ret i32 [[TMP13]]96;97entry:98 br label %for.body99 100for.body:101 %add.i7 = phi i128 [ %startval, %entry ], [ %add.i, %for.body ]102 %i.06 = phi i32 [ 0, %entry ], [ %inc4, %for.body ]103 %redux5 = phi i32 [ 0, %entry ], [ %inc.redux, %for.body ]104 %add.i = add i128 %add.i7, -1105 %kind_.i = getelementptr inbounds i32, ptr %ptr, i128 %add.i106 %tmp.i1 = load i32, ptr %kind_.i, align 4107 %inc.redux = add i32 %tmp.i1, %redux5108 %inc4 = add i32 %i.06, 1109 %exitcond = icmp ne i32 %inc4, 1024110 br i1 %exitcond, label %for.body, label %loopend111 112loopend:113 ret i32 %inc.redux114}115 116 117define i32 @reverse_induction_i16(i16 %startval, ptr %ptr) {118; CHECK-LABEL: define i32 @reverse_induction_i16(119; CHECK-SAME: i16 [[STARTVAL:%.*]], ptr [[PTR:%.*]]) {120; CHECK-NEXT: [[ENTRY:.*:]]121; CHECK-NEXT: br label %[[VECTOR_SCEVCHECK:.*]]122; CHECK: [[VECTOR_SCEVCHECK]]:123; CHECK-NEXT: [[TMP0:%.*]] = add i16 [[STARTVAL]], -1124; CHECK-NEXT: [[TMP1:%.*]] = sub i16 [[TMP0]], 1023125; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i16 [[TMP1]], [[TMP0]]126; CHECK-NEXT: br i1 [[TMP2]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]127; CHECK: [[VECTOR_PH]]:128; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]129; CHECK: [[VECTOR_BODY]]:130; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]131; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, %[[VECTOR_PH]] ], [ [[TMP14:%.*]], %[[VECTOR_BODY]] ]132; CHECK-NEXT: [[VEC_PHI2:%.*]] = phi <4 x i32> [ zeroinitializer, %[[VECTOR_PH]] ], [ [[TMP15:%.*]], %[[VECTOR_BODY]] ]133; CHECK-NEXT: [[DOTCAST:%.*]] = trunc i32 [[INDEX]] to i16134; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i16 [[STARTVAL]], [[DOTCAST]]135; CHECK-NEXT: [[TMP7:%.*]] = add i16 [[OFFSET_IDX]], -1136; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i16 [[TMP7]]137; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[TMP9]], i64 0138; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i64 -3139; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP9]], i64 -4140; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[TMP8]], i64 -3141; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP11]], align 4142; CHECK-NEXT: [[REVERSE:%.*]] = shufflevector <4 x i32> [[WIDE_LOAD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>143; CHECK-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr [[TMP13]], align 4144; CHECK-NEXT: [[REVERSE4:%.*]] = shufflevector <4 x i32> [[WIDE_LOAD3]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>145; CHECK-NEXT: [[TMP14]] = add <4 x i32> [[REVERSE]], [[VEC_PHI]]146; CHECK-NEXT: [[TMP15]] = add <4 x i32> [[REVERSE4]], [[VEC_PHI2]]147; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8148; CHECK-NEXT: [[TMP16:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1024149; CHECK-NEXT: br i1 [[TMP16]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]150; CHECK: [[MIDDLE_BLOCK]]:151; CHECK-NEXT: [[BIN_RDX:%.*]] = add <4 x i32> [[TMP15]], [[TMP14]]152; CHECK-NEXT: [[TMP17:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[BIN_RDX]])153; CHECK-NEXT: br label %[[LOOPEND:.*]]154; CHECK: [[SCALAR_PH]]:155; CHECK-NEXT: br label %[[FOR_BODY:.*]]156; CHECK: [[FOR_BODY]]:157; CHECK-NEXT: [[ADD_I7:%.*]] = phi i16 [ [[STARTVAL]], %[[SCALAR_PH]] ], [ [[ADD_I:%.*]], %[[FOR_BODY]] ]158; CHECK-NEXT: [[I_06:%.*]] = phi i32 [ 0, %[[SCALAR_PH]] ], [ [[INC4:%.*]], %[[FOR_BODY]] ]159; CHECK-NEXT: [[REDUX5:%.*]] = phi i32 [ 0, %[[SCALAR_PH]] ], [ [[INC_REDUX:%.*]], %[[FOR_BODY]] ]160; CHECK-NEXT: [[ADD_I]] = add i16 [[ADD_I7]], -1161; CHECK-NEXT: [[KIND__I:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i16 [[ADD_I]]162; CHECK-NEXT: [[TMP_I1:%.*]] = load i32, ptr [[KIND__I]], align 4163; CHECK-NEXT: [[INC_REDUX]] = add i32 [[TMP_I1]], [[REDUX5]]164; CHECK-NEXT: [[INC4]] = add i32 [[I_06]], 1165; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[INC4]], 1024166; CHECK-NEXT: br i1 [[EXITCOND]], label %[[FOR_BODY]], label %[[LOOPEND]], !llvm.loop [[LOOP5:![0-9]+]]167; CHECK: [[LOOPEND]]:168; CHECK-NEXT: [[INC_REDUX_LCSSA:%.*]] = phi i32 [ [[INC_REDUX]], %[[FOR_BODY]] ], [ [[TMP17]], %[[MIDDLE_BLOCK]] ]169; CHECK-NEXT: ret i32 [[INC_REDUX_LCSSA]]170;171entry:172 br label %for.body173 174for.body:175 %add.i7 = phi i16 [ %startval, %entry ], [ %add.i, %for.body ]176 %i.06 = phi i32 [ 0, %entry ], [ %inc4, %for.body ]177 %redux5 = phi i32 [ 0, %entry ], [ %inc.redux, %for.body ]178 %add.i = add i16 %add.i7, -1179 %kind_.i = getelementptr inbounds i32, ptr %ptr, i16 %add.i180 %tmp.i1 = load i32, ptr %kind_.i, align 4181 %inc.redux = add i32 %tmp.i1, %redux5182 %inc4 = add i32 %i.06, 1183 %exitcond = icmp ne i32 %inc4, 1024184 br i1 %exitcond, label %for.body, label %loopend185 186loopend:187 ret i32 %inc.redux188}189 190 191@a = common global [1024 x i32] zeroinitializer, align 16192 193; We incorrectly transformed this loop into an empty one because we left the194; induction variable in i8 type and truncated the exit value 1024 to 0.195; int a[1024];196;197; void fail() {198; int reverse_induction = 1023;199; unsigned char forward_induction = 0;200; while ((reverse_induction) >= 0) {201; forward_induction++;202; a[reverse_induction] = forward_induction;203; --reverse_induction;204; }205; }206 207 208define void @reverse_forward_induction_i64_i8() {209; CHECK-LABEL: define void @reverse_forward_induction_i64_i8() {210; CHECK-NEXT: [[ENTRY:.*:]]211; CHECK-NEXT: br label %[[VECTOR_PH:.*]]212; CHECK: [[VECTOR_PH]]:213; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]214; CHECK: [[VECTOR_BODY]]:215; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]216; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i8> [ <i8 0, i8 1, i8 2, i8 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]217; CHECK-NEXT: [[STEP_ADD:%.*]] = add <4 x i8> [[VEC_IND]], splat (i8 4)218; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX]]219; CHECK-NEXT: [[TMP2:%.*]] = add <4 x i8> [[VEC_IND]], splat (i8 1)220; CHECK-NEXT: [[TMP3:%.*]] = add <4 x i8> [[STEP_ADD]], splat (i8 1)221; CHECK-NEXT: [[TMP4:%.*]] = zext <4 x i8> [[TMP2]] to <4 x i32>222; CHECK-NEXT: [[TMP5:%.*]] = zext <4 x i8> [[TMP3]] to <4 x i32>223; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1024 x i32], ptr @a, i64 0, i64 [[OFFSET_IDX]]224; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP6]], i64 0225; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP8]], i64 -3226; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[TMP6]], i64 -4227; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds i32, ptr [[TMP7]], i64 -3228; CHECK-NEXT: [[REVERSE:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>229; CHECK-NEXT: store <4 x i32> [[REVERSE]], ptr [[TMP9]], align 4230; CHECK-NEXT: [[REVERSE2:%.*]] = shufflevector <4 x i32> [[TMP5]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>231; CHECK-NEXT: store <4 x i32> [[REVERSE2]], ptr [[TMP11]], align 4232; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8233; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i8> [[STEP_ADD]], splat (i8 4)234; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024235; CHECK-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]236; CHECK: [[MIDDLE_BLOCK]]:237; CHECK-NEXT: br label %[[WHILE_END:.*]]238; CHECK: [[WHILE_END]]:239; CHECK-NEXT: ret void240;241entry:242 br label %while.body243 244while.body:245 %indvars.iv = phi i64 [ 1023, %entry ], [ %indvars.iv.next, %while.body ]246 %forward_induction.05 = phi i8 [ 0, %entry ], [ %inc, %while.body ]247 %inc = add i8 %forward_induction.05, 1248 %conv = zext i8 %inc to i32249 %arrayidx = getelementptr inbounds [1024 x i32], ptr @a, i64 0, i64 %indvars.iv250 store i32 %conv, ptr %arrayidx, align 4251 %indvars.iv.next = add i64 %indvars.iv, -1252 %0 = trunc i64 %indvars.iv to i32253 %cmp = icmp sgt i32 %0, 0254 br i1 %cmp, label %while.body, label %while.end255 256while.end:257 ret void258}259 260 261define void @reverse_forward_induction_i64_i8_signed() {262; CHECK-LABEL: define void @reverse_forward_induction_i64_i8_signed() {263; CHECK-NEXT: [[ENTRY:.*:]]264; CHECK-NEXT: br label %[[VECTOR_PH:.*]]265; CHECK: [[VECTOR_PH]]:266; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]267; CHECK: [[VECTOR_BODY]]:268; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]269; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i8> [ <i8 -127, i8 -126, i8 -125, i8 -124>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]270; CHECK-NEXT: [[STEP_ADD:%.*]] = add <4 x i8> [[VEC_IND]], splat (i8 4)271; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX]]272; CHECK-NEXT: [[TMP2:%.*]] = add <4 x i8> [[VEC_IND]], splat (i8 1)273; CHECK-NEXT: [[TMP3:%.*]] = add <4 x i8> [[STEP_ADD]], splat (i8 1)274; CHECK-NEXT: [[TMP4:%.*]] = sext <4 x i8> [[TMP2]] to <4 x i32>275; CHECK-NEXT: [[TMP5:%.*]] = sext <4 x i8> [[TMP3]] to <4 x i32>276; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1024 x i32], ptr @a, i64 0, i64 [[OFFSET_IDX]]277; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP6]], i64 0278; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP8]], i64 -3279; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[TMP6]], i64 -4280; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds i32, ptr [[TMP7]], i64 -3281; CHECK-NEXT: [[REVERSE:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>282; CHECK-NEXT: store <4 x i32> [[REVERSE]], ptr [[TMP9]], align 4283; CHECK-NEXT: [[REVERSE2:%.*]] = shufflevector <4 x i32> [[TMP5]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>284; CHECK-NEXT: store <4 x i32> [[REVERSE2]], ptr [[TMP11]], align 4285; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8286; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i8> [[STEP_ADD]], splat (i8 4)287; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024288; CHECK-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]289; CHECK: [[MIDDLE_BLOCK]]:290; CHECK-NEXT: br label %[[WHILE_END:.*]]291; CHECK: [[WHILE_END]]:292; CHECK-NEXT: ret void293;294entry:295 br label %while.body296 297while.body:298 %indvars.iv = phi i64 [ 1023, %entry ], [ %indvars.iv.next, %while.body ]299 %forward_induction.05 = phi i8 [ -127, %entry ], [ %inc, %while.body ]300 %inc = add i8 %forward_induction.05, 1301 %conv = sext i8 %inc to i32302 %arrayidx = getelementptr inbounds [1024 x i32], ptr @a, i64 0, i64 %indvars.iv303 store i32 %conv, ptr %arrayidx, align 4304 %indvars.iv.next = add i64 %indvars.iv, -1305 %0 = trunc i64 %indvars.iv to i32306 %cmp = icmp sgt i32 %0, 0307 br i1 %cmp, label %while.body, label %while.end308 309while.end:310 ret void311}312;.313; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}314; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}315; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}316; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META1]], [[META2]]}317; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}318; CHECK: [[LOOP5]] = distinct !{[[LOOP5]], [[META1]]}319; CHECK: [[LOOP6]] = distinct !{[[LOOP6]], [[META1]], [[META2]]}320; CHECK: [[LOOP7]] = distinct !{[[LOOP7]], [[META1]], [[META2]]}321;.322