brintos

brintos / llvm-project-archived public Read only

0
0
Text · 52.9 KiB · 04bff3c Raw
925 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt -p loop-vectorize -mtriple=x86_64-apple-macosx -S %s | FileCheck %s3 4target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"5 6define i32 @iv_used_widened_and_truncated(ptr %dst, i64 %N) #0 {7; CHECK-LABEL: define i32 @iv_used_widened_and_truncated(8; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) #[[ATTR0:[0-9]+]] {9; CHECK-NEXT:  iter.check:10; CHECK-NEXT:    [[TMP0:%.*]] = add i64 [[N]], 111; CHECK-NEXT:    [[MIN_ITERS_CHECK1:%.*]] = icmp ult i64 [[TMP0]], 412; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK1]], label [[VEC_EPILOG_SCALAR_PH:%.*]], label [[ENTRY:%.*]]13; CHECK:       vector.main.loop.iter.check:14; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP0]], 3215; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]16; CHECK:       vector.ph:17; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[TMP0]], 3218; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[TMP0]], [[N_MOD_VF]]19; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]20; CHECK:       vector.body:21; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]22; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <8 x i64> [ <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]23; CHECK-NEXT:    [[VEC_IND4:%.*]] = phi <8 x i32> [ <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT9:%.*]], [[VECTOR_BODY]] ]24; CHECK-NEXT:    [[STEP_ADD:%.*]] = add <8 x i64> [[VEC_IND]], splat (i64 8)25; CHECK-NEXT:    [[STEP_ADD1:%.*]] = add <8 x i64> [[STEP_ADD]], splat (i64 8)26; CHECK-NEXT:    [[STEP_ADD2:%.*]] = add <8 x i64> [[STEP_ADD1]], splat (i64 8)27; CHECK-NEXT:    [[STEP_ADD5:%.*]] = add <8 x i32> [[VEC_IND4]], splat (i32 8)28; CHECK-NEXT:    [[STEP_ADD6:%.*]] = add <8 x i32> [[STEP_ADD5]], splat (i32 8)29; CHECK-NEXT:    [[STEP_ADD7:%.*]] = add <8 x i32> [[STEP_ADD6]], splat (i32 8)30; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr { i32, [8 x i32] }, ptr [[DST]], <8 x i64> [[VEC_IND]]31; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr { i32, [8 x i32] }, ptr [[DST]], <8 x i64> [[STEP_ADD]]32; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr { i32, [8 x i32] }, ptr [[DST]], <8 x i64> [[STEP_ADD1]]33; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr { i32, [8 x i32] }, ptr [[DST]], <8 x i64> [[STEP_ADD2]]34; CHECK-NEXT:    call void @llvm.masked.scatter.v8i32.v8p0(<8 x i32> [[VEC_IND4]], <8 x ptr> align 8 [[TMP1]], <8 x i1> splat (i1 true))35; CHECK-NEXT:    call void @llvm.masked.scatter.v8i32.v8p0(<8 x i32> [[STEP_ADD5]], <8 x ptr> align 8 [[TMP2]], <8 x i1> splat (i1 true))36; CHECK-NEXT:    call void @llvm.masked.scatter.v8i32.v8p0(<8 x i32> [[STEP_ADD6]], <8 x ptr> align 8 [[TMP3]], <8 x i1> splat (i1 true))37; CHECK-NEXT:    call void @llvm.masked.scatter.v8i32.v8p0(<8 x i32> [[STEP_ADD7]], <8 x ptr> align 8 [[TMP4]], <8 x i1> splat (i1 true))38; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 3239; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <8 x i64> [[STEP_ADD2]], splat (i64 8)40; CHECK-NEXT:    [[VEC_IND_NEXT9]] = add <8 x i32> [[STEP_ADD7]], splat (i32 8)41; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]42; CHECK-NEXT:    br i1 [[TMP5]], label [[MIDDLE_BLOCK1:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]43; CHECK:       middle.block:44; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]]45; CHECK-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]46; CHECK:       vec.epilog.iter.check:47; CHECK-NEXT:    [[MIN_EPILOG_ITERS_CHECK:%.*]] = icmp ult i64 [[N_MOD_VF]], 448; CHECK-NEXT:    br i1 [[MIN_EPILOG_ITERS_CHECK]], label [[VEC_EPILOG_SCALAR_PH]], label [[SCALAR_PH]], !prof [[PROF3:![0-9]+]]49; CHECK:       vec.epilog.ph:50; CHECK-NEXT:    [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]51; CHECK-NEXT:    [[N_MOD_VF8:%.*]] = urem i64 [[TMP0]], 452; CHECK-NEXT:    [[N_VEC9:%.*]] = sub i64 [[TMP0]], [[N_MOD_VF8]]53; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[VEC_EPILOG_RESUME_VAL]], i64 054; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <4 x i64> [[DOTSPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer55; CHECK-NEXT:    [[INDUCTION:%.*]] = add <4 x i64> [[DOTSPLAT]], <i64 0, i64 1, i64 2, i64 3>56; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[VEC_EPILOG_RESUME_VAL]] to i3257; CHECK-NEXT:    [[DOTSPLATINSERT14:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 058; CHECK-NEXT:    [[DOTSPLAT15:%.*]] = shufflevector <4 x i32> [[DOTSPLATINSERT14]], <4 x i32> poison, <4 x i32> zeroinitializer59; CHECK-NEXT:    [[INDUCTION16:%.*]] = add <4 x i32> [[DOTSPLAT15]], <i32 0, i32 1, i32 2, i32 3>60; CHECK-NEXT:    br label [[LOOP:%.*]]61; CHECK:       vec.epilog.vector.body:62; CHECK-NEXT:    [[INDEX11:%.*]] = phi i64 [ [[VEC_EPILOG_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDEX_NEXT19:%.*]], [[LOOP]] ]63; CHECK-NEXT:    [[VEC_IND12:%.*]] = phi <4 x i64> [ [[INDUCTION]], [[SCALAR_PH]] ], [ [[VEC_IND_NEXT13:%.*]], [[LOOP]] ]64; CHECK-NEXT:    [[VEC_IND17:%.*]] = phi <4 x i32> [ [[INDUCTION16]], [[SCALAR_PH]] ], [ [[VEC_IND_NEXT18:%.*]], [[LOOP]] ]65; CHECK-NEXT:    [[TMP7:%.*]] = getelementptr { i32, [8 x i32] }, ptr [[DST]], <4 x i64> [[VEC_IND12]]66; CHECK-NEXT:    call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> [[VEC_IND17]], <4 x ptr> align 8 [[TMP7]], <4 x i1> splat (i1 true))67; CHECK-NEXT:    [[INDEX_NEXT19]] = add nuw i64 [[INDEX11]], 468; CHECK-NEXT:    [[VEC_IND_NEXT13]] = add <4 x i64> [[VEC_IND12]], splat (i64 4)69; CHECK-NEXT:    [[VEC_IND_NEXT18]] = add <4 x i32> [[VEC_IND17]], splat (i32 4)70; CHECK-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT19]], [[N_VEC9]]71; CHECK-NEXT:    br i1 [[TMP8]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[LOOP]], !llvm.loop [[LOOP4:![0-9]+]]72; CHECK:       vec.epilog.middle.block:73; CHECK-NEXT:    [[CMP_N20:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC9]]74; CHECK-NEXT:    br i1 [[CMP_N20]], label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]75; CHECK:       vec.epilog.scalar.ph:76; CHECK-NEXT:    [[BC_RESUME_VAL10:%.*]] = phi i64 [ [[N_VEC9]], [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ITER_CHECK:%.*]] ]77; CHECK-NEXT:    br label [[LOOP1:%.*]]78; CHECK:       loop:79; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL10]], [[VEC_EPILOG_SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP1]] ]80; CHECK-NEXT:    [[GEP:%.*]] = getelementptr { i32, [8 x i32] }, ptr [[DST]], i64 [[IV]]81; CHECK-NEXT:    [[T:%.*]] = trunc i64 [[IV]] to i3282; CHECK-NEXT:    store i32 [[T]], ptr [[GEP]], align 883; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 184; CHECK-NEXT:    [[C:%.*]] = icmp eq i64 [[IV]], [[N]]85; CHECK-NEXT:    br i1 [[C]], label [[EXIT]], label [[LOOP1]], !llvm.loop [[LOOP5:![0-9]+]]86; CHECK:       exit:87; CHECK-NEXT:    ret i32 088;89entry:90  br label %loop91 92loop:93  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]94  %gep = getelementptr { i32, [ 8 x i32 ]}, ptr %dst, i64 %iv95  %t = trunc i64 %iv to i3296  store i32 %t, ptr %gep, align 897  %iv.next = add i64 %iv, 198  %c = icmp eq i64 %iv, %N99  br i1 %c, label %exit, label %loop100 101exit:102  ret i32 0103}104 105define void @multiple_truncated_ivs_with_wide_uses(i1 %c, ptr %A, ptr %B) {106; CHECK-LABEL: define void @multiple_truncated_ivs_with_wide_uses(107; CHECK-SAME: i1 [[C:%.*]], ptr [[A:%.*]], ptr [[B:%.*]]) {108; CHECK-NEXT:  entry:109; CHECK-NEXT:    br label [[VECTOR_MEMCHECK:%.*]]110; CHECK:       vector.memcheck:111; CHECK-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, ptr [[A]], i64 130112; CHECK-NEXT:    [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[B]], i64 260113; CHECK-NEXT:    [[BOUND0:%.*]] = icmp ult ptr [[A]], [[SCEVGEP1]]114; CHECK-NEXT:    [[BOUND1:%.*]] = icmp ult ptr [[B]], [[SCEVGEP]]115; CHECK-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]116; CHECK-NEXT:    br i1 [[FOUND_CONFLICT]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]117; CHECK:       vector.ph:118; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]119; CHECK:       vector.body:120; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]121; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]122; CHECK-NEXT:    [[VEC_IND3:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT6:%.*]], [[VECTOR_BODY]] ]123; CHECK-NEXT:    [[STEP_ADD:%.*]] = add <4 x i16> [[VEC_IND]], splat (i16 4)124; CHECK-NEXT:    [[STEP_ADD4:%.*]] = add <4 x i32> [[VEC_IND3]], splat (i32 4)125; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[C]], <4 x i16> [[VEC_IND]], <4 x i16> splat (i16 10)126; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[C]], <4 x i16> [[STEP_ADD]], <4 x i16> splat (i16 10)127; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr i16, ptr [[A]], i64 [[INDEX]]128; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr i16, ptr [[TMP4]], i64 4129; CHECK-NEXT:    store <4 x i16> [[TMP1]], ptr [[TMP4]], align 2, !alias.scope [[META6:![0-9]+]], !noalias [[META9:![0-9]+]]130; CHECK-NEXT:    store <4 x i16> [[TMP2]], ptr [[TMP3]], align 2, !alias.scope [[META6]], !noalias [[META9]]131; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr i32, ptr [[B]], i64 [[INDEX]]132; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr i32, ptr [[TMP8]], i64 4133; CHECK-NEXT:    store <4 x i32> [[VEC_IND3]], ptr [[TMP8]], align 4, !alias.scope [[META9]]134; CHECK-NEXT:    store <4 x i32> [[STEP_ADD4]], ptr [[TMP5]], align 4, !alias.scope [[META9]]135; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8136; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i16> [[STEP_ADD]], splat (i16 4)137; CHECK-NEXT:    [[VEC_IND_NEXT6]] = add <4 x i32> [[STEP_ADD4]], splat (i32 4)138; CHECK-NEXT:    [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64139; CHECK-NEXT:    br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]140; CHECK:       middle.block:141; CHECK-NEXT:    br label [[SCALAR_PH]]142; CHECK:       scalar.ph:143; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ 64, [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_MEMCHECK]] ]144; CHECK-NEXT:    br label [[LOOP:%.*]]145; CHECK:       loop:146; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]147; CHECK-NEXT:    [[IV_16:%.*]] = trunc i64 [[IV]] to i16148; CHECK-NEXT:    [[IV_32:%.*]] = trunc i64 [[IV]] to i32149; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[C]], i16 [[IV_16]], i16 10150; CHECK-NEXT:    [[GEP_A:%.*]] = getelementptr i16, ptr [[A]], i64 [[IV]]151; CHECK-NEXT:    store i16 [[SEL]], ptr [[GEP_A]], align 2152; CHECK-NEXT:    [[GEP_B:%.*]] = getelementptr i32, ptr [[B]], i64 [[IV]]153; CHECK-NEXT:    store i32 [[IV_32]], ptr [[GEP_B]], align 4154; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1155; CHECK-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV]], 64156; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]], !llvm.loop [[LOOP12:![0-9]+]]157; CHECK:       exit:158; CHECK-NEXT:    ret void159;160entry:161  br label %loop162 163loop:164  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]165  %iv.16 = trunc i64 %iv to i16166  %iv.32  = trunc i64 %iv to i32167  %sel = select i1 %c, i16 %iv.16, i16 10168  %gep.A = getelementptr i16, ptr %A, i64 %iv169  store i16 %sel, ptr %gep.A170  %gep.B = getelementptr i32, ptr %B, i64 %iv171  store i32 %iv.32, ptr %gep.B172  %iv.next = add i64 %iv, 1173  %ec = icmp eq i64 %iv, 64174  br i1 %ec, label %exit, label %loop175 176exit:177  ret void178}179 180define void @truncated_ivs_with_wide_and_scalar_uses(i1 %c, ptr %dst) {181; CHECK-LABEL: define void @truncated_ivs_with_wide_and_scalar_uses(182; CHECK-SAME: i1 [[C:%.*]], ptr [[DST:%.*]]) {183; CHECK-NEXT:  entry:184; CHECK-NEXT:    br label [[VECTOR_PH:%.*]]185; CHECK:       vector.ph:186; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]187; CHECK:       vector.body:188; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]189; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <8 x i16> [ <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]190; CHECK-NEXT:    [[STEP_ADD:%.*]] = add <8 x i16> [[VEC_IND]], splat (i16 8)191; CHECK-NEXT:    [[TMP0:%.*]] = trunc i64 [[INDEX]] to i32192; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr i16, ptr [[DST]], i32 [[TMP0]]193; CHECK-NEXT:    [[TMP5:%.*]] = select i1 [[C]], <8 x i16> [[VEC_IND]], <8 x i16> splat (i16 10)194; CHECK-NEXT:    [[TMP6:%.*]] = select i1 [[C]], <8 x i16> [[STEP_ADD]], <8 x i16> splat (i16 10)195; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr i16, ptr [[TMP3]], i64 8196; CHECK-NEXT:    store <8 x i16> [[TMP5]], ptr [[TMP3]], align 2197; CHECK-NEXT:    store <8 x i16> [[TMP6]], ptr [[TMP8]], align 2198; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16199; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <8 x i16> [[STEP_ADD]], splat (i16 8)200; CHECK-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 64201; CHECK-NEXT:    br i1 [[TMP9]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]202; CHECK:       middle.block:203; CHECK-NEXT:    br label [[SCALAR_PH:%.*]]204; CHECK:       scalar.ph:205; CHECK-NEXT:    br label [[LOOP:%.*]]206; CHECK:       loop:207; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 64, [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]208; CHECK-NEXT:    [[IV_16:%.*]] = trunc i64 [[IV]] to i16209; CHECK-NEXT:    [[IV_32:%.*]] = trunc i64 [[IV]] to i32210; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i16, ptr [[DST]], i32 [[IV_32]]211; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[C]], i16 [[IV_16]], i16 10212; CHECK-NEXT:    store i16 [[SEL]], ptr [[GEP]], align 2213; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1214; CHECK-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV]], 64215; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]], !llvm.loop [[LOOP14:![0-9]+]]216; CHECK:       exit:217; CHECK-NEXT:    ret void218;219entry:220  br label %loop221 222loop:223  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]224  %iv.16 = trunc i64 %iv to i16225  %iv.32  = trunc i64 %iv to i32226  %gep = getelementptr i16, ptr %dst, i32 %iv.32227  %sel = select i1 %c, i16 %iv.16, i16 10228  store i16 %sel, ptr %gep229  %iv.next = add i64 %iv, 1230  %ec = icmp eq i64 %iv, 64231  br i1 %ec, label %exit, label %loop232 233exit:234  ret void235}236 237define void @multiple_pointer_ivs_with_scalar_uses_only(ptr %A, ptr %B) #0 {238; CHECK-LABEL: define void @multiple_pointer_ivs_with_scalar_uses_only(239; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) #[[ATTR0]] {240; CHECK-NEXT:  entry:241; CHECK-NEXT:    br label [[VECTOR_MEMCHECK:%.*]]242; CHECK:       vector.memcheck:243; CHECK-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, ptr [[A]], i64 8589934391244; CHECK-NEXT:    [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[B]], i64 4294967196245; CHECK-NEXT:    [[BOUND0:%.*]] = icmp ult ptr [[A]], [[SCEVGEP1]]246; CHECK-NEXT:    [[BOUND1:%.*]] = icmp ult ptr [[B]], [[SCEVGEP]]247; CHECK-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]248; CHECK-NEXT:    br i1 [[FOUND_CONFLICT]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]249; CHECK:       vector.ph:250; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[A]], i64 8589934368251; CHECK-NEXT:    [[IND_END3:%.*]] = getelementptr i8, ptr [[B]], i64 4294967184252; CHECK-NEXT:    [[IND_END5:%.*]] = getelementptr i8, ptr [[B]], i64 4294967184253; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]254; CHECK:       vector.body:255; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]256; CHECK-NEXT:    [[VECTOR_RECUR:%.*]] = phi <16 x i32> [ <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 2048>, [[VECTOR_PH]] ], [ [[TMP22:%.*]], [[VECTOR_BODY]] ]257; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 2258; CHECK-NEXT:    [[TMP0:%.*]] = add i64 [[OFFSET_IDX]], 0259; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[OFFSET_IDX]], 2260; CHECK-NEXT:    [[TMP2:%.*]] = add i64 [[OFFSET_IDX]], 4261; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[OFFSET_IDX]], 6262; CHECK-NEXT:    [[TMP4:%.*]] = add i64 [[OFFSET_IDX]], 8263; CHECK-NEXT:    [[TMP5:%.*]] = add i64 [[OFFSET_IDX]], 10264; CHECK-NEXT:    [[TMP6:%.*]] = add i64 [[OFFSET_IDX]], 12265; CHECK-NEXT:    [[TMP7:%.*]] = add i64 [[OFFSET_IDX]], 14266; CHECK-NEXT:    [[TMP8:%.*]] = add i64 [[OFFSET_IDX]], 16267; CHECK-NEXT:    [[TMP9:%.*]] = add i64 [[OFFSET_IDX]], 18268; CHECK-NEXT:    [[TMP10:%.*]] = add i64 [[OFFSET_IDX]], 20269; CHECK-NEXT:    [[TMP11:%.*]] = add i64 [[OFFSET_IDX]], 22270; CHECK-NEXT:    [[TMP12:%.*]] = add i64 [[OFFSET_IDX]], 24271; CHECK-NEXT:    [[TMP13:%.*]] = add i64 [[OFFSET_IDX]], 26272; CHECK-NEXT:    [[TMP14:%.*]] = add i64 [[OFFSET_IDX]], 28273; CHECK-NEXT:    [[TMP15:%.*]] = add i64 [[OFFSET_IDX]], 30274; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP0]]275; CHECK-NEXT:    [[NEXT_GEP7:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]]276; CHECK-NEXT:    [[NEXT_GEP8:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]]277; CHECK-NEXT:    [[NEXT_GEP9:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP3]]278; CHECK-NEXT:    [[NEXT_GEP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP4]]279; CHECK-NEXT:    [[NEXT_GEP11:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP5]]280; CHECK-NEXT:    [[NEXT_GEP12:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP6]]281; CHECK-NEXT:    [[NEXT_GEP13:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP7]]282; CHECK-NEXT:    [[NEXT_GEP14:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP8]]283; CHECK-NEXT:    [[NEXT_GEP15:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP9]]284; CHECK-NEXT:    [[NEXT_GEP16:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP10]]285; CHECK-NEXT:    [[NEXT_GEP17:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP11]]286; CHECK-NEXT:    [[NEXT_GEP18:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP12]]287; CHECK-NEXT:    [[NEXT_GEP19:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP13]]288; CHECK-NEXT:    [[NEXT_GEP20:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP14]]289; CHECK-NEXT:    [[NEXT_GEP21:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP15]]290; CHECK-NEXT:    [[NEXT_GEP23:%.*]] = getelementptr i8, ptr [[B]], i64 [[INDEX]]291; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[NEXT_GEP23]], align 1, !alias.scope [[META15:![0-9]+]]292; CHECK-NEXT:    [[TMP19:%.*]] = zext <16 x i8> [[WIDE_LOAD]] to <16 x i32>293; CHECK-NEXT:    [[WIDE_LOAD24:%.*]] = load <16 x i8>, ptr [[NEXT_GEP23]], align 1, !alias.scope [[META15]]294; CHECK-NEXT:    [[TMP21:%.*]] = zext <16 x i8> [[WIDE_LOAD24]] to <16 x i32>295; CHECK-NEXT:    [[TMP22]] = add <16 x i32> [[TMP19]], [[TMP21]]296; CHECK-NEXT:    [[TMP23:%.*]] = shufflevector <16 x i32> [[VECTOR_RECUR]], <16 x i32> [[TMP22]], <16 x i32> <i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30>297; CHECK-NEXT:    [[TMP24:%.*]] = lshr <16 x i32> [[TMP23]], splat (i32 1)298; CHECK-NEXT:    [[TMP25:%.*]] = trunc <16 x i32> [[TMP24]] to <16 x i8>299; CHECK-NEXT:    [[TMP26:%.*]] = extractelement <16 x i8> [[TMP25]], i32 0300; CHECK-NEXT:    [[TMP27:%.*]] = extractelement <16 x i8> [[TMP25]], i32 1301; CHECK-NEXT:    [[TMP28:%.*]] = extractelement <16 x i8> [[TMP25]], i32 2302; CHECK-NEXT:    [[TMP29:%.*]] = extractelement <16 x i8> [[TMP25]], i32 3303; CHECK-NEXT:    [[TMP30:%.*]] = extractelement <16 x i8> [[TMP25]], i32 4304; CHECK-NEXT:    [[TMP31:%.*]] = extractelement <16 x i8> [[TMP25]], i32 5305; CHECK-NEXT:    [[TMP32:%.*]] = extractelement <16 x i8> [[TMP25]], i32 6306; CHECK-NEXT:    [[TMP33:%.*]] = extractelement <16 x i8> [[TMP25]], i32 7307; CHECK-NEXT:    [[TMP34:%.*]] = extractelement <16 x i8> [[TMP25]], i32 8308; CHECK-NEXT:    [[TMP35:%.*]] = extractelement <16 x i8> [[TMP25]], i32 9309; CHECK-NEXT:    [[TMP36:%.*]] = extractelement <16 x i8> [[TMP25]], i32 10310; CHECK-NEXT:    [[TMP37:%.*]] = extractelement <16 x i8> [[TMP25]], i32 11311; CHECK-NEXT:    [[TMP38:%.*]] = extractelement <16 x i8> [[TMP25]], i32 12312; CHECK-NEXT:    [[TMP39:%.*]] = extractelement <16 x i8> [[TMP25]], i32 13313; CHECK-NEXT:    [[TMP40:%.*]] = extractelement <16 x i8> [[TMP25]], i32 14314; CHECK-NEXT:    [[TMP41:%.*]] = extractelement <16 x i8> [[TMP25]], i32 15315; CHECK-NEXT:    store i8 [[TMP26]], ptr [[NEXT_GEP]], align 1, !alias.scope [[META18:![0-9]+]], !noalias [[META15]]316; CHECK-NEXT:    store i8 [[TMP27]], ptr [[NEXT_GEP7]], align 1, !alias.scope [[META18]], !noalias [[META15]]317; CHECK-NEXT:    store i8 [[TMP28]], ptr [[NEXT_GEP8]], align 1, !alias.scope [[META18]], !noalias [[META15]]318; CHECK-NEXT:    store i8 [[TMP29]], ptr [[NEXT_GEP9]], align 1, !alias.scope [[META18]], !noalias [[META15]]319; CHECK-NEXT:    store i8 [[TMP30]], ptr [[NEXT_GEP10]], align 1, !alias.scope [[META18]], !noalias [[META15]]320; CHECK-NEXT:    store i8 [[TMP31]], ptr [[NEXT_GEP11]], align 1, !alias.scope [[META18]], !noalias [[META15]]321; CHECK-NEXT:    store i8 [[TMP32]], ptr [[NEXT_GEP12]], align 1, !alias.scope [[META18]], !noalias [[META15]]322; CHECK-NEXT:    store i8 [[TMP33]], ptr [[NEXT_GEP13]], align 1, !alias.scope [[META18]], !noalias [[META15]]323; CHECK-NEXT:    store i8 [[TMP34]], ptr [[NEXT_GEP14]], align 1, !alias.scope [[META18]], !noalias [[META15]]324; CHECK-NEXT:    store i8 [[TMP35]], ptr [[NEXT_GEP15]], align 1, !alias.scope [[META18]], !noalias [[META15]]325; CHECK-NEXT:    store i8 [[TMP36]], ptr [[NEXT_GEP16]], align 1, !alias.scope [[META18]], !noalias [[META15]]326; CHECK-NEXT:    store i8 [[TMP37]], ptr [[NEXT_GEP17]], align 1, !alias.scope [[META18]], !noalias [[META15]]327; CHECK-NEXT:    store i8 [[TMP38]], ptr [[NEXT_GEP18]], align 1, !alias.scope [[META18]], !noalias [[META15]]328; CHECK-NEXT:    store i8 [[TMP39]], ptr [[NEXT_GEP19]], align 1, !alias.scope [[META18]], !noalias [[META15]]329; CHECK-NEXT:    store i8 [[TMP40]], ptr [[NEXT_GEP20]], align 1, !alias.scope [[META18]], !noalias [[META15]]330; CHECK-NEXT:    store i8 [[TMP41]], ptr [[NEXT_GEP21]], align 1, !alias.scope [[META18]], !noalias [[META15]]331; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16332; CHECK-NEXT:    [[TMP42:%.*]] = icmp eq i64 [[INDEX_NEXT]], 4294967184333; CHECK-NEXT:    br i1 [[TMP42]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]334; CHECK:       middle.block:335; CHECK-NEXT:    [[VECTOR_RECUR_EXTRACT:%.*]] = extractelement <16 x i32> [[TMP22]], i32 15336; CHECK-NEXT:    br label [[SCALAR_PH]]337; CHECK:       scalar.ph:338; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ -12, [[MIDDLE_BLOCK]] ], [ 100, [[VECTOR_MEMCHECK]] ]339; CHECK-NEXT:    [[SCALAR_RECUR_INIT:%.*]] = phi i32 [ [[VECTOR_RECUR_EXTRACT]], [[MIDDLE_BLOCK]] ], [ 2048, [[VECTOR_MEMCHECK]] ]340; CHECK-NEXT:    [[BC_RESUME_VAL2:%.*]] = phi ptr [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[A]], [[VECTOR_MEMCHECK]] ]341; CHECK-NEXT:    [[BC_RESUME_VAL4:%.*]] = phi ptr [ [[IND_END3]], [[MIDDLE_BLOCK]] ], [ [[B]], [[VECTOR_MEMCHECK]] ]342; CHECK-NEXT:    [[BC_RESUME_VAL6:%.*]] = phi ptr [ [[IND_END5]], [[MIDDLE_BLOCK]] ], [ [[B]], [[VECTOR_MEMCHECK]] ]343; CHECK-NEXT:    br label [[LOOP:%.*]]344; CHECK:       loop:345; CHECK-NEXT:    [[IV_1:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[DEC:%.*]], [[LOOP]] ]346; CHECK-NEXT:    [[SCALAR_RECUR:%.*]] = phi i32 [ [[SCALAR_RECUR_INIT]], [[SCALAR_PH]] ], [ [[ADD38:%.*]], [[LOOP]] ]347; CHECK-NEXT:    [[PTR_IV_1:%.*]] = phi ptr [ [[BC_RESUME_VAL2]], [[SCALAR_PH]] ], [ [[OUTPTR_0:%.*]], [[LOOP]] ]348; CHECK-NEXT:    [[PTR_IV_2:%.*]] = phi ptr [ [[BC_RESUME_VAL4]], [[SCALAR_PH]] ], [ [[INCDEC_PTR36:%.*]], [[LOOP]] ]349; CHECK-NEXT:    [[PTR_IV_3:%.*]] = phi ptr [ [[BC_RESUME_VAL6]], [[SCALAR_PH]] ], [ [[INCDEC_PTR33:%.*]], [[LOOP]] ]350; CHECK-NEXT:    [[INCDEC_PTR33]] = getelementptr i8, ptr [[PTR_IV_3]], i64 1351; CHECK-NEXT:    [[TMP43:%.*]] = load i8, ptr [[PTR_IV_3]], align 1352; CHECK-NEXT:    [[CONV34:%.*]] = zext i8 [[TMP43]] to i32353; CHECK-NEXT:    [[INCDEC_PTR36]] = getelementptr i8, ptr [[PTR_IV_2]], i64 1354; CHECK-NEXT:    [[TMP44:%.*]] = load i8, ptr [[PTR_IV_2]], align 1355; CHECK-NEXT:    [[CONV37:%.*]] = zext i8 [[TMP44]] to i32356; CHECK-NEXT:    [[ADD38]] = add i32 [[CONV34]], [[CONV37]]357; CHECK-NEXT:    [[SHR42:%.*]] = lshr i32 [[SCALAR_RECUR]], 1358; CHECK-NEXT:    [[CONV43:%.*]] = trunc i32 [[SHR42]] to i8359; CHECK-NEXT:    store i8 [[CONV43]], ptr [[PTR_IV_1]], align 1360; CHECK-NEXT:    [[DEC]] = add i32 [[IV_1]], 1361; CHECK-NEXT:    [[OUTPTR_0]] = getelementptr i8, ptr [[PTR_IV_1]], i64 2362; CHECK-NEXT:    [[CMP30_NOT:%.*]] = icmp eq i32 [[DEC]], 0363; CHECK-NEXT:    br i1 [[CMP30_NOT]], label [[EXIT:%.*]], label [[LOOP]], !llvm.loop [[LOOP21:![0-9]+]]364; CHECK:       exit:365; CHECK-NEXT:    ret void366;367entry:368  br label %loop369 370loop:371  %iv.1 = phi i32 [ 100, %entry ], [ %dec, %loop ]372  %iv.2 = phi i32 [ 2048, %entry ], [ %add38, %loop ]373  %ptr.iv.1 = phi ptr [ %A, %entry ], [ %outptr.0, %loop ]374  %ptr.iv.2 = phi ptr [ %B, %entry ], [ %incdec.ptr36, %loop ]375  %ptr.iv.3 = phi ptr [ %B, %entry ], [ %incdec.ptr33, %loop ]376  %incdec.ptr33 = getelementptr i8, ptr %ptr.iv.3, i64 1377  %0 = load i8, ptr %ptr.iv.3, align 1378  %conv34 = zext i8 %0 to i32379  %incdec.ptr36 = getelementptr i8, ptr %ptr.iv.2, i64 1380  %1 = load i8, ptr %ptr.iv.2, align 1381  %conv37 = zext i8 %1 to i32382  %add38 = add i32 %conv34, %conv37383  %shr42 = lshr i32 %iv.2, 1384  %conv43 = trunc i32 %shr42 to i8385  store i8 %conv43, ptr %ptr.iv.1, align 1386  %dec = add i32 %iv.1, 1387  %outptr.0 = getelementptr i8, ptr %ptr.iv.1, i64 2388  %cmp30.not = icmp eq i32 %dec, 0389  br i1 %cmp30.not, label %exit, label %loop390 391exit:392  ret void393}394 395define i16 @iv_and_step_trunc() {396; CHECK-LABEL: define i16 @iv_and_step_trunc() {397; CHECK-NEXT:  entry:398; CHECK-NEXT:    br label [[VECTOR_PH:%.*]]399; CHECK:       vector.ph:400; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]401; CHECK:       vector.body:402; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]403; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <16 x i64> [ <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]404; CHECK-NEXT:    [[VEC_IND1:%.*]] = phi <16 x i16> [ <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT2:%.*]], [[VECTOR_BODY]] ]405; CHECK-NEXT:    [[TMP0:%.*]] = add <16 x i64> [[VEC_IND]], splat (i64 1)406; CHECK-NEXT:    [[TMP1:%.*]] = trunc <16 x i64> [[TMP0]] to <16 x i16>407; CHECK-NEXT:    [[TMP2:%.*]] = mul <16 x i16> [[VEC_IND1]], [[TMP1]]408; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 16409; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <16 x i64> [[VEC_IND]], splat (i64 16)410; CHECK-NEXT:    [[VEC_IND_NEXT2]] = add <16 x i16> [[VEC_IND1]], splat (i16 16)411; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 96412; CHECK-NEXT:    br i1 [[TMP3]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]413; CHECK:       middle.block:414; CHECK-NEXT:    [[VECTOR_RECUR_EXTRACT:%.*]] = extractelement <16 x i16> [[TMP2]], i32 15415; CHECK-NEXT:    br label [[LOOP:%.*]]416; CHECK:       scalar.ph:417; CHECK-NEXT:    br label [[LOOP1:%.*]]418; CHECK:       loop:419; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 96, [[LOOP]] ], [ [[IV_NEXT:%.*]], [[LOOP1]] ]420; CHECK-NEXT:    [[REC:%.*]] = phi i16 [ [[VECTOR_RECUR_EXTRACT]], [[LOOP]] ], [ [[REC_NEXT:%.*]], [[LOOP1]] ]421; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1422; CHECK-NEXT:    [[TMP4:%.*]] = trunc i64 [[IV]] to i16423; CHECK-NEXT:    [[TMP5:%.*]] = trunc i64 [[IV_NEXT]] to i16424; CHECK-NEXT:    [[REC_NEXT]] = mul i16 [[TMP4]], [[TMP5]]425; CHECK-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV]], 100426; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP1]], !llvm.loop [[LOOP23:![0-9]+]]427; CHECK:       exit:428; CHECK-NEXT:    [[VECTOR_RECUR_EXTRACT_FOR_PHI:%.*]] = phi i16 [ [[REC]], [[LOOP1]] ]429; CHECK-NEXT:    ret i16 [[VECTOR_RECUR_EXTRACT_FOR_PHI]]430;431entry:432  br label %loop433 434loop:435  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]436  %rec = phi i16 [ 0, %entry ], [ %rec.next, %loop ]437  %iv.next = add i64 %iv, 1438  %0 = trunc i64 %iv to i16439  %1 = trunc i64 %iv.next to i16440  %rec.next = mul i16 %0, %1441  %ec = icmp eq i64 %iv, 100442  br i1 %ec, label %exit, label %loop443 444exit:445  ret i16 %rec446}447 448define i32 @test_scalar_predicated_cost(i64 %x, i64 %y, ptr %A) #0 {449; CHECK-LABEL: define i32 @test_scalar_predicated_cost(450; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], ptr [[A:%.*]]) #[[ATTR0]] {451; CHECK-NEXT:  iter.check:452; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]453; CHECK:       vector.main.loop.iter.check:454; CHECK-NEXT:    br i1 false, label [[VEC_EPILOG_PH:%.*]], label [[VECTOR_PH1:%.*]]455; CHECK:       vector.ph:456; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x i64> poison, i64 [[Y]], i64 0457; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x i64> [[BROADCAST_SPLATINSERT]], <8 x i64> poison, <8 x i32> zeroinitializer458; CHECK-NEXT:    [[BROADCAST_SPLATINSERT4:%.*]] = insertelement <8 x i64> poison, i64 [[X]], i64 0459; CHECK-NEXT:    [[BROADCAST_SPLAT5:%.*]] = shufflevector <8 x i64> [[BROADCAST_SPLATINSERT4]], <8 x i64> poison, <8 x i32> zeroinitializer460; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]461; CHECK:       vector.body:462; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH1]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]463; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <8 x i64> [ <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>, [[VECTOR_PH1]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]464; CHECK-NEXT:    [[STEP_ADD:%.*]] = add <8 x i64> [[VEC_IND]], splat (i64 8)465; CHECK-NEXT:    [[STEP_ADD1:%.*]] = add <8 x i64> [[STEP_ADD]], splat (i64 8)466; CHECK-NEXT:    [[STEP_ADD2:%.*]] = add <8 x i64> [[STEP_ADD1]], splat (i64 8)467; CHECK-NEXT:    [[TMP8:%.*]] = icmp ugt <8 x i64> [[VEC_IND]], [[BROADCAST_SPLAT]]468; CHECK-NEXT:    [[TMP9:%.*]] = icmp ugt <8 x i64> [[STEP_ADD]], [[BROADCAST_SPLAT]]469; CHECK-NEXT:    [[TMP10:%.*]] = icmp ugt <8 x i64> [[STEP_ADD1]], [[BROADCAST_SPLAT]]470; CHECK-NEXT:    [[TMP11:%.*]] = icmp ugt <8 x i64> [[STEP_ADD2]], [[BROADCAST_SPLAT]]471; CHECK-NEXT:    [[TMP12:%.*]] = or <8 x i64> [[BROADCAST_SPLAT5]], [[VEC_IND]]472; CHECK-NEXT:    [[TMP13:%.*]] = or <8 x i64> [[BROADCAST_SPLAT5]], [[STEP_ADD]]473; CHECK-NEXT:    [[TMP14:%.*]] = or <8 x i64> [[BROADCAST_SPLAT5]], [[STEP_ADD1]]474; CHECK-NEXT:    [[TMP15:%.*]] = or <8 x i64> [[BROADCAST_SPLAT5]], [[STEP_ADD2]]475; CHECK-NEXT:    [[TMP16:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX]]476; CHECK-NEXT:    [[TMP20:%.*]] = trunc <8 x i64> [[TMP12]] to <8 x i32>477; CHECK-NEXT:    [[TMP21:%.*]] = trunc <8 x i64> [[TMP13]] to <8 x i32>478; CHECK-NEXT:    [[TMP22:%.*]] = trunc <8 x i64> [[TMP14]] to <8 x i32>479; CHECK-NEXT:    [[TMP23:%.*]] = trunc <8 x i64> [[TMP15]] to <8 x i32>480; CHECK-NEXT:    [[TMP25:%.*]] = getelementptr i32, ptr [[TMP16]], i64 8481; CHECK-NEXT:    [[TMP26:%.*]] = getelementptr i32, ptr [[TMP16]], i64 16482; CHECK-NEXT:    [[TMP27:%.*]] = getelementptr i32, ptr [[TMP16]], i64 24483; CHECK-NEXT:    call void @llvm.masked.store.v8i32.p0(<8 x i32> [[TMP20]], ptr align 4 [[TMP16]], <8 x i1> [[TMP8]])484; CHECK-NEXT:    call void @llvm.masked.store.v8i32.p0(<8 x i32> [[TMP21]], ptr align 4 [[TMP25]], <8 x i1> [[TMP9]])485; CHECK-NEXT:    call void @llvm.masked.store.v8i32.p0(<8 x i32> [[TMP22]], ptr align 4 [[TMP26]], <8 x i1> [[TMP10]])486; CHECK-NEXT:    call void @llvm.masked.store.v8i32.p0(<8 x i32> [[TMP23]], ptr align 4 [[TMP27]], <8 x i1> [[TMP11]])487; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 32488; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <8 x i64> [[STEP_ADD2]], splat (i64 8)489; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i64 [[INDEX_NEXT]], 96490; CHECK-NEXT:    br i1 [[TMP28]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]491; CHECK:       middle.block:492; CHECK-NEXT:    br i1 false, label [[EXIT:%.*]], label [[VEC_EPILOG_ITER_CHECK:%.*]]493; CHECK:       vec.epilog.iter.check:494; CHECK-NEXT:    br i1 false, label [[SCALAR_PH]], label [[VEC_EPILOG_PH]], !prof [[PROF3]]495; CHECK:       vec.epilog.ph:496; CHECK-NEXT:    [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i64 [ 96, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_PH]] ]497; CHECK-NEXT:    [[BROADCAST_SPLATINSERT9:%.*]] = insertelement <4 x i64> poison, i64 [[Y]], i64 0498; CHECK-NEXT:    [[BROADCAST_SPLAT10:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT9]], <4 x i64> poison, <4 x i32> zeroinitializer499; CHECK-NEXT:    [[BROADCAST_SPLATINSERT5:%.*]] = insertelement <4 x i64> poison, i64 [[X]], i64 0500; CHECK-NEXT:    [[BROADCAST_SPLAT6:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT5]], <4 x i64> poison, <4 x i32> zeroinitializer501; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[VEC_EPILOG_RESUME_VAL]], i64 0502; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <4 x i64> [[DOTSPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer503; CHECK-NEXT:    [[INDUCTION:%.*]] = add <4 x i64> [[DOTSPLAT]], <i64 0, i64 1, i64 2, i64 3>504; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]505; CHECK:       vec.epilog.vector.body:506; CHECK-NEXT:    [[INDEX4:%.*]] = phi i64 [ [[VEC_EPILOG_RESUME_VAL]], [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT11:%.*]], [[LOOP_HEADER]] ]507; CHECK-NEXT:    [[VEC_IND5:%.*]] = phi <4 x i64> [ [[INDUCTION]], [[VEC_EPILOG_PH]] ], [ [[VEC_IND_NEXT6:%.*]], [[LOOP_HEADER]] ]508; CHECK-NEXT:    [[TMP33:%.*]] = icmp ugt <4 x i64> [[VEC_IND5]], [[BROADCAST_SPLAT10]]509; CHECK-NEXT:    [[TMP34:%.*]] = or <4 x i64> [[BROADCAST_SPLAT6]], [[VEC_IND5]]510; CHECK-NEXT:    [[TMP35:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDEX4]]511; CHECK-NEXT:    [[TMP36:%.*]] = trunc <4 x i64> [[TMP34]] to <4 x i32>512; CHECK-NEXT:    call void @llvm.masked.store.v4i32.p0(<4 x i32> [[TMP36]], ptr align 4 [[TMP35]], <4 x i1> [[TMP33]])513; CHECK-NEXT:    [[INDEX_NEXT11]] = add nuw i64 [[INDEX4]], 4514; CHECK-NEXT:    [[VEC_IND_NEXT6]] = add <4 x i64> [[VEC_IND5]], splat (i64 4)515; CHECK-NEXT:    [[TMP30:%.*]] = icmp eq i64 [[INDEX_NEXT11]], 100516; CHECK-NEXT:    br i1 [[TMP30]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[LOOP_HEADER]], !llvm.loop [[LOOP25:![0-9]+]]517; CHECK:       vec.epilog.middle.block:518; CHECK-NEXT:    br i1 false, label [[EXIT]], label [[SCALAR_PH]]519; CHECK:       vec.epilog.scalar.ph:520; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ 100, [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ 96, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[ITER_CHECK:%.*]] ]521; CHECK-NEXT:    br label [[LOOP_HEADER1:%.*]]522; CHECK:       loop.header:523; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]524; CHECK-NEXT:    [[CMP9_NOT:%.*]] = icmp ule i64 [[IV]], [[Y]]525; CHECK-NEXT:    br i1 [[CMP9_NOT]], label [[LOOP_LATCH]], label [[IF_THEN:%.*]]526; CHECK:       if.then:527; CHECK-NEXT:    [[OR:%.*]] = or i64 [[X]], [[IV]]528; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[A]], i64 [[IV]]529; CHECK-NEXT:    [[T:%.*]] = trunc i64 [[OR]] to i32530; CHECK-NEXT:    store i32 [[T]], ptr [[GEP]], align 4531; CHECK-NEXT:    br label [[LOOP_LATCH]]532; CHECK:       loop.latch:533; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1534; CHECK-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV]], 100535; CHECK-NEXT:    br i1 [[EC]], label [[EXIT]], label [[LOOP_HEADER1]], !llvm.loop [[LOOP26:![0-9]+]]536; CHECK:       exit:537; CHECK-NEXT:    ret i32 0538;539entry:540  br label %loop.header541 542loop.header:543  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]544  %cmp9.not = icmp ule i64 %iv, %y545  br i1 %cmp9.not, label %loop.latch, label %if.then546 547if.then:548  %or = or i64 %x, %iv549  %gep = getelementptr i32, ptr %A, i64 %iv550  %t = trunc i64 %or to i32551  store i32 %t, ptr %gep, align 4552  br label %loop.latch553 554loop.latch:555  %iv.next = add i64 %iv, 1556  %ec = icmp eq i64 %iv, 100557  br i1 %ec, label %exit, label %loop.header558 559exit:560  ret i32 0561}562 563define void @wide_iv_trunc(ptr %dst, i64 %N) {564; CHECK-LABEL: define void @wide_iv_trunc(565; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) {566; CHECK-NEXT:  entry:567; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[N]], 8568; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP_PREHEADER:%.*]], label [[EXIT:%.*]]569; CHECK:       loop.preheader:570; CHECK-NEXT:    [[TMP0:%.*]] = add i64 [[N]], 1571; CHECK-NEXT:    br label [[VECTOR_PH:%.*]]572; CHECK:       vector.ph:573; CHECK-NEXT:    [[N_RND_UP:%.*]] = add i64 [[TMP0]], 3574; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N_RND_UP]], 4575; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]576; CHECK-NEXT:    [[TRIP_COUNT_MINUS_1:%.*]] = sub i64 [[TMP0]], 1577; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[TRIP_COUNT_MINUS_1]], i64 0578; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer579; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]580; CHECK:       vector.body:581; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE6:%.*]] ]582; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_STORE_CONTINUE6]] ]583; CHECK-NEXT:    [[TMP1:%.*]] = trunc i64 [[INDEX]] to i32584; CHECK-NEXT:    [[TMP2:%.*]] = icmp ule <4 x i64> [[VEC_IND]], [[BROADCAST_SPLAT]]585; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <4 x i1> [[TMP2]], i32 0586; CHECK-NEXT:    br i1 [[TMP3]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]587; CHECK:       pred.store.if:588; CHECK-NEXT:    [[TMP4:%.*]] = add i32 [[TMP1]], 0589; CHECK-NEXT:    store i32 [[TMP4]], ptr [[DST]], align 4590; CHECK-NEXT:    br label [[PRED_STORE_CONTINUE]]591; CHECK:       pred.store.continue:592; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x i1> [[TMP2]], i32 1593; CHECK-NEXT:    br i1 [[TMP5]], label [[PRED_STORE_IF1:%.*]], label [[PRED_STORE_CONTINUE2:%.*]]594; CHECK:       pred.store.if1:595; CHECK-NEXT:    [[TMP6:%.*]] = add i32 [[TMP1]], 1596; CHECK-NEXT:    store i32 [[TMP6]], ptr [[DST]], align 4597; CHECK-NEXT:    br label [[PRED_STORE_CONTINUE2]]598; CHECK:       pred.store.continue2:599; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <4 x i1> [[TMP2]], i32 2600; CHECK-NEXT:    br i1 [[TMP7]], label [[PRED_STORE_IF3:%.*]], label [[PRED_STORE_CONTINUE4:%.*]]601; CHECK:       pred.store.if3:602; CHECK-NEXT:    [[TMP8:%.*]] = add i32 [[TMP1]], 2603; CHECK-NEXT:    store i32 [[TMP8]], ptr [[DST]], align 4604; CHECK-NEXT:    br label [[PRED_STORE_CONTINUE4]]605; CHECK:       pred.store.continue4:606; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <4 x i1> [[TMP2]], i32 3607; CHECK-NEXT:    br i1 [[TMP9]], label [[PRED_STORE_IF5:%.*]], label [[PRED_STORE_CONTINUE6]]608; CHECK:       pred.store.if5:609; CHECK-NEXT:    [[TMP10:%.*]] = add i32 [[TMP1]], 3610; CHECK-NEXT:    store i32 [[TMP10]], ptr [[DST]], align 4611; CHECK-NEXT:    br label [[PRED_STORE_CONTINUE6]]612; CHECK:       pred.store.continue6:613; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4614; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 4)615; CHECK-NEXT:    [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]616; CHECK-NEXT:    br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP27:![0-9]+]]617; CHECK:       middle.block:618; CHECK-NEXT:    br label [[LOOP:%.*]]619; CHECK:       exit.loopexit:620; CHECK-NEXT:    br label [[EXIT]]621; CHECK:       exit:622; CHECK-NEXT:    ret void623;624entry:625  %cmp = icmp ult i64 %N, 8626  br i1 %cmp, label %loop, label %exit627 628loop:629  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]630  %iv.trunc = trunc i64 %iv to i32631  store i32 %iv.trunc, ptr %dst, align 4632  %iv.next = add i64 %iv, 1633  %ec = icmp eq i64 %iv, %N634  br i1 %ec, label %exit, label %loop635 636exit:637  ret void638}639 640define void @wide_iv_trunc_reuse(ptr %dst) {641; CHECK-LABEL: define void @wide_iv_trunc_reuse(642; CHECK-SAME: ptr [[DST:%.*]]) {643; CHECK-NEXT:  entry:644; CHECK-NEXT:    br label [[LOOP:%.*]]645; CHECK:       loop:646; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 1, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]647; CHECK-NEXT:    [[IV_2:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[IV_TRUNC:%.*]], [[LOOP]] ]648; CHECK-NEXT:    store i32 [[IV_2]], ptr [[DST]], align 4649; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1650; CHECK-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV]], 0651; CHECK-NEXT:    [[IV_TRUNC]] = trunc i64 [[IV]] to i32652; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]653; CHECK:       exit:654; CHECK-NEXT:    ret void655;656entry:657  br label %loop658 659loop:660  %iv = phi i64 [ 1, %entry ], [ %iv.next, %loop ]661  %iv.2 = phi i32 [ 0, %entry ], [ %iv.trunc, %loop ]662  store i32 %iv.2, ptr %dst, align 4663  %iv.next = add i64 %iv, 1664  %ec = icmp eq i64 %iv, 0665  %iv.trunc = trunc i64 %iv to i32666  br i1 %ec, label %exit, label %loop667 668exit:669  ret void670}671 672define void @wombat(i32 %arg, ptr %dst) #1 {673; CHECK-LABEL: define void @wombat(674; CHECK-SAME: i32 [[ARG:%.*]], ptr [[DST:%.*]]) #[[ATTR1:[0-9]+]] {675; CHECK-NEXT:  entry:676; CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[ARG]], 3677; CHECK-NEXT:    [[ZEXT:%.*]] = zext i32 [[ARG]] to i64678; CHECK-NEXT:    br label [[VECTOR_PH:%.*]]679; CHECK:       vector.ph:680; CHECK-NEXT:    [[TMP0:%.*]] = mul i32 56, [[ARG]]681; CHECK-NEXT:    [[IND_END:%.*]] = add i32 [[MUL]], [[TMP0]]682; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <8 x i32> poison, i32 [[MUL]], i64 0683; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <8 x i32> [[DOTSPLATINSERT]], <8 x i32> poison, <8 x i32> zeroinitializer684; CHECK-NEXT:    [[DOTSPLATINSERT1:%.*]] = insertelement <8 x i32> poison, i32 [[ARG]], i64 0685; CHECK-NEXT:    [[DOTSPLAT2:%.*]] = shufflevector <8 x i32> [[DOTSPLATINSERT1]], <8 x i32> poison, <8 x i32> zeroinitializer686; CHECK-NEXT:    [[TMP1:%.*]] = mul <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>, [[DOTSPLAT2]]687; CHECK-NEXT:    [[INDUCTION:%.*]] = add <8 x i32> [[DOTSPLAT]], [[TMP1]]688; CHECK-NEXT:    [[TMP2:%.*]] = mul i32 [[ARG]], 8689; CHECK-NEXT:    [[DOTSPLATINSERT3:%.*]] = insertelement <8 x i32> poison, i32 [[TMP2]], i64 0690; CHECK-NEXT:    [[DOTSPLAT4:%.*]] = shufflevector <8 x i32> [[DOTSPLATINSERT3]], <8 x i32> poison, <8 x i32> zeroinitializer691; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]692; CHECK:       vector.body:693; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]694; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <8 x i32> [ [[INDUCTION]], [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]695; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = add i64 4, [[INDEX]]696; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr i32, ptr [[DST]], i64 [[OFFSET_IDX]]697; CHECK-NEXT:    [[TMP5:%.*]] = and <8 x i32> [[VEC_IND]], splat (i32 12)698; CHECK-NEXT:    store <8 x i32> [[TMP5]], ptr [[TMP4]], align 4699; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8700; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <8 x i32> [[VEC_IND]], [[DOTSPLAT4]]701; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 56702; CHECK-NEXT:    br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]703; CHECK:       middle.block:704; CHECK-NEXT:    br label [[SCALAR_PH:%.*]]705; CHECK:       scalar.ph:706; CHECK-NEXT:    br label [[LOOP:%.*]]707; CHECK:       loop:708; CHECK-NEXT:    [[PHI:%.*]] = phi i64 [ 60, [[SCALAR_PH]] ], [ [[ADD:%.*]], [[LOOP]] ]709; CHECK-NEXT:    [[PHI2:%.*]] = phi i32 [ [[IND_END]], [[SCALAR_PH]] ], [ [[TRUNC:%.*]], [[LOOP]] ]710; CHECK-NEXT:    [[GETELEMENTPTR:%.*]] = getelementptr i32, ptr [[DST]], i64 [[PHI]]711; CHECK-NEXT:    [[AND:%.*]] = and i32 [[PHI2]], 12712; CHECK-NEXT:    store i32 [[AND]], ptr [[GETELEMENTPTR]], align 4713; CHECK-NEXT:    [[MUL3:%.*]] = mul i64 [[PHI]], [[ZEXT]]714; CHECK-NEXT:    [[ADD]] = add i64 [[PHI]], 1715; CHECK-NEXT:    [[ICMP:%.*]] = icmp ugt i64 [[PHI]], 65716; CHECK-NEXT:    [[TRUNC]] = trunc i64 [[MUL3]] to i32717; CHECK-NEXT:    br i1 [[ICMP]], label [[EXIT:%.*]], label [[LOOP]], !llvm.loop [[LOOP29:![0-9]+]]718; CHECK:       exit:719; CHECK-NEXT:    ret void720;721entry:722  %mul = mul i32 %arg, 3723  %zext = zext i32 %arg to i64724  br label %loop725 726loop:727  %phi = phi i64 [ 4, %entry ], [ %add, %loop ]728  %phi2 = phi i32 [ %mul, %entry ], [ %trunc, %loop ]729  %getelementptr = getelementptr i32, ptr %dst, i64 %phi730  %and = and i32 %phi2, 12731  store i32 %and, ptr %getelementptr, align 4732  %mul3 = mul i64 %phi, %zext733  %add = add i64 %phi, 1734  %icmp = icmp ugt i64 %phi, 65735  %trunc = trunc i64 %mul3 to i32736  br i1 %icmp, label %exit, label %loop737 738exit:739  ret void740}741 742define void @wombat2(i32 %arg, ptr %dst) #1 {743; CHECK-LABEL: define void @wombat2(744; CHECK-SAME: i32 [[ARG:%.*]], ptr [[DST:%.*]]) #[[ATTR1]] {745; CHECK-NEXT:  entry:746; CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[ARG]], 3747; CHECK-NEXT:    [[ZEXT:%.*]] = zext i32 [[ARG]] to i64748; CHECK-NEXT:    br label [[VECTOR_PH:%.*]]749; CHECK:       vector.ph:750; CHECK-NEXT:    [[TMP0:%.*]] = mul i32 56, [[ARG]]751; CHECK-NEXT:    [[IND_END:%.*]] = add i32 [[MUL]], [[TMP0]]752; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <8 x i32> poison, i32 [[MUL]], i64 0753; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <8 x i32> [[DOTSPLATINSERT]], <8 x i32> poison, <8 x i32> zeroinitializer754; CHECK-NEXT:    [[DOTSPLATINSERT1:%.*]] = insertelement <8 x i32> poison, i32 [[ARG]], i64 0755; CHECK-NEXT:    [[DOTSPLAT2:%.*]] = shufflevector <8 x i32> [[DOTSPLATINSERT1]], <8 x i32> poison, <8 x i32> zeroinitializer756; CHECK-NEXT:    [[TMP1:%.*]] = mul <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>, [[DOTSPLAT2]]757; CHECK-NEXT:    [[INDUCTION:%.*]] = add <8 x i32> [[DOTSPLAT]], [[TMP1]]758; CHECK-NEXT:    [[TMP2:%.*]] = mul i32 [[ARG]], 8759; CHECK-NEXT:    [[DOTSPLATINSERT3:%.*]] = insertelement <8 x i32> poison, i32 [[TMP2]], i64 0760; CHECK-NEXT:    [[DOTSPLAT4:%.*]] = shufflevector <8 x i32> [[DOTSPLATINSERT3]], <8 x i32> poison, <8 x i32> zeroinitializer761; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]762; CHECK:       vector.body:763; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]764; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <8 x i32> [ [[INDUCTION]], [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]765; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = add i64 4, [[INDEX]]766; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr i32, ptr [[DST]], i64 [[OFFSET_IDX]]767; CHECK-NEXT:    [[TMP5:%.*]] = and <8 x i32> [[VEC_IND]], splat (i32 12)768; CHECK-NEXT:    store <8 x i32> [[TMP5]], ptr [[TMP4]], align 4769; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8770; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <8 x i32> [[VEC_IND]], [[DOTSPLAT4]]771; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 56772; CHECK-NEXT:    br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP30:![0-9]+]]773; CHECK:       middle.block:774; CHECK-NEXT:    br label [[SCALAR_PH:%.*]]775; CHECK:       scalar.ph:776; CHECK-NEXT:    br label [[LOOP:%.*]]777; CHECK:       loop:778; CHECK-NEXT:    [[PHI:%.*]] = phi i64 [ 60, [[SCALAR_PH]] ], [ [[ADD:%.*]], [[LOOP]] ]779; CHECK-NEXT:    [[PHI2:%.*]] = phi i32 [ [[IND_END]], [[SCALAR_PH]] ], [ [[TRUNC_1:%.*]], [[LOOP]] ]780; CHECK-NEXT:    [[GETELEMENTPTR:%.*]] = getelementptr i32, ptr [[DST]], i64 [[PHI]]781; CHECK-NEXT:    [[AND:%.*]] = and i32 [[PHI2]], 12782; CHECK-NEXT:    store i32 [[AND]], ptr [[GETELEMENTPTR]], align 4783; CHECK-NEXT:    [[MUL3:%.*]] = mul i64 [[PHI]], [[ZEXT]]784; CHECK-NEXT:    [[ADD]] = add i64 [[PHI]], 1785; CHECK-NEXT:    [[ICMP:%.*]] = icmp ugt i64 [[PHI]], 65786; CHECK-NEXT:    [[TRUNC_0:%.*]] = trunc i64 [[MUL3]] to i60787; CHECK-NEXT:    [[TRUNC_1]] = trunc i60 [[TRUNC_0]] to i32788; CHECK-NEXT:    br i1 [[ICMP]], label [[EXIT:%.*]], label [[LOOP]], !llvm.loop [[LOOP31:![0-9]+]]789; CHECK:       exit:790; CHECK-NEXT:    ret void791;792entry:793  %mul = mul i32 %arg, 3794  %zext = zext i32 %arg to i64795  br label %loop796 797loop:798  %phi = phi i64 [ 4, %entry ], [ %add, %loop ]799  %phi2 = phi i32 [ %mul, %entry ], [ %trunc.1, %loop ]800  %getelementptr = getelementptr i32, ptr %dst, i64 %phi801  %and = and i32 %phi2, 12802  store i32 %and, ptr %getelementptr, align 4803  %mul3 = mul i64 %phi, %zext804  %add = add i64 %phi, 1805  %icmp = icmp ugt i64 %phi, 65806  %trunc.0 = trunc i64 %mul3 to i60807  %trunc.1 = trunc i60 %trunc.0 to i32808  br i1 %icmp, label %exit, label %loop809 810exit:811  ret void812}813 814 815define void @with_dead_use(i32 %arg, ptr %dst) #1 {816; CHECK-LABEL: define void @with_dead_use(817; CHECK-SAME: i32 [[ARG:%.*]], ptr [[DST:%.*]]) #[[ATTR1]] {818; CHECK-NEXT:  entry:819; CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[ARG]], 3820; CHECK-NEXT:    [[ZEXT:%.*]] = zext i32 [[ARG]] to i64821; CHECK-NEXT:    br label [[VECTOR_PH:%.*]]822; CHECK:       vector.ph:823; CHECK-NEXT:    [[TMP0:%.*]] = mul i32 56, [[ARG]]824; CHECK-NEXT:    [[IND_END:%.*]] = add i32 [[MUL]], [[TMP0]]825; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <8 x i32> poison, i32 [[MUL]], i64 0826; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <8 x i32> [[DOTSPLATINSERT]], <8 x i32> poison, <8 x i32> zeroinitializer827; CHECK-NEXT:    [[DOTSPLATINSERT1:%.*]] = insertelement <8 x i32> poison, i32 [[ARG]], i64 0828; CHECK-NEXT:    [[DOTSPLAT2:%.*]] = shufflevector <8 x i32> [[DOTSPLATINSERT1]], <8 x i32> poison, <8 x i32> zeroinitializer829; CHECK-NEXT:    [[TMP1:%.*]] = mul <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>, [[DOTSPLAT2]]830; CHECK-NEXT:    [[INDUCTION:%.*]] = add <8 x i32> [[DOTSPLAT]], [[TMP1]]831; CHECK-NEXT:    [[TMP2:%.*]] = mul i32 [[ARG]], 8832; CHECK-NEXT:    [[DOTSPLATINSERT3:%.*]] = insertelement <8 x i32> poison, i32 [[TMP2]], i64 0833; CHECK-NEXT:    [[DOTSPLAT4:%.*]] = shufflevector <8 x i32> [[DOTSPLATINSERT3]], <8 x i32> poison, <8 x i32> zeroinitializer834; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]835; CHECK:       vector.body:836; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]837; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <8 x i32> [ [[INDUCTION]], [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]838; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = add i64 4, [[INDEX]]839; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr i32, ptr [[DST]], i64 [[OFFSET_IDX]]840; CHECK-NEXT:    [[TMP5:%.*]] = and <8 x i32> [[VEC_IND]], splat (i32 12)841; CHECK-NEXT:    store <8 x i32> [[TMP5]], ptr [[TMP4]], align 4842; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8843; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <8 x i32> [[VEC_IND]], [[DOTSPLAT4]]844; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 56845; CHECK-NEXT:    br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP32:![0-9]+]]846; CHECK:       middle.block:847; CHECK-NEXT:    br label [[SCALAR_PH:%.*]]848; CHECK:       scalar.ph:849; CHECK-NEXT:    br label [[LOOP:%.*]]850; CHECK:       loop:851; CHECK-NEXT:    [[PHI:%.*]] = phi i64 [ 60, [[SCALAR_PH]] ], [ [[ADD:%.*]], [[LOOP]] ]852; CHECK-NEXT:    [[PHI2:%.*]] = phi i32 [ [[IND_END]], [[SCALAR_PH]] ], [ [[TRUNC:%.*]], [[LOOP]] ]853; CHECK-NEXT:    [[GETELEMENTPTR:%.*]] = getelementptr i32, ptr [[DST]], i64 [[PHI]]854; CHECK-NEXT:    [[AND:%.*]] = and i32 [[PHI2]], 12855; CHECK-NEXT:    store i32 [[AND]], ptr [[GETELEMENTPTR]], align 4856; CHECK-NEXT:    [[MUL3:%.*]] = mul i64 [[PHI]], [[ZEXT]]857; CHECK-NEXT:    [[ADD]] = add i64 [[PHI]], 1858; CHECK-NEXT:    [[ICMP:%.*]] = icmp ugt i64 [[PHI]], 65859; CHECK-NEXT:    [[TRUNC]] = trunc i64 [[MUL3]] to i32860; CHECK-NEXT:    [[DEAD_AND:%.*]] = and i32 [[TRUNC]], 123861; CHECK-NEXT:    br i1 [[ICMP]], label [[EXIT:%.*]], label [[LOOP]], !llvm.loop [[LOOP33:![0-9]+]]862; CHECK:       exit:863; CHECK-NEXT:    ret void864;865entry:866  %mul = mul i32 %arg, 3867  %zext = zext i32 %arg to i64868  br label %loop869 870loop:871  %phi = phi i64 [ 4, %entry ], [ %add, %loop ]872  %phi2 = phi i32 [ %mul, %entry ], [ %trunc, %loop ]873  %getelementptr = getelementptr i32, ptr %dst, i64 %phi874  %and = and i32 %phi2, 12875  store i32 %and, ptr %getelementptr, align 4876  %mul3 = mul i64 %phi, %zext877  %add = add i64 %phi, 1878  %icmp = icmp ugt i64 %phi, 65879  %trunc = trunc i64 %mul3 to i32880  %dead.and = and i32 %trunc, 123881  br i1 %icmp, label %exit, label %loop882 883exit:884  ret void885}886 887attributes #0 = { "min-legal-vector-width"="0" "target-cpu"="skylake-avx512" }888attributes #1 = { "target-cpu"="skylake-avx512" "target-features"="-avx512f" }889;.890; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}891; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}892; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}893; CHECK: [[PROF3]] = !{!"branch_weights", i32 4, i32 28}894; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}895; CHECK: [[LOOP5]] = distinct !{[[LOOP5]], [[META2]], [[META1]]}896; CHECK: [[META6]] = !{[[META7:![0-9]+]]}897; CHECK: [[META7]] = distinct !{[[META7]], [[META8:![0-9]+]]}898; CHECK: [[META8]] = distinct !{[[META8]], !"LVerDomain"}899; CHECK: [[META9]] = !{[[META10:![0-9]+]]}900; CHECK: [[META10]] = distinct !{[[META10]], [[META8]]}901; CHECK: [[LOOP11]] = distinct !{[[LOOP11]], [[META1]], [[META2]]}902; CHECK: [[LOOP12]] = distinct !{[[LOOP12]], [[META1]]}903; CHECK: [[LOOP13]] = distinct !{[[LOOP13]], [[META1]], [[META2]]}904; CHECK: [[LOOP14]] = distinct !{[[LOOP14]], [[META2]], [[META1]]}905; CHECK: [[META15]] = !{[[META16:![0-9]+]]}906; CHECK: [[META16]] = distinct !{[[META16]], [[META17:![0-9]+]]}907; CHECK: [[META17]] = distinct !{[[META17]], !"LVerDomain"}908; CHECK: [[META18]] = !{[[META19:![0-9]+]]}909; CHECK: [[META19]] = distinct !{[[META19]], [[META17]]}910; CHECK: [[LOOP20]] = distinct !{[[LOOP20]], [[META1]], [[META2]]}911; CHECK: [[LOOP21]] = distinct !{[[LOOP21]], [[META1]]}912; CHECK: [[LOOP22]] = distinct !{[[LOOP22]], [[META1]], [[META2]]}913; CHECK: [[LOOP23]] = distinct !{[[LOOP23]], [[META2]], [[META1]]}914; CHECK: [[LOOP24]] = distinct !{[[LOOP24]], [[META1]], [[META2]]}915; CHECK: [[LOOP25]] = distinct !{[[LOOP25]], [[META1]], [[META2]]}916; CHECK: [[LOOP26]] = distinct !{[[LOOP26]], [[META2]], [[META1]]}917; CHECK: [[LOOP27]] = distinct !{[[LOOP27]], [[META1]], [[META2]]}918; CHECK: [[LOOP28]] = distinct !{[[LOOP28]], [[META1]], [[META2]]}919; CHECK: [[LOOP29]] = distinct !{[[LOOP29]], [[META2]], [[META1]]}920; CHECK: [[LOOP30]] = distinct !{[[LOOP30]], [[META1]], [[META2]]}921; CHECK: [[LOOP31]] = distinct !{[[LOOP31]], [[META2]], [[META1]]}922; CHECK: [[LOOP32]] = distinct !{[[LOOP32]], [[META1]], [[META2]]}923; CHECK: [[LOOP33]] = distinct !{[[LOOP33]], [[META2]], [[META1]]}924;.925