949 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=loop-vectorize,dce,instcombine -force-vector-width=4 -force-vector-interleave=1 -prefer-predicate-over-epilogue=predicate-else-scalar-epilogue -prefer-predicated-reduction-select -S | FileCheck %s3 4target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"5 6define i32 @reduction_sum_single(ptr noalias nocapture %A) {7; CHECK-LABEL: @reduction_sum_single(8; CHECK-NEXT: entry:9; CHECK-NEXT: br label [[VECTOR_PH:%.*]]10; CHECK: vector.ph:11; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]12; CHECK: vector.body:13; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]14; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]15; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP25:%.*]], [[PRED_LOAD_CONTINUE6]] ]16; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)17; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 018; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]19; CHECK: pred.load.if:20; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[INDEX]]21; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 422; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 023; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]24; CHECK: pred.load.continue:25; CHECK-NEXT: [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]26; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 127; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]28; CHECK: pred.load.if1:29; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i32, ptr [[A]], i32 [[INDEX]]30; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP7]], i32 431; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 432; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 133; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]34; CHECK: pred.load.continue2:35; CHECK-NEXT: [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ]36; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 237; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]38; CHECK: pred.load.if3:39; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i32, ptr [[A]], i32 [[INDEX]]40; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP13]], i32 841; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 442; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 243; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]44; CHECK: pred.load.continue4:45; CHECK-NEXT: [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ]46; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 347; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]48; CHECK: pred.load.if5:49; CHECK-NEXT: [[TMP19:%.*]] = getelementptr i32, ptr [[A]], i32 [[INDEX]]50; CHECK-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP19]], i32 1251; CHECK-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 452; CHECK-NEXT: [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 353; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]54; CHECK: pred.load.continue6:55; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ]56; CHECK-NEXT: [[TMP24:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP23]], <4 x i32> zeroinitializer57; CHECK-NEXT: [[TMP25]] = add <4 x i32> [[VEC_PHI]], [[TMP24]]58; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 459; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)60; CHECK-NEXT: [[TMP26:%.*]] = icmp eq i32 [[INDEX_NEXT]], 26061; CHECK-NEXT: br i1 [[TMP26]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]62; CHECK: middle.block:63; CHECK-NEXT: br label [[DOTLR_PH:%.*]]64; CHECK: ._crit_edge:65; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP25]])66; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]]67;68entry:69 br label %.lr.ph70 71.lr.ph: ; preds = %entry, %.lr.ph72 %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]73 %sum.02 = phi i32 [ %l7, %.lr.ph ], [ 0, %entry ]74 %l2 = getelementptr inbounds i32, ptr %A, i32 %indvars.iv75 %l3 = load i32, ptr %l2, align 476 %l7 = add i32 %sum.02, %l377 %indvars.iv.next = add i32 %indvars.iv, 178 %exitcond = icmp eq i32 %indvars.iv.next, 25779 br i1 %exitcond, label %._crit_edge, label %.lr.ph80 81._crit_edge: ; preds = %.lr.ph82 %sum.0.lcssa = phi i32 [ %l7, %.lr.ph ]83 ret i32 %sum.0.lcssa84}85 86define i32 @reduction_sum(ptr noalias nocapture %A, ptr noalias nocapture %B) {87; CHECK-LABEL: @reduction_sum(88; CHECK-NEXT: entry:89; CHECK-NEXT: br label [[VECTOR_PH:%.*]]90; CHECK: vector.ph:91; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]92; CHECK: vector.body:93; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]94; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]95; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP43:%.*]], [[PRED_LOAD_CONTINUE6]] ]96; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i32> [[VEC_IND]], splat (i32 257)97; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 098; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]99; CHECK: pred.load.if:100; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[INDEX]]101; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4102; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0103; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[INDEX]]104; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4105; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0106; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]107; CHECK: pred.load.continue:108; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]109; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]110; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1111; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]112; CHECK: pred.load.if1:113; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i32 [[INDEX]], 1114; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP11]]115; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4116; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1117; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP11]]118; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4119; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1120; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]121; CHECK: pred.load.continue2:122; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]123; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]124; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2125; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]126; CHECK: pred.load.if3:127; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i32 [[INDEX]], 2128; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP21]]129; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4130; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2131; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP21]]132; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 4133; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2134; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]135; CHECK: pred.load.continue4:136; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]137; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]138; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3139; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]140; CHECK: pred.load.if5:141; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i32 [[INDEX]], 3142; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP31]]143; CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP32]], align 4144; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3145; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP31]]146; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 4147; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3148; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]149; CHECK: pred.load.continue6:150; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]151; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]152; CHECK-NEXT: [[TMP40:%.*]] = add <4 x i32> [[VEC_PHI]], [[VEC_IND]]153; CHECK-NEXT: [[TMP41:%.*]] = add <4 x i32> [[TMP40]], [[TMP38]]154; CHECK-NEXT: [[TMP42:%.*]] = add <4 x i32> [[TMP41]], [[TMP39]]155; CHECK-NEXT: [[TMP43]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP42]], <4 x i32> [[VEC_PHI]]156; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4157; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 4)158; CHECK-NEXT: [[TMP44:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260159; CHECK-NEXT: br i1 [[TMP44]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]160; CHECK: middle.block:161; CHECK-NEXT: br label [[DOTLR_PH:%.*]]162; CHECK: ._crit_edge:163; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP43]])164; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]]165;166entry:167 br label %.lr.ph168 169.lr.ph: ; preds = %entry, %.lr.ph170 %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]171 %sum.02 = phi i32 [ %l9, %.lr.ph ], [ 0, %entry ]172 %l2 = getelementptr inbounds i32, ptr %A, i32 %indvars.iv173 %l3 = load i32, ptr %l2, align 4174 %l4 = getelementptr inbounds i32, ptr %B, i32 %indvars.iv175 %l5 = load i32, ptr %l4, align 4176 %l7 = add i32 %sum.02, %indvars.iv177 %l8 = add i32 %l7, %l3178 %l9 = add i32 %l8, %l5179 %indvars.iv.next = add i32 %indvars.iv, 1180 %exitcond = icmp eq i32 %indvars.iv.next, 257181 br i1 %exitcond, label %._crit_edge, label %.lr.ph182 183._crit_edge: ; preds = %.lr.ph184 %sum.0.lcssa = phi i32 [ %l9, %.lr.ph ]185 ret i32 %sum.0.lcssa186}187 188define i32 @reduction_prod(ptr noalias nocapture %A, ptr noalias nocapture %B) {189; CHECK-LABEL: @reduction_prod(190; CHECK-NEXT: entry:191; CHECK-NEXT: br label [[VECTOR_PH:%.*]]192; CHECK: vector.ph:193; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]194; CHECK: vector.body:195; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]196; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]197; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ splat (i32 1), [[VECTOR_PH]] ], [ [[TMP42:%.*]], [[PRED_LOAD_CONTINUE6]] ]198; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)199; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0200; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]201; CHECK: pred.load.if:202; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[INDEX]]203; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4204; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0205; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[INDEX]]206; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4207; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0208; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]209; CHECK: pred.load.continue:210; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]211; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]212; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1213; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]214; CHECK: pred.load.if1:215; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i32 [[INDEX]], 1216; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP11]]217; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4218; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1219; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP11]]220; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4221; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1222; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]223; CHECK: pred.load.continue2:224; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]225; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]226; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2227; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]228; CHECK: pred.load.if3:229; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i32 [[INDEX]], 2230; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP21]]231; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4232; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2233; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP21]]234; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 4235; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2236; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]237; CHECK: pred.load.continue4:238; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]239; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]240; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3241; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]242; CHECK: pred.load.if5:243; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i32 [[INDEX]], 3244; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP31]]245; CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP32]], align 4246; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3247; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP31]]248; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 4249; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3250; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]251; CHECK: pred.load.continue6:252; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]253; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]254; CHECK-NEXT: [[TMP40:%.*]] = mul <4 x i32> [[VEC_PHI]], [[TMP38]]255; CHECK-NEXT: [[TMP41:%.*]] = mul <4 x i32> [[TMP40]], [[TMP39]]256; CHECK-NEXT: [[TMP42]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP41]], <4 x i32> [[VEC_PHI]]257; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4258; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)259; CHECK-NEXT: [[TMP43:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260260; CHECK-NEXT: br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]261; CHECK: middle.block:262; CHECK-NEXT: br label [[DOTLR_PH:%.*]]263; CHECK: ._crit_edge:264; CHECK-NEXT: [[PROD_0_LCSSA:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[TMP42]])265; CHECK-NEXT: ret i32 [[PROD_0_LCSSA]]266;267entry:268 br label %.lr.ph269 270.lr.ph: ; preds = %entry, %.lr.ph271 %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %entry ]272 %prod.02 = phi i32 [ %l9, %.lr.ph ], [ 1, %entry ]273 %l2 = getelementptr inbounds i32, ptr %A, i32 %indvars.iv274 %l3 = load i32, ptr %l2, align 4275 %l4 = getelementptr inbounds i32, ptr %B, i32 %indvars.iv276 %l5 = load i32, ptr %l4, align 4277 %l8 = mul i32 %prod.02, %l3278 %l9 = mul i32 %l8, %l5279 %indvars.iv.next = add i32 %indvars.iv, 1280 %exitcond = icmp eq i32 %indvars.iv.next, 257281 br i1 %exitcond, label %._crit_edge, label %.lr.ph282 283._crit_edge: ; preds = %.lr.ph284 %prod.0.lcssa = phi i32 [ %l9, %.lr.ph ]285 ret i32 %prod.0.lcssa286}287 288define i32 @reduction_and(ptr nocapture %A, ptr nocapture %B) {289; CHECK-LABEL: @reduction_and(290; CHECK-NEXT: entry:291; CHECK-NEXT: br label [[VECTOR_PH:%.*]]292; CHECK: vector.ph:293; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]294; CHECK: vector.body:295; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]296; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]297; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ splat (i32 -1), [[VECTOR_PH]] ], [ [[TMP42:%.*]], [[PRED_LOAD_CONTINUE6]] ]298; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)299; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0300; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]301; CHECK: pred.load.if:302; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[INDEX]]303; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4304; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0305; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[INDEX]]306; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4307; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0308; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]309; CHECK: pred.load.continue:310; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]311; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]312; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1313; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]314; CHECK: pred.load.if1:315; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i32 [[INDEX]], 1316; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP11]]317; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4318; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1319; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP11]]320; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4321; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1322; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]323; CHECK: pred.load.continue2:324; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]325; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]326; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2327; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]328; CHECK: pred.load.if3:329; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i32 [[INDEX]], 2330; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP21]]331; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4332; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2333; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP21]]334; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 4335; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2336; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]337; CHECK: pred.load.continue4:338; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]339; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]340; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3341; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]342; CHECK: pred.load.if5:343; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i32 [[INDEX]], 3344; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP31]]345; CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP32]], align 4346; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3347; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP31]]348; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 4349; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3350; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]351; CHECK: pred.load.continue6:352; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]353; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]354; CHECK-NEXT: [[TMP40:%.*]] = and <4 x i32> [[TMP38]], [[TMP39]]355; CHECK-NEXT: [[TMP41:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP40]], <4 x i32> splat (i32 -1)356; CHECK-NEXT: [[TMP42]] = and <4 x i32> [[VEC_PHI]], [[TMP41]]357; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4358; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)359; CHECK-NEXT: [[TMP43:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260360; CHECK-NEXT: br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]361; CHECK: middle.block:362; CHECK-NEXT: br label [[FOR_BODY:%.*]]363; CHECK: for.end:364; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> [[TMP42]])365; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]]366;367entry:368 br label %for.body369 370for.body: ; preds = %entry, %for.body371 %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]372 %result.08 = phi i32 [ %and, %for.body ], [ -1, %entry ]373 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %indvars.iv374 %l0 = load i32, ptr %arrayidx, align 4375 %arrayidx2 = getelementptr inbounds i32, ptr %B, i32 %indvars.iv376 %l1 = load i32, ptr %arrayidx2, align 4377 %add = and i32 %result.08, %l0378 %and = and i32 %add, %l1379 %indvars.iv.next = add i32 %indvars.iv, 1380 %exitcond = icmp eq i32 %indvars.iv.next, 257381 br i1 %exitcond, label %for.end, label %for.body382 383for.end: ; preds = %for.body, %entry384 %result.0.lcssa = phi i32 [ %and, %for.body ]385 ret i32 %result.0.lcssa386}387 388define i32 @reduction_or(ptr nocapture %A, ptr nocapture %B) {389; CHECK-LABEL: @reduction_or(390; CHECK-NEXT: entry:391; CHECK-NEXT: br label [[VECTOR_PH:%.*]]392; CHECK: vector.ph:393; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]394; CHECK: vector.body:395; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]396; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]397; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP42:%.*]], [[PRED_LOAD_CONTINUE6]] ]398; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)399; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0400; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]401; CHECK: pred.load.if:402; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[INDEX]]403; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4404; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0405; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[INDEX]]406; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4407; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0408; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]409; CHECK: pred.load.continue:410; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]411; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]412; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1413; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]414; CHECK: pred.load.if1:415; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i32 [[INDEX]], 1416; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP11]]417; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4418; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1419; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP11]]420; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4421; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1422; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]423; CHECK: pred.load.continue2:424; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]425; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]426; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2427; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]428; CHECK: pred.load.if3:429; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i32 [[INDEX]], 2430; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP21]]431; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4432; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2433; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP21]]434; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 4435; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2436; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]437; CHECK: pred.load.continue4:438; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]439; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]440; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3441; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]442; CHECK: pred.load.if5:443; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i32 [[INDEX]], 3444; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP31]]445; CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP32]], align 4446; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3447; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP31]]448; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 4449; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3450; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]451; CHECK: pred.load.continue6:452; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]453; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]454; CHECK-NEXT: [[TMP40:%.*]] = add nsw <4 x i32> [[TMP39]], [[TMP38]]455; CHECK-NEXT: [[TMP41:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP40]], <4 x i32> zeroinitializer456; CHECK-NEXT: [[TMP42]] = or <4 x i32> [[VEC_PHI]], [[TMP41]]457; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4458; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)459; CHECK-NEXT: [[TMP43:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260460; CHECK-NEXT: br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]461; CHECK: middle.block:462; CHECK-NEXT: br label [[FOR_BODY:%.*]]463; CHECK: for.end:464; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP42]])465; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]]466;467entry:468 br label %for.body469 470for.body: ; preds = %entry, %for.body471 %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]472 %result.08 = phi i32 [ %or, %for.body ], [ 0, %entry ]473 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %indvars.iv474 %l0 = load i32, ptr %arrayidx, align 4475 %arrayidx2 = getelementptr inbounds i32, ptr %B, i32 %indvars.iv476 %l1 = load i32, ptr %arrayidx2, align 4477 %add = add nsw i32 %l1, %l0478 %or = or i32 %add, %result.08479 %indvars.iv.next = add i32 %indvars.iv, 1480 %exitcond = icmp eq i32 %indvars.iv.next, 257481 br i1 %exitcond, label %for.end, label %for.body482 483for.end: ; preds = %for.body, %entry484 %result.0.lcssa = phi i32 [ %or, %for.body ]485 ret i32 %result.0.lcssa486}487 488define i32 @reduction_xor(ptr nocapture %A, ptr nocapture %B) {489; CHECK-LABEL: @reduction_xor(490; CHECK-NEXT: entry:491; CHECK-NEXT: br label [[VECTOR_PH:%.*]]492; CHECK: vector.ph:493; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]494; CHECK: vector.body:495; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]496; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]497; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP42:%.*]], [[PRED_LOAD_CONTINUE6]] ]498; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)499; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0500; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]501; CHECK: pred.load.if:502; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[INDEX]]503; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4504; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0505; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[INDEX]]506; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4507; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> poison, i32 [[TMP6]], i64 0508; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]509; CHECK: pred.load.continue:510; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]511; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]512; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1513; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]514; CHECK: pred.load.if1:515; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i32 [[INDEX]], 1516; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP11]]517; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4518; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP8]], i32 [[TMP13]], i64 1519; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP11]]520; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4521; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP16]], i64 1522; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]523; CHECK: pred.load.continue2:524; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x i32> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]525; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]526; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2527; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]528; CHECK: pred.load.if3:529; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i32 [[INDEX]], 2530; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP21]]531; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4532; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP18]], i32 [[TMP23]], i64 2533; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP21]]534; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 4535; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i32> [[TMP19]], i32 [[TMP26]], i64 2536; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]537; CHECK: pred.load.continue4:538; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x i32> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]539; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]540; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3541; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]542; CHECK: pred.load.if5:543; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i32 [[INDEX]], 3544; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[TMP31]]545; CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP32]], align 4546; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP33]], i64 3547; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[TMP31]]548; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 4549; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x i32> [[TMP29]], i32 [[TMP36]], i64 3550; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]551; CHECK: pred.load.continue6:552; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x i32> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]553; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x i32> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]554; CHECK-NEXT: [[TMP40:%.*]] = add nsw <4 x i32> [[TMP39]], [[TMP38]]555; CHECK-NEXT: [[TMP41:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP40]], <4 x i32> zeroinitializer556; CHECK-NEXT: [[TMP42]] = xor <4 x i32> [[VEC_PHI]], [[TMP41]]557; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4558; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)559; CHECK-NEXT: [[TMP43:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260560; CHECK-NEXT: br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]561; CHECK: middle.block:562; CHECK-NEXT: br label [[FOR_BODY:%.*]]563; CHECK: for.end:564; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> [[TMP42]])565; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]]566;567entry:568 br label %for.body569 570for.body: ; preds = %entry, %for.body571 %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]572 %result.08 = phi i32 [ %xor, %for.body ], [ 0, %entry ]573 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %indvars.iv574 %l0 = load i32, ptr %arrayidx, align 4575 %arrayidx2 = getelementptr inbounds i32, ptr %B, i32 %indvars.iv576 %l1 = load i32, ptr %arrayidx2, align 4577 %add = add nsw i32 %l1, %l0578 %xor = xor i32 %add, %result.08579 %indvars.iv.next = add i32 %indvars.iv, 1580 %exitcond = icmp eq i32 %indvars.iv.next, 257581 br i1 %exitcond, label %for.end, label %for.body582 583for.end: ; preds = %for.body, %entry584 %result.0.lcssa = phi i32 [ %xor, %for.body ]585 ret i32 %result.0.lcssa586}587 588define float @reduction_fadd(ptr nocapture %A, ptr nocapture %B) {589; CHECK-LABEL: @reduction_fadd(590; CHECK-NEXT: entry:591; CHECK-NEXT: br label [[VECTOR_PH:%.*]]592; CHECK: vector.ph:593; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]594; CHECK: vector.body:595; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]596; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]597; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x float> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP42:%.*]], [[PRED_LOAD_CONTINUE6]] ]598; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)599; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0600; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]601; CHECK: pred.load.if:602; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A:%.*]], i32 [[INDEX]]603; CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[TMP2]], align 4604; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> poison, float [[TMP3]], i64 0605; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[B:%.*]], i32 [[INDEX]]606; CHECK-NEXT: [[TMP6:%.*]] = load float, ptr [[TMP5]], align 4607; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x float> poison, float [[TMP6]], i64 0608; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]609; CHECK: pred.load.continue:610; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]611; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]612; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1613; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]614; CHECK: pred.load.if1:615; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i32 [[INDEX]], 1616; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds float, ptr [[A]], i32 [[TMP11]]617; CHECK-NEXT: [[TMP13:%.*]] = load float, ptr [[TMP12]], align 4618; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x float> [[TMP8]], float [[TMP13]], i64 1619; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds float, ptr [[B]], i32 [[TMP11]]620; CHECK-NEXT: [[TMP16:%.*]] = load float, ptr [[TMP15]], align 4621; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x float> [[TMP9]], float [[TMP16]], i64 1622; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]623; CHECK: pred.load.continue2:624; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x float> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]625; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x float> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]626; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2627; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]628; CHECK: pred.load.if3:629; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i32 [[INDEX]], 2630; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds float, ptr [[A]], i32 [[TMP21]]631; CHECK-NEXT: [[TMP23:%.*]] = load float, ptr [[TMP22]], align 4632; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x float> [[TMP18]], float [[TMP23]], i64 2633; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds float, ptr [[B]], i32 [[TMP21]]634; CHECK-NEXT: [[TMP26:%.*]] = load float, ptr [[TMP25]], align 4635; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x float> [[TMP19]], float [[TMP26]], i64 2636; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]637; CHECK: pred.load.continue4:638; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x float> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]639; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x float> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]640; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3641; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]642; CHECK: pred.load.if5:643; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i32 [[INDEX]], 3644; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds float, ptr [[A]], i32 [[TMP31]]645; CHECK-NEXT: [[TMP33:%.*]] = load float, ptr [[TMP32]], align 4646; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x float> [[TMP28]], float [[TMP33]], i64 3647; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds float, ptr [[B]], i32 [[TMP31]]648; CHECK-NEXT: [[TMP36:%.*]] = load float, ptr [[TMP35]], align 4649; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x float> [[TMP29]], float [[TMP36]], i64 3650; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]651; CHECK: pred.load.continue6:652; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x float> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]653; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x float> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]654; CHECK-NEXT: [[TMP40:%.*]] = fadd fast <4 x float> [[VEC_PHI]], [[TMP38]]655; CHECK-NEXT: [[TMP41:%.*]] = fadd fast <4 x float> [[TMP40]], [[TMP39]]656; CHECK-NEXT: [[TMP42]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP41]], <4 x float> [[VEC_PHI]]657; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4658; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)659; CHECK-NEXT: [[TMP43:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260660; CHECK-NEXT: br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]661; CHECK: middle.block:662; CHECK-NEXT: br label [[FOR_BODY:%.*]]663; CHECK: for.end:664; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[TMP42]])665; CHECK-NEXT: ret float [[RESULT_0_LCSSA]]666;667entry:668 br label %for.body669 670for.body: ; preds = %entry, %for.body671 %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]672 %result.08 = phi float [ %fadd, %for.body ], [ 0.0, %entry ]673 %arrayidx = getelementptr inbounds float, ptr %A, i32 %indvars.iv674 %l0 = load float, ptr %arrayidx, align 4675 %arrayidx2 = getelementptr inbounds float, ptr %B, i32 %indvars.iv676 %l1 = load float, ptr %arrayidx2, align 4677 %add = fadd fast float %result.08, %l0678 %fadd = fadd fast float %add, %l1679 %indvars.iv.next = add i32 %indvars.iv, 1680 %exitcond = icmp eq i32 %indvars.iv.next, 257681 br i1 %exitcond, label %for.end, label %for.body682 683for.end: ; preds = %for.body, %entry684 %result.0.lcssa = phi float [ %fadd, %for.body ]685 ret float %result.0.lcssa686}687 688define float @reduction_fmul(ptr nocapture %A, ptr nocapture %B) {689; CHECK-LABEL: @reduction_fmul(690; CHECK-NEXT: entry:691; CHECK-NEXT: br label [[VECTOR_PH:%.*]]692; CHECK: vector.ph:693; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]694; CHECK: vector.body:695; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]696; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]697; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x float> [ <float 0.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, [[VECTOR_PH]] ], [ [[TMP42:%.*]], [[PRED_LOAD_CONTINUE6]] ]698; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)699; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0700; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]701; CHECK: pred.load.if:702; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A:%.*]], i32 [[INDEX]]703; CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[TMP2]], align 4704; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> poison, float [[TMP3]], i64 0705; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[B:%.*]], i32 [[INDEX]]706; CHECK-NEXT: [[TMP6:%.*]] = load float, ptr [[TMP5]], align 4707; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x float> poison, float [[TMP6]], i64 0708; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]709; CHECK: pred.load.continue:710; CHECK-NEXT: [[TMP8:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]711; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x float> [ poison, [[VECTOR_BODY]] ], [ [[TMP7]], [[PRED_LOAD_IF]] ]712; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1713; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]714; CHECK: pred.load.if1:715; CHECK-NEXT: [[TMP11:%.*]] = or disjoint i32 [[INDEX]], 1716; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds float, ptr [[A]], i32 [[TMP11]]717; CHECK-NEXT: [[TMP13:%.*]] = load float, ptr [[TMP12]], align 4718; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x float> [[TMP8]], float [[TMP13]], i64 1719; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds float, ptr [[B]], i32 [[TMP11]]720; CHECK-NEXT: [[TMP16:%.*]] = load float, ptr [[TMP15]], align 4721; CHECK-NEXT: [[TMP17:%.*]] = insertelement <4 x float> [[TMP9]], float [[TMP16]], i64 1722; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]723; CHECK: pred.load.continue2:724; CHECK-NEXT: [[TMP18:%.*]] = phi <4 x float> [ [[TMP8]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]725; CHECK-NEXT: [[TMP19:%.*]] = phi <4 x float> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP17]], [[PRED_LOAD_IF1]] ]726; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2727; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]728; CHECK: pred.load.if3:729; CHECK-NEXT: [[TMP21:%.*]] = or disjoint i32 [[INDEX]], 2730; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds float, ptr [[A]], i32 [[TMP21]]731; CHECK-NEXT: [[TMP23:%.*]] = load float, ptr [[TMP22]], align 4732; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x float> [[TMP18]], float [[TMP23]], i64 2733; CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds float, ptr [[B]], i32 [[TMP21]]734; CHECK-NEXT: [[TMP26:%.*]] = load float, ptr [[TMP25]], align 4735; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x float> [[TMP19]], float [[TMP26]], i64 2736; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]737; CHECK: pred.load.continue4:738; CHECK-NEXT: [[TMP28:%.*]] = phi <4 x float> [ [[TMP18]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP24]], [[PRED_LOAD_IF3]] ]739; CHECK-NEXT: [[TMP29:%.*]] = phi <4 x float> [ [[TMP19]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP27]], [[PRED_LOAD_IF3]] ]740; CHECK-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3741; CHECK-NEXT: br i1 [[TMP30]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]742; CHECK: pred.load.if5:743; CHECK-NEXT: [[TMP31:%.*]] = or disjoint i32 [[INDEX]], 3744; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds float, ptr [[A]], i32 [[TMP31]]745; CHECK-NEXT: [[TMP33:%.*]] = load float, ptr [[TMP32]], align 4746; CHECK-NEXT: [[TMP34:%.*]] = insertelement <4 x float> [[TMP28]], float [[TMP33]], i64 3747; CHECK-NEXT: [[TMP35:%.*]] = getelementptr inbounds float, ptr [[B]], i32 [[TMP31]]748; CHECK-NEXT: [[TMP36:%.*]] = load float, ptr [[TMP35]], align 4749; CHECK-NEXT: [[TMP37:%.*]] = insertelement <4 x float> [[TMP29]], float [[TMP36]], i64 3750; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]751; CHECK: pred.load.continue6:752; CHECK-NEXT: [[TMP38:%.*]] = phi <4 x float> [ [[TMP28]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP34]], [[PRED_LOAD_IF5]] ]753; CHECK-NEXT: [[TMP39:%.*]] = phi <4 x float> [ [[TMP29]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP37]], [[PRED_LOAD_IF5]] ]754; CHECK-NEXT: [[TMP40:%.*]] = fmul fast <4 x float> [[VEC_PHI]], [[TMP38]]755; CHECK-NEXT: [[TMP41:%.*]] = fmul fast <4 x float> [[TMP40]], [[TMP39]]756; CHECK-NEXT: [[TMP42]] = select fast <4 x i1> [[TMP0]], <4 x float> [[TMP41]], <4 x float> [[VEC_PHI]]757; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4758; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)759; CHECK-NEXT: [[TMP43:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260760; CHECK-NEXT: br i1 [[TMP43]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]761; CHECK: middle.block:762; CHECK-NEXT: br label [[FOR_BODY:%.*]]763; CHECK: for.end:764; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = call fast float @llvm.vector.reduce.fmul.v4f32(float 1.000000e+00, <4 x float> [[TMP42]])765; CHECK-NEXT: ret float [[RESULT_0_LCSSA]]766;767entry:768 br label %for.body769 770for.body: ; preds = %entry, %for.body771 %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]772 %result.08 = phi float [ %fmul, %for.body ], [ 0.0, %entry ]773 %arrayidx = getelementptr inbounds float, ptr %A, i32 %indvars.iv774 %l0 = load float, ptr %arrayidx, align 4775 %arrayidx2 = getelementptr inbounds float, ptr %B, i32 %indvars.iv776 %l1 = load float, ptr %arrayidx2, align 4777 %add = fmul fast float %result.08, %l0778 %fmul = fmul fast float %add, %l1779 %indvars.iv.next = add i32 %indvars.iv, 1780 %exitcond = icmp eq i32 %indvars.iv.next, 257781 br i1 %exitcond, label %for.end, label %for.body782 783for.end: ; preds = %for.body, %entry784 %result.0.lcssa = phi float [ %fmul, %for.body ]785 ret float %result.0.lcssa786}787 788define i32 @reduction_min(ptr nocapture %A, ptr nocapture %B) {789; CHECK-LABEL: @reduction_min(790; CHECK-NEXT: entry:791; CHECK-NEXT: br label [[VECTOR_PH:%.*]]792; CHECK: vector.ph:793; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]794; CHECK: vector.body:795; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]796; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]797; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ splat (i32 1000), [[VECTOR_PH]] ], [ [[TMP25:%.*]], [[PRED_LOAD_CONTINUE6]] ]798; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)799; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0800; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]801; CHECK: pred.load.if:802; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[INDEX]]803; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4804; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0805; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]806; CHECK: pred.load.continue:807; CHECK-NEXT: [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]808; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1809; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]810; CHECK: pred.load.if1:811; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i32, ptr [[A]], i32 [[INDEX]]812; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP7]], i32 4813; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 4814; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 1815; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]816; CHECK: pred.load.continue2:817; CHECK-NEXT: [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ]818; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2819; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]820; CHECK: pred.load.if3:821; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i32, ptr [[A]], i32 [[INDEX]]822; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP13]], i32 8823; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 4824; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 2825; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]826; CHECK: pred.load.continue4:827; CHECK-NEXT: [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ]828; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3829; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]830; CHECK: pred.load.if5:831; CHECK-NEXT: [[TMP19:%.*]] = getelementptr i32, ptr [[A]], i32 [[INDEX]]832; CHECK-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP19]], i32 12833; CHECK-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4834; CHECK-NEXT: [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 3835; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]836; CHECK: pred.load.continue6:837; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ]838; CHECK-NEXT: [[TMP24:%.*]] = call <4 x i32> @llvm.smin.v4i32(<4 x i32> [[VEC_PHI]], <4 x i32> [[TMP23]])839; CHECK-NEXT: [[TMP25]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP24]], <4 x i32> [[VEC_PHI]]840; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4841; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)842; CHECK-NEXT: [[TMP26:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260843; CHECK-NEXT: br i1 [[TMP26]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]844; CHECK: middle.block:845; CHECK-NEXT: br label [[FOR_BODY:%.*]]846; CHECK: for.end:847; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> [[TMP25]])848; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]]849;850entry:851 br label %for.body852 853for.body: ; preds = %entry, %for.body854 %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]855 %result.08 = phi i32 [ %v0, %for.body ], [ 1000, %entry ]856 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %indvars.iv857 %l0 = load i32, ptr %arrayidx, align 4858 %c0 = icmp slt i32 %result.08, %l0859 %v0 = select i1 %c0, i32 %result.08, i32 %l0860 %indvars.iv.next = add i32 %indvars.iv, 1861 %exitcond = icmp eq i32 %indvars.iv.next, 257862 br i1 %exitcond, label %for.end, label %for.body863 864for.end: ; preds = %for.body, %entry865 %result.0.lcssa = phi i32 [ %v0, %for.body ]866 ret i32 %result.0.lcssa867}868 869define i32 @reduction_max(ptr nocapture %A, ptr nocapture %B) {870; CHECK-LABEL: @reduction_max(871; CHECK-NEXT: entry:872; CHECK-NEXT: br label [[VECTOR_PH:%.*]]873; CHECK: vector.ph:874; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]875; CHECK: vector.body:876; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ]877; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i16> [ <i16 0, i16 1, i16 2, i16 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE6]] ]878; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ splat (i32 1000), [[VECTOR_PH]] ], [ [[TMP25:%.*]], [[PRED_LOAD_CONTINUE6]] ]879; CHECK-NEXT: [[TMP0:%.*]] = icmp ult <4 x i16> [[VEC_IND]], splat (i16 257)880; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i1> [[TMP0]], i64 0881; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]882; CHECK: pred.load.if:883; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[INDEX]]884; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4885; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> poison, i32 [[TMP3]], i64 0886; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]887; CHECK: pred.load.continue:888; CHECK-NEXT: [[TMP5:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP4]], [[PRED_LOAD_IF]] ]889; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP0]], i64 1890; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]891; CHECK: pred.load.if1:892; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i32, ptr [[A]], i32 [[INDEX]]893; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP7]], i32 4894; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 4895; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP9]], i64 1896; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]897; CHECK: pred.load.continue2:898; CHECK-NEXT: [[TMP11:%.*]] = phi <4 x i32> [ [[TMP5]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP10]], [[PRED_LOAD_IF1]] ]899; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP0]], i64 2900; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]]901; CHECK: pred.load.if3:902; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i32, ptr [[A]], i32 [[INDEX]]903; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP13]], i32 8904; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 4905; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP15]], i64 2906; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]]907; CHECK: pred.load.continue4:908; CHECK-NEXT: [[TMP17:%.*]] = phi <4 x i32> [ [[TMP11]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP16]], [[PRED_LOAD_IF3]] ]909; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i1> [[TMP0]], i64 3910; CHECK-NEXT: br i1 [[TMP18]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]]911; CHECK: pred.load.if5:912; CHECK-NEXT: [[TMP19:%.*]] = getelementptr i32, ptr [[A]], i32 [[INDEX]]913; CHECK-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP19]], i32 12914; CHECK-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4915; CHECK-NEXT: [[TMP22:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[TMP21]], i64 3916; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]]917; CHECK: pred.load.continue6:918; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ [[TMP17]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP22]], [[PRED_LOAD_IF5]] ]919; CHECK-NEXT: [[TMP24:%.*]] = call <4 x i32> @llvm.umax.v4i32(<4 x i32> [[VEC_PHI]], <4 x i32> [[TMP23]])920; CHECK-NEXT: [[TMP25]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP24]], <4 x i32> [[VEC_PHI]]921; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4922; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i16> [[VEC_IND]], splat (i16 4)923; CHECK-NEXT: [[TMP26:%.*]] = icmp eq i32 [[INDEX_NEXT]], 260924; CHECK-NEXT: br i1 [[TMP26]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]925; CHECK: middle.block:926; CHECK-NEXT: br label [[FOR_BODY:%.*]]927; CHECK: for.end:928; CHECK-NEXT: [[RESULT_0_LCSSA:%.*]] = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> [[TMP25]])929; CHECK-NEXT: ret i32 [[RESULT_0_LCSSA]]930;931entry:932 br label %for.body933 934for.body: ; preds = %entry, %for.body935 %indvars.iv = phi i32 [ %indvars.iv.next, %for.body ], [ 0, %entry ]936 %result.08 = phi i32 [ %v0, %for.body ], [ 1000, %entry ]937 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %indvars.iv938 %l0 = load i32, ptr %arrayidx, align 4939 %c0 = icmp ugt i32 %result.08, %l0940 %v0 = select i1 %c0, i32 %result.08, i32 %l0941 %indvars.iv.next = add i32 %indvars.iv, 1942 %exitcond = icmp eq i32 %indvars.iv.next, 257943 br i1 %exitcond, label %for.end, label %for.body944 945for.end: ; preds = %for.body, %entry946 %result.0.lcssa = phi i32 [ %v0, %for.body ]947 ret i32 %result.0.lcssa948}949