355 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=loop-vectorize -force-vector-width=4 -S | FileCheck %s3; RUN: opt < %s -passes=loop-vectorize -force-vector-width=2 -force-vector-interleave=2 -S | FileCheck %s -check-prefix=VF2UF24; RUN: opt < %s -passes=loop-vectorize -force-vector-width=1 -force-vector-interleave=4 -S | FileCheck %s -check-prefix=VF1UF45 6target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"7 8; Make sure a loop is vectorized correctly with fold-tail when the constant9; trip-count is not a multiple of -force-vector-width and/or10; -force-vector-interleave, but is a multiple of the internally computed MaxVF;11; e.g., when all types are i32 lead to MaxVF=1.12 13define void @pr45679(ptr %A) {14; CHECK-LABEL: @pr45679(15; CHECK-NEXT: entry:16; CHECK-NEXT: br label [[VECTOR_PH:%.*]]17; CHECK: vector.ph:18; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]19; CHECK: vector.body:20; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE6:%.*]] ]21; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i8> [ <i8 0, i8 1, i8 2, i8 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_STORE_CONTINUE6]] ]22; CHECK-NEXT: [[TMP0:%.*]] = icmp ule <4 x i8> [[VEC_IND]], splat (i8 13)23; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i32 024; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]25; CHECK: pred.store.if:26; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[INDEX]], 027; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[TMP2]]28; CHECK-NEXT: store i32 13, ptr [[TMP3]], align 129; CHECK-NEXT: br label [[PRED_STORE_CONTINUE]]30; CHECK: pred.store.continue:31; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x i1> [[TMP0]], i32 132; CHECK-NEXT: br i1 [[TMP4]], label [[PRED_STORE_IF1:%.*]], label [[PRED_STORE_CONTINUE2:%.*]]33; CHECK: pred.store.if1:34; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[INDEX]], 135; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP5]]36; CHECK-NEXT: store i32 13, ptr [[TMP6]], align 137; CHECK-NEXT: br label [[PRED_STORE_CONTINUE2]]38; CHECK: pred.store.continue2:39; CHECK-NEXT: [[TMP7:%.*]] = extractelement <4 x i1> [[TMP0]], i32 240; CHECK-NEXT: br i1 [[TMP7]], label [[PRED_STORE_IF3:%.*]], label [[PRED_STORE_CONTINUE4:%.*]]41; CHECK: pred.store.if3:42; CHECK-NEXT: [[TMP8:%.*]] = add i32 [[INDEX]], 243; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP8]]44; CHECK-NEXT: store i32 13, ptr [[TMP9]], align 145; CHECK-NEXT: br label [[PRED_STORE_CONTINUE4]]46; CHECK: pred.store.continue4:47; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i32 348; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_STORE_IF5:%.*]], label [[PRED_STORE_CONTINUE6]]49; CHECK: pred.store.if5:50; CHECK-NEXT: [[TMP11:%.*]] = add i32 [[INDEX]], 351; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP11]]52; CHECK-NEXT: store i32 13, ptr [[TMP12]], align 153; CHECK-NEXT: br label [[PRED_STORE_CONTINUE6]]54; CHECK: pred.store.continue6:55; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 456; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i8> [[VEC_IND]], splat (i8 4)57; CHECK-NEXT: [[TMP13:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1658; CHECK-NEXT: br i1 [[TMP13]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]59; CHECK: middle.block:60; CHECK-NEXT: br label [[LOOP:%.*]]61; CHECK: exit:62; CHECK-NEXT: ret void63;64; VF2UF2-LABEL: @pr45679(65; VF2UF2-NEXT: entry:66; VF2UF2-NEXT: br label [[VECTOR_PH:%.*]]67; VF2UF2: vector.ph:68; VF2UF2-NEXT: br label [[VECTOR_BODY:%.*]]69; VF2UF2: vector.body:70; VF2UF2-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE7:%.*]] ]71; VF2UF2-NEXT: [[VEC_IND:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_STORE_CONTINUE7]] ]72; VF2UF2-NEXT: [[STEP_ADD:%.*]] = add <2 x i32> [[VEC_IND]], splat (i32 2)73; VF2UF2-NEXT: [[TMP0:%.*]] = icmp ule <2 x i32> [[VEC_IND]], splat (i32 13)74; VF2UF2-NEXT: [[TMP1:%.*]] = icmp ule <2 x i32> [[STEP_ADD]], splat (i32 13)75; VF2UF2-NEXT: [[TMP2:%.*]] = extractelement <2 x i1> [[TMP0]], i32 076; VF2UF2-NEXT: br i1 [[TMP2]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]77; VF2UF2: pred.store.if:78; VF2UF2-NEXT: [[TMP3:%.*]] = add i32 [[INDEX]], 079; VF2UF2-NEXT: [[TMP4:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[TMP3]]80; VF2UF2-NEXT: store i32 13, ptr [[TMP4]], align 181; VF2UF2-NEXT: br label [[PRED_STORE_CONTINUE]]82; VF2UF2: pred.store.continue:83; VF2UF2-NEXT: [[TMP5:%.*]] = extractelement <2 x i1> [[TMP0]], i32 184; VF2UF2-NEXT: br i1 [[TMP5]], label [[PRED_STORE_IF2:%.*]], label [[PRED_STORE_CONTINUE3:%.*]]85; VF2UF2: pred.store.if1:86; VF2UF2-NEXT: [[TMP6:%.*]] = add i32 [[INDEX]], 187; VF2UF2-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP6]]88; VF2UF2-NEXT: store i32 13, ptr [[TMP7]], align 189; VF2UF2-NEXT: br label [[PRED_STORE_CONTINUE3]]90; VF2UF2: pred.store.continue2:91; VF2UF2-NEXT: [[TMP8:%.*]] = extractelement <2 x i1> [[TMP1]], i32 092; VF2UF2-NEXT: br i1 [[TMP8]], label [[PRED_STORE_IF4:%.*]], label [[PRED_STORE_CONTINUE5:%.*]]93; VF2UF2: pred.store.if3:94; VF2UF2-NEXT: [[TMP9:%.*]] = add i32 [[INDEX]], 295; VF2UF2-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP9]]96; VF2UF2-NEXT: store i32 13, ptr [[TMP10]], align 197; VF2UF2-NEXT: br label [[PRED_STORE_CONTINUE5]]98; VF2UF2: pred.store.continue4:99; VF2UF2-NEXT: [[TMP11:%.*]] = extractelement <2 x i1> [[TMP1]], i32 1100; VF2UF2-NEXT: br i1 [[TMP11]], label [[PRED_STORE_IF6:%.*]], label [[PRED_STORE_CONTINUE7]]101; VF2UF2: pred.store.if5:102; VF2UF2-NEXT: [[TMP12:%.*]] = add i32 [[INDEX]], 3103; VF2UF2-NEXT: [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP12]]104; VF2UF2-NEXT: store i32 13, ptr [[TMP13]], align 1105; VF2UF2-NEXT: br label [[PRED_STORE_CONTINUE7]]106; VF2UF2: pred.store.continue6:107; VF2UF2-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4108; VF2UF2-NEXT: [[VEC_IND_NEXT]] = add <2 x i32> [[STEP_ADD]], splat (i32 2)109; VF2UF2-NEXT: [[TMP14:%.*]] = icmp eq i32 [[INDEX_NEXT]], 16110; VF2UF2-NEXT: br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]111; VF2UF2: middle.block:112; VF2UF2-NEXT: br label [[LOOP:%.*]]113; VF2UF2: exit:114; VF2UF2-NEXT: ret void115;116; VF1UF4-LABEL: @pr45679(117; VF1UF4-NEXT: entry:118; VF1UF4-NEXT: br label [[VECTOR_PH:%.*]]119; VF1UF4: vector.ph:120; VF1UF4-NEXT: br label [[VECTOR_BODY:%.*]]121; VF1UF4: vector.body:122; VF1UF4-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE6:%.*]] ]123; VF1UF4-NEXT: [[TMP0:%.*]] = add i32 [[INDEX]], 0124; VF1UF4-NEXT: [[TMP1:%.*]] = add i32 [[INDEX]], 1125; VF1UF4-NEXT: [[TMP2:%.*]] = add i32 [[INDEX]], 2126; VF1UF4-NEXT: [[TMP3:%.*]] = add i32 [[INDEX]], 3127; VF1UF4-NEXT: [[TMP4:%.*]] = icmp ule i32 [[TMP0]], 13128; VF1UF4-NEXT: [[TMP5:%.*]] = icmp ule i32 [[TMP1]], 13129; VF1UF4-NEXT: [[TMP6:%.*]] = icmp ule i32 [[TMP2]], 13130; VF1UF4-NEXT: [[TMP7:%.*]] = icmp ule i32 [[TMP3]], 13131; VF1UF4-NEXT: br i1 [[TMP4]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]132; VF1UF4: pred.store.if:133; VF1UF4-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[TMP0]]134; VF1UF4-NEXT: store i32 13, ptr [[TMP8]], align 1135; VF1UF4-NEXT: br label [[PRED_STORE_CONTINUE]]136; VF1UF4: pred.store.continue:137; VF1UF4-NEXT: br i1 [[TMP5]], label [[PRED_STORE_IF1:%.*]], label [[PRED_STORE_CONTINUE2:%.*]]138; VF1UF4: pred.store.if1:139; VF1UF4-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP1]]140; VF1UF4-NEXT: store i32 13, ptr [[TMP9]], align 1141; VF1UF4-NEXT: br label [[PRED_STORE_CONTINUE2]]142; VF1UF4: pred.store.continue2:143; VF1UF4-NEXT: br i1 [[TMP6]], label [[PRED_STORE_IF3:%.*]], label [[PRED_STORE_CONTINUE4:%.*]]144; VF1UF4: pred.store.if3:145; VF1UF4-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP2]]146; VF1UF4-NEXT: store i32 13, ptr [[TMP10]], align 1147; VF1UF4-NEXT: br label [[PRED_STORE_CONTINUE4]]148; VF1UF4: pred.store.continue4:149; VF1UF4-NEXT: br i1 [[TMP7]], label [[PRED_STORE_IF5:%.*]], label [[PRED_STORE_CONTINUE6]]150; VF1UF4: pred.store.if5:151; VF1UF4-NEXT: [[TMP11:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP3]]152; VF1UF4-NEXT: store i32 13, ptr [[TMP11]], align 1153; VF1UF4-NEXT: br label [[PRED_STORE_CONTINUE6]]154; VF1UF4: pred.store.continue6:155; VF1UF4-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4156; VF1UF4-NEXT: [[TMP12:%.*]] = icmp eq i32 [[INDEX_NEXT]], 16157; VF1UF4-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]158; VF1UF4: middle.block:159; VF1UF4-NEXT: br label [[LOOP:%.*]]160; VF1UF4: exit:161; VF1UF4-NEXT: ret void162;163entry:164 br label %loop165 166loop:167 %riv = phi i32 [ 0, %entry ], [ %rivPlus1, %loop ]168 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %riv169 store i32 13, ptr %arrayidx, align 1170 %rivPlus1 = add nuw nsw i32 %riv, 1171 %cond = icmp eq i32 %rivPlus1, 14172 br i1 %cond, label %exit, label %loop173 174exit:175 ret void176}177 178define void @load_variant(ptr noalias %a, ptr noalias %b) {179; CHECK-LABEL: @load_variant(180; CHECK-NEXT: entry:181; CHECK-NEXT: br label [[VECTOR_PH:%.*]]182; CHECK: vector.ph:183; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]184; CHECK: vector.body:185; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE6:%.*]] ]186; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i8> [ <i8 0, i8 1, i8 2, i8 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_STORE_CONTINUE6]] ]187; CHECK-NEXT: [[TMP0:%.*]] = icmp ule <4 x i8> [[VEC_IND]], splat (i8 13)188; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i32 0189; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]190; CHECK: pred.store.if:191; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[INDEX]], 0192; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[TMP2]]193; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[TMP3]], align 8194; CHECK-NEXT: store i64 [[TMP4]], ptr [[B:%.*]], align 8195; CHECK-NEXT: br label [[PRED_STORE_CONTINUE]]196; CHECK: pred.store.continue:197; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i32 1198; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_STORE_IF1:%.*]], label [[PRED_STORE_CONTINUE2:%.*]]199; CHECK: pred.store.if1:200; CHECK-NEXT: [[TMP7:%.*]] = add i64 [[INDEX]], 1201; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP7]]202; CHECK-NEXT: [[TMP9:%.*]] = load i64, ptr [[TMP8]], align 8203; CHECK-NEXT: store i64 [[TMP9]], ptr [[B]], align 8204; CHECK-NEXT: br label [[PRED_STORE_CONTINUE2]]205; CHECK: pred.store.continue2:206; CHECK-NEXT: [[TMP11:%.*]] = extractelement <4 x i1> [[TMP0]], i32 2207; CHECK-NEXT: br i1 [[TMP11]], label [[PRED_STORE_IF3:%.*]], label [[PRED_STORE_CONTINUE4:%.*]]208; CHECK: pred.store.if3:209; CHECK-NEXT: [[TMP12:%.*]] = add i64 [[INDEX]], 2210; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP12]]211; CHECK-NEXT: [[TMP14:%.*]] = load i64, ptr [[TMP13]], align 8212; CHECK-NEXT: store i64 [[TMP14]], ptr [[B]], align 8213; CHECK-NEXT: br label [[PRED_STORE_CONTINUE4]]214; CHECK: pred.store.continue4:215; CHECK-NEXT: [[TMP16:%.*]] = extractelement <4 x i1> [[TMP0]], i32 3216; CHECK-NEXT: br i1 [[TMP16]], label [[PRED_STORE_IF5:%.*]], label [[PRED_STORE_CONTINUE6]]217; CHECK: pred.store.if5:218; CHECK-NEXT: [[TMP17:%.*]] = add i64 [[INDEX]], 3219; CHECK-NEXT: [[TMP18:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP17]]220; CHECK-NEXT: [[TMP19:%.*]] = load i64, ptr [[TMP18]], align 8221; CHECK-NEXT: store i64 [[TMP19]], ptr [[B]], align 8222; CHECK-NEXT: br label [[PRED_STORE_CONTINUE6]]223; CHECK: pred.store.continue6:224; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4225; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i8> [[VEC_IND]], splat (i8 4)226; CHECK-NEXT: [[TMP20:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16227; CHECK-NEXT: br i1 [[TMP20]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]228; CHECK: middle.block:229; CHECK-NEXT: br label [[FOR_BODY:%.*]]230; CHECK: for.end:231; CHECK-NEXT: ret void232;233; VF2UF2-LABEL: @load_variant(234; VF2UF2-NEXT: entry:235; VF2UF2-NEXT: br label [[VECTOR_PH:%.*]]236; VF2UF2: vector.ph:237; VF2UF2-NEXT: br label [[VECTOR_BODY:%.*]]238; VF2UF2: vector.body:239; VF2UF2-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE7:%.*]] ]240; VF2UF2-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_STORE_CONTINUE7]] ]241; VF2UF2-NEXT: [[STEP_ADD:%.*]] = add <2 x i64> [[VEC_IND]], splat (i64 2)242; VF2UF2-NEXT: [[TMP0:%.*]] = icmp ule <2 x i64> [[VEC_IND]], splat (i64 13)243; VF2UF2-NEXT: [[TMP1:%.*]] = icmp ule <2 x i64> [[STEP_ADD]], splat (i64 13)244; VF2UF2-NEXT: [[TMP2:%.*]] = extractelement <2 x i1> [[TMP0]], i32 0245; VF2UF2-NEXT: br i1 [[TMP2]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]246; VF2UF2: pred.store.if:247; VF2UF2-NEXT: [[TMP3:%.*]] = add i64 [[INDEX]], 0248; VF2UF2-NEXT: [[TMP4:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[TMP3]]249; VF2UF2-NEXT: [[TMP5:%.*]] = load i64, ptr [[TMP4]], align 8250; VF2UF2-NEXT: store i64 [[TMP5]], ptr [[B:%.*]], align 8251; VF2UF2-NEXT: br label [[PRED_STORE_CONTINUE]]252; VF2UF2: pred.store.continue:253; VF2UF2-NEXT: [[TMP7:%.*]] = extractelement <2 x i1> [[TMP0]], i32 1254; VF2UF2-NEXT: br i1 [[TMP7]], label [[PRED_STORE_IF2:%.*]], label [[PRED_STORE_CONTINUE3:%.*]]255; VF2UF2: pred.store.if1:256; VF2UF2-NEXT: [[TMP8:%.*]] = add i64 [[INDEX]], 1257; VF2UF2-NEXT: [[TMP9:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP8]]258; VF2UF2-NEXT: [[TMP10:%.*]] = load i64, ptr [[TMP9]], align 8259; VF2UF2-NEXT: store i64 [[TMP10]], ptr [[B]], align 8260; VF2UF2-NEXT: br label [[PRED_STORE_CONTINUE3]]261; VF2UF2: pred.store.continue2:262; VF2UF2-NEXT: [[TMP12:%.*]] = extractelement <2 x i1> [[TMP1]], i32 0263; VF2UF2-NEXT: br i1 [[TMP12]], label [[PRED_STORE_IF4:%.*]], label [[PRED_STORE_CONTINUE5:%.*]]264; VF2UF2: pred.store.if3:265; VF2UF2-NEXT: [[TMP13:%.*]] = add i64 [[INDEX]], 2266; VF2UF2-NEXT: [[TMP14:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP13]]267; VF2UF2-NEXT: [[TMP15:%.*]] = load i64, ptr [[TMP14]], align 8268; VF2UF2-NEXT: store i64 [[TMP15]], ptr [[B]], align 8269; VF2UF2-NEXT: br label [[PRED_STORE_CONTINUE5]]270; VF2UF2: pred.store.continue4:271; VF2UF2-NEXT: [[TMP17:%.*]] = extractelement <2 x i1> [[TMP1]], i32 1272; VF2UF2-NEXT: br i1 [[TMP17]], label [[PRED_STORE_IF6:%.*]], label [[PRED_STORE_CONTINUE7]]273; VF2UF2: pred.store.if5:274; VF2UF2-NEXT: [[TMP18:%.*]] = add i64 [[INDEX]], 3275; VF2UF2-NEXT: [[TMP19:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP18]]276; VF2UF2-NEXT: [[TMP20:%.*]] = load i64, ptr [[TMP19]], align 8277; VF2UF2-NEXT: store i64 [[TMP20]], ptr [[B]], align 8278; VF2UF2-NEXT: br label [[PRED_STORE_CONTINUE7]]279; VF2UF2: pred.store.continue6:280; VF2UF2-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4281; VF2UF2-NEXT: [[VEC_IND_NEXT]] = add <2 x i64> [[STEP_ADD]], splat (i64 2)282; VF2UF2-NEXT: [[TMP21:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16283; VF2UF2-NEXT: br i1 [[TMP21]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]284; VF2UF2: middle.block:285; VF2UF2-NEXT: br label [[FOR_BODY:%.*]]286; VF2UF2: for.end:287; VF2UF2-NEXT: ret void288;289; VF1UF4-LABEL: @load_variant(290; VF1UF4-NEXT: entry:291; VF1UF4-NEXT: br label [[VECTOR_PH:%.*]]292; VF1UF4: vector.ph:293; VF1UF4-NEXT: br label [[VECTOR_BODY:%.*]]294; VF1UF4: vector.body:295; VF1UF4-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE6:%.*]] ]296; VF1UF4-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0297; VF1UF4-NEXT: [[TMP1:%.*]] = add i64 [[INDEX]], 1298; VF1UF4-NEXT: [[TMP2:%.*]] = add i64 [[INDEX]], 2299; VF1UF4-NEXT: [[TMP3:%.*]] = add i64 [[INDEX]], 3300; VF1UF4-NEXT: [[TMP4:%.*]] = icmp ule i64 [[TMP0]], 13301; VF1UF4-NEXT: [[TMP5:%.*]] = icmp ule i64 [[TMP1]], 13302; VF1UF4-NEXT: [[TMP6:%.*]] = icmp ule i64 [[TMP2]], 13303; VF1UF4-NEXT: [[TMP7:%.*]] = icmp ule i64 [[TMP3]], 13304; VF1UF4-NEXT: br i1 [[TMP4]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]305; VF1UF4: pred.store.if:306; VF1UF4-NEXT: [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[TMP0]]307; VF1UF4-NEXT: [[TMP9:%.*]] = load i64, ptr [[TMP8]], align 8308; VF1UF4-NEXT: store i64 [[TMP9]], ptr [[B:%.*]], align 8309; VF1UF4-NEXT: br label [[PRED_STORE_CONTINUE]]310; VF1UF4: pred.store.continue:311; VF1UF4-NEXT: br i1 [[TMP5]], label [[PRED_STORE_IF1:%.*]], label [[PRED_STORE_CONTINUE2:%.*]]312; VF1UF4: pred.store.if1:313; VF1UF4-NEXT: [[TMP11:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP1]]314; VF1UF4-NEXT: [[TMP12:%.*]] = load i64, ptr [[TMP11]], align 8315; VF1UF4-NEXT: store i64 [[TMP12]], ptr [[B]], align 8316; VF1UF4-NEXT: br label [[PRED_STORE_CONTINUE2]]317; VF1UF4: pred.store.continue2:318; VF1UF4-NEXT: br i1 [[TMP6]], label [[PRED_STORE_IF3:%.*]], label [[PRED_STORE_CONTINUE4:%.*]]319; VF1UF4: pred.store.if3:320; VF1UF4-NEXT: [[TMP14:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP2]]321; VF1UF4-NEXT: [[TMP15:%.*]] = load i64, ptr [[TMP14]], align 8322; VF1UF4-NEXT: store i64 [[TMP15]], ptr [[B]], align 8323; VF1UF4-NEXT: br label [[PRED_STORE_CONTINUE4]]324; VF1UF4: pred.store.continue4:325; VF1UF4-NEXT: br i1 [[TMP7]], label [[PRED_STORE_IF5:%.*]], label [[PRED_STORE_CONTINUE6]]326; VF1UF4: pred.store.if5:327; VF1UF4-NEXT: [[TMP17:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP3]]328; VF1UF4-NEXT: [[TMP18:%.*]] = load i64, ptr [[TMP17]], align 8329; VF1UF4-NEXT: store i64 [[TMP18]], ptr [[B]], align 8330; VF1UF4-NEXT: br label [[PRED_STORE_CONTINUE6]]331; VF1UF4: pred.store.continue6:332; VF1UF4-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4333; VF1UF4-NEXT: [[TMP20:%.*]] = icmp eq i64 [[INDEX_NEXT]], 16334; VF1UF4-NEXT: br i1 [[TMP20]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]335; VF1UF4: middle.block:336; VF1UF4-NEXT: br label [[FOR_BODY:%.*]]337; VF1UF4: for.end:338; VF1UF4-NEXT: ret void339;340entry:341 br label %for.body342 343for.body:344 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]345 %arrayidx = getelementptr inbounds i64, ptr %a, i64 %iv346 %v = load i64, ptr %arrayidx347 store i64 %v, ptr %b348 %iv.next = add nuw nsw i64 %iv, 1349 %exitcond.not = icmp eq i64 %iv.next, 14350 br i1 %exitcond.not, label %for.end, label %for.body351 352for.end:353 ret void354}355