480 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=slp-vectorizer -S -slp-revec -slp-max-reg-size=1024 -slp-threshold=-100 %s | FileCheck %s3 4define void @test1(ptr %a, ptr %b, ptr %c) {5; CHECK-LABEL: @test1(6; CHECK-NEXT: entry:7; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i32>, ptr [[A:%.*]], align 48; CHECK-NEXT: [[TMP1:%.*]] = load <16 x i32>, ptr [[B:%.*]], align 49; CHECK-NEXT: [[TMP2:%.*]] = add <16 x i32> [[TMP1]], [[TMP0]]10; CHECK-NEXT: store <16 x i32> [[TMP2]], ptr [[C:%.*]], align 411; CHECK-NEXT: ret void12;13entry:14 %arrayidx3 = getelementptr inbounds i32, ptr %a, i64 415 %arrayidx7 = getelementptr inbounds i32, ptr %a, i64 816 %arrayidx11 = getelementptr inbounds i32, ptr %a, i64 1217 %0 = load <4 x i32>, ptr %a, align 418 %1 = load <4 x i32>, ptr %arrayidx3, align 419 %2 = load <4 x i32>, ptr %arrayidx7, align 420 %3 = load <4 x i32>, ptr %arrayidx11, align 421 %arrayidx19 = getelementptr inbounds i32, ptr %b, i64 422 %arrayidx23 = getelementptr inbounds i32, ptr %b, i64 823 %arrayidx27 = getelementptr inbounds i32, ptr %b, i64 1224 %4 = load <4 x i32>, ptr %b, align 425 %5 = load <4 x i32>, ptr %arrayidx19, align 426 %6 = load <4 x i32>, ptr %arrayidx23, align 427 %7 = load <4 x i32>, ptr %arrayidx27, align 428 %add.i = add <4 x i32> %4, %029 %add.i63 = add <4 x i32> %5, %130 %add.i64 = add <4 x i32> %6, %231 %add.i65 = add <4 x i32> %7, %332 %arrayidx36 = getelementptr inbounds i32, ptr %c, i64 433 %arrayidx39 = getelementptr inbounds i32, ptr %c, i64 834 %arrayidx42 = getelementptr inbounds i32, ptr %c, i64 1235 store <4 x i32> %add.i, ptr %c, align 436 store <4 x i32> %add.i63, ptr %arrayidx36, align 437 store <4 x i32> %add.i64, ptr %arrayidx39, align 438 store <4 x i32> %add.i65, ptr %arrayidx42, align 439 ret void40}41 42define void @test2(ptr %in, ptr %out) {43; CHECK-LABEL: @test2(44; CHECK-NEXT: entry:45; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i16>, ptr [[IN:%.*]], align 246; CHECK-NEXT: [[TMP1:%.*]] = call <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16> [[TMP0]], <16 x i16> [[TMP0]])47; CHECK-NEXT: store <16 x i16> [[TMP1]], ptr [[OUT:%.*]], align 248; CHECK-NEXT: ret void49;50entry:51 %0 = getelementptr i16, ptr %in, i64 852 %1 = load <8 x i16>, ptr %in, align 253 %2 = load <8 x i16>, ptr %0, align 254 %3 = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %1, <8 x i16> %1)55 %4 = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %2, <8 x i16> %2)56 %5 = getelementptr i16, ptr %out, i64 857 store <8 x i16> %3, ptr %out, align 258 store <8 x i16> %4, ptr %5, align 259 ret void60}61 62define void @test3(ptr %x, ptr %y, ptr %z) {63; CHECK-LABEL: @test3(64; CHECK-NEXT: entry:65; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x ptr> poison, ptr [[X:%.*]], i32 066; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x ptr> [[TMP0]], ptr [[Y:%.*]], i32 167; CHECK-NEXT: [[TMP2:%.*]] = icmp eq <2 x ptr> [[TMP1]], zeroinitializer68; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i32>, ptr [[X]], align 469; CHECK-NEXT: [[TMP4:%.*]] = load <8 x i32>, ptr [[Y]], align 470; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <2 x i1> [[TMP2]], <2 x i1> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>71; CHECK-NEXT: [[TMP6:%.*]] = select <8 x i1> [[TMP5]], <8 x i32> [[TMP3]], <8 x i32> [[TMP4]]72; CHECK-NEXT: store <8 x i32> [[TMP6]], ptr [[Z:%.*]], align 473; CHECK-NEXT: ret void74;75entry:76 %0 = getelementptr inbounds i32, ptr %x, i64 477 %1 = getelementptr inbounds i32, ptr %y, i64 478 %2 = load <4 x i32>, ptr %x, align 479 %3 = load <4 x i32>, ptr %0, align 480 %4 = load <4 x i32>, ptr %y, align 481 %5 = load <4 x i32>, ptr %1, align 482 %6 = icmp eq ptr %x, null83 %7 = icmp eq ptr %y, null84 %8 = select i1 %6, <4 x i32> %2, <4 x i32> %485 %9 = select i1 %7, <4 x i32> %3, <4 x i32> %586 %10 = getelementptr inbounds i32, ptr %z, i64 487 store <4 x i32> %8, ptr %z, align 488 store <4 x i32> %9, ptr %10, align 489 ret void90}91 92define void @test4(ptr %in, ptr %out) {93; CHECK-LABEL: @test4(94; CHECK-NEXT: entry:95; CHECK-NEXT: [[TMP0:%.*]] = load <8 x float>, ptr [[IN:%.*]], align 496; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> [[TMP0]], <8 x float> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>97; CHECK-NEXT: [[TMP6:%.*]] = fmul <16 x float> [[TMP1]], zeroinitializer98; CHECK-NEXT: [[TMP9:%.*]] = shufflevector <16 x float> [[TMP1]], <16 x float> <float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>99; CHECK-NEXT: [[TMP10:%.*]] = fadd <16 x float> [[TMP9]], [[TMP6]]100; CHECK-NEXT: [[TMP5:%.*]] = fcmp ogt <16 x float> [[TMP10]], zeroinitializer101; CHECK-NEXT: [[TMP12:%.*]] = getelementptr i1, ptr [[OUT:%.*]], i64 8102; CHECK-NEXT: [[TMP13:%.*]] = shufflevector <16 x i1> [[TMP5]], <16 x i1> poison, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>103; CHECK-NEXT: store <8 x i1> [[TMP13]], ptr [[OUT]], align 1104; CHECK-NEXT: [[TMP14:%.*]] = shufflevector <16 x i1> [[TMP5]], <16 x i1> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>105; CHECK-NEXT: store <8 x i1> [[TMP14]], ptr [[TMP12]], align 1106; CHECK-NEXT: ret void107;108entry:109 %0 = load <8 x float>, ptr %in, align 4110 %1 = fmul <8 x float> %0, zeroinitializer111 %2 = fmul <8 x float> %0, zeroinitializer112 %3 = fadd <8 x float> zeroinitializer, %1113 %4 = fadd <8 x float> %0, %2114 %5 = fcmp ogt <8 x float> %3, zeroinitializer115 %6 = fcmp ogt <8 x float> %4, zeroinitializer116 %7 = getelementptr i1, ptr %out, i64 8117 store <8 x i1> %5, ptr %out, align 1118 store <8 x i1> %6, ptr %7, align 1119 ret void120}121 122define void @test5(ptr %ptr0, ptr %ptr1) {123; CHECK-LABEL: @test5(124; CHECK-NEXT: entry:125; CHECK-NEXT: [[GETELEMENTPTR0:%.*]] = getelementptr i8, ptr null, i64 0126; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x ptr> <ptr null, ptr null, ptr undef, ptr undef>, ptr [[GETELEMENTPTR0]], i32 2127; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x ptr> [[TMP0]], ptr null, i32 3128; CHECK-NEXT: [[TMP2:%.*]] = icmp ult <4 x ptr> zeroinitializer, [[TMP1]]129; CHECK-NEXT: [[TMP3:%.*]] = insertelement <4 x ptr> <ptr poison, ptr null, ptr null, ptr null>, ptr [[PTR0:%.*]], i32 0130; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x ptr> [[TMP1]], ptr [[PTR1:%.*]], i32 3131; CHECK-NEXT: [[TMP5:%.*]] = icmp ult <4 x ptr> [[TMP3]], [[TMP4]]132; CHECK-NEXT: ret void133;134entry:135 %getelementptr0 = getelementptr i8, ptr null, i64 0136 %0 = insertelement <4 x ptr> <ptr null, ptr null, ptr undef, ptr undef>, ptr %getelementptr0, i32 2137 %1 = insertelement <4 x ptr> %0, ptr null, i32 3138 %2 = icmp ult <4 x ptr> zeroinitializer, %1139 %3 = insertelement <4 x ptr> <ptr poison, ptr null, ptr null, ptr null>, ptr %ptr0, i32 0140 %4 = insertelement <4 x ptr> %1, ptr %ptr1, i32 3141 %5 = icmp ult <4 x ptr> %3, %4142 ret void143}144 145define <4 x i1> @test6(ptr %in1, ptr %in2) {146; CHECK-LABEL: @test6(147; CHECK-NEXT: entry:148; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i32>, ptr [[IN1:%.*]], align 4149; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i16>, ptr [[IN2:%.*]], align 2150; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>151; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i16> [[TMP1]], <4 x i16> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>152; CHECK-NEXT: [[TMP21:%.*]] = icmp eq <16 x i16> [[TMP3]], zeroinitializer153; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <16 x i32> [[TMP2]], <16 x i32> poison, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>154; CHECK-NEXT: [[TMP6:%.*]] = icmp ugt <32 x i32> [[TMP5]], zeroinitializer155; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <32 x i1> [[TMP6]], <32 x i1> poison, <16 x i32> <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, i32 31>156; CHECK-NEXT: [[TMP22:%.*]] = and <16 x i1> [[TMP11]], [[TMP21]]157; CHECK-NEXT: [[TMP23:%.*]] = shufflevector <32 x i1> [[TMP6]], <32 x i1> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>158; CHECK-NEXT: [[TMP24:%.*]] = and <16 x i1> [[TMP22]], [[TMP23]]159; CHECK-NEXT: [[TMP25:%.*]] = shufflevector <16 x i1> [[TMP24]], <16 x i1> poison, <4 x i32> <i32 0, i32 4, i32 8, i32 12>160; CHECK-NEXT: [[TMP26:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP25]])161; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x i1> poison, i1 [[TMP26]], i64 0162; CHECK-NEXT: [[TMP28:%.*]] = shufflevector <16 x i1> [[TMP24]], <16 x i1> poison, <4 x i32> <i32 1, i32 5, i32 9, i32 13>163; CHECK-NEXT: [[TMP29:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP28]])164; CHECK-NEXT: [[TMP30:%.*]] = insertelement <4 x i1> [[TMP27]], i1 [[TMP29]], i64 1165; CHECK-NEXT: [[TMP31:%.*]] = shufflevector <16 x i1> [[TMP24]], <16 x i1> poison, <4 x i32> <i32 2, i32 6, i32 10, i32 14>166; CHECK-NEXT: [[TMP32:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP31]])167; CHECK-NEXT: [[TMP33:%.*]] = insertelement <4 x i1> [[TMP30]], i1 [[TMP32]], i64 2168; CHECK-NEXT: [[TMP34:%.*]] = shufflevector <16 x i1> [[TMP24]], <16 x i1> poison, <4 x i32> <i32 3, i32 7, i32 11, i32 15>169; CHECK-NEXT: [[TMP35:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP34]])170; CHECK-NEXT: [[TMP36:%.*]] = insertelement <4 x i1> [[TMP33]], i1 [[TMP35]], i64 3171; CHECK-NEXT: [[VBSL:%.*]] = select <4 x i1> [[TMP36]], <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32> <i32 5, i32 6, i32 7, i32 8>172; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <4 x i32> [[VBSL]], <i32 2, i32 3, i32 4, i32 5>173; CHECK-NEXT: ret <4 x i1> [[CMP]]174;175entry:176 %0 = load <4 x i32>, ptr %in1, align 4177 %1 = load <4 x i16>, ptr %in2, align 2178 %cmp000 = icmp ugt <4 x i32> %0, zeroinitializer179 %cmp001 = icmp ugt <4 x i32> %0, zeroinitializer180 %cmp002 = icmp ugt <4 x i32> %0, zeroinitializer181 %cmp003 = icmp ugt <4 x i32> %0, zeroinitializer182 %cmp100 = icmp eq <4 x i16> %1, zeroinitializer183 %cmp101 = icmp eq <4 x i16> %1, zeroinitializer184 %cmp102 = icmp eq <4 x i16> %1, zeroinitializer185 %cmp103 = icmp eq <4 x i16> %1, zeroinitializer186 %and.cmp0 = and <4 x i1> %cmp000, %cmp100187 %and.cmp1 = and <4 x i1> %cmp001, %cmp101188 %and.cmp2 = and <4 x i1> %cmp002, %cmp102189 %and.cmp3 = and <4 x i1> %cmp003, %cmp103190 %cmp004 = icmp ugt <4 x i32> %0, zeroinitializer191 %cmp005 = icmp ugt <4 x i32> %0, zeroinitializer192 %cmp006 = icmp ugt <4 x i32> %0, zeroinitializer193 %cmp007 = icmp ugt <4 x i32> %0, zeroinitializer194 %and.cmp4 = and <4 x i1> %and.cmp0, %cmp004195 %and.cmp5 = and <4 x i1> %and.cmp1, %cmp005196 %and.cmp6 = and <4 x i1> %and.cmp2, %cmp006197 %and.cmp7 = and <4 x i1> %and.cmp3, %cmp007198 %or0 = or <4 x i1> %and.cmp5, %and.cmp4199 %or1 = or <4 x i1> %or0, %and.cmp6200 %or2 = or <4 x i1> %or1, %and.cmp7201 %vbsl = select <4 x i1> %or2, <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32> <i32 5, i32 6, i32 7, i32 8>202 %cmp = icmp ugt <4 x i32> %vbsl, <i32 2, i32 3, i32 4, i32 5>203 ret <4 x i1> %cmp204}205 206define void @test7() {207; CHECK-LABEL: @test7(208; CHECK-NEXT: store <16 x i16> zeroinitializer, ptr null, align 2209; CHECK-NEXT: ret void210;211 %1 = getelementptr i8, ptr null, i64 16212 %2 = trunc <8 x i64> zeroinitializer to <8 x i16>213 store <8 x i16> %2, ptr %1, align 2214 %3 = trunc <8 x i64> zeroinitializer to <8 x i16>215 store <8 x i16> %3, ptr null, align 2216 ret void217}218 219define void @test8() {220; CHECK-LABEL: @test8(221; CHECK-NEXT: entry:222; CHECK-NEXT: br i1 false, label [[FOR0:%.*]], label [[FOR_BODY:%.*]]223; CHECK: for0:224; CHECK-NEXT: [[TMP0:%.*]] = phi <8 x float> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[TMP8:%.*]], [[FOR_BODY]] ]225; CHECK-NEXT: ret void226; CHECK: for.body:227; CHECK-NEXT: [[TMP7:%.*]] = phi <4 x float> [ [[TMP7]], [[FOR_BODY]] ], [ zeroinitializer, [[ENTRY]] ]228; CHECK-NEXT: [[TMP8]] = shufflevector <4 x float> [[TMP7]], <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>229; CHECK-NEXT: br i1 false, label [[FOR0]], label [[FOR_BODY]]230;231entry:232 br i1 false, label %for0, label %for.body233 234for0:235 %0 = phi <2 x float> [ zeroinitializer, %entry ], [ %4, %for.body ]236 %1 = phi <2 x float> [ zeroinitializer, %entry ], [ %5, %for.body ]237 %2 = phi <2 x float> [ zeroinitializer, %entry ], [ %4, %for.body ]238 %3 = phi <2 x float> [ zeroinitializer, %entry ], [ %5, %for.body ]239 ret void240 241for.body:242 %4 = phi <2 x float> [ %4, %for.body ], [ zeroinitializer, %entry ]243 %5 = phi <2 x float> [ %5, %for.body ], [ zeroinitializer, %entry ]244 br i1 false, label %for0, label %for.body245}246 247define void @test9() {248; CHECK-LABEL: @test9(249; CHECK-NEXT: entry:250; CHECK-NEXT: br label [[FOR_BODY13:%.*]]251; CHECK: for.body13:252; CHECK-NEXT: store <8 x i32> zeroinitializer, ptr null, align 4253; CHECK-NEXT: br label [[FOR_BODY13]]254;255entry:256 br label %for.body13257 258for.body13: ; preds = %for.body13, %entry259 %vmovl.i111 = sext <4 x i16> zeroinitializer to <4 x i32>260 %vmovl.i110 = sext <4 x i16> zeroinitializer to <4 x i32>261 store <4 x i32> %vmovl.i111, ptr null, align 4262 %add.ptr29 = getelementptr i8, ptr null, i64 16263 store <4 x i32> %vmovl.i110, ptr %add.ptr29, align 4264 br label %for.body13265}266 267define void @test10() {268; CHECK-LABEL: @test10(269; CHECK-NEXT: entry:270; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr null, align 1271; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>272; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>273; CHECK-NEXT: [[TMP5:%.*]] = sext <16 x i8> [[TMP4]] to <16 x i16>274; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <16 x i16> [[TMP5]], <16 x i16> poison, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>275; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <16 x i16> [[TMP5]], <16 x i16> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>276; CHECK-NEXT: [[TMP8:%.*]] = trunc <16 x i16> [[TMP7]] to <16 x i8>277; CHECK-NEXT: [[TMP9:%.*]] = sext <16 x i8> [[TMP8]] to <16 x i32>278; CHECK-NEXT: store <16 x i32> [[TMP9]], ptr null, align 4279; CHECK-NEXT: ret void280;281entry:282 %0 = load <16 x i8>, ptr null, align 1283 %shuffle.i = shufflevector <16 x i8> %0, <16 x i8> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>284 %shuffle.i107 = shufflevector <16 x i8> %0, <16 x i8> zeroinitializer, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>285 %vmovl.i106 = sext <8 x i8> %shuffle.i to <8 x i16>286 %vmovl.i = sext <8 x i8> %shuffle.i107 to <8 x i16>287 %shuffle.i113 = shufflevector <8 x i16> %vmovl.i106, <8 x i16> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>288 %shuffle.i115 = shufflevector <8 x i16> %vmovl.i106, <8 x i16> zeroinitializer, <4 x i32> <i32 4, i32 5, i32 6, i32 7>289 %shuffle.i112 = shufflevector <8 x i16> %vmovl.i, <8 x i16> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>290 %shuffle.i114 = shufflevector <8 x i16> %vmovl.i, <8 x i16> zeroinitializer, <4 x i32> <i32 4, i32 5, i32 6, i32 7>291 %vmovl.i111 = sext <4 x i16> %shuffle.i113 to <4 x i32>292 %vmovl.i110 = sext <4 x i16> %shuffle.i115 to <4 x i32>293 %vmovl.i109 = sext <4 x i16> %shuffle.i112 to <4 x i32>294 %vmovl.i108 = sext <4 x i16> %shuffle.i114 to <4 x i32>295 %add.ptr29 = getelementptr i8, ptr null, i64 16296 %add.ptr32 = getelementptr i8, ptr null, i64 32297 %add.ptr35 = getelementptr i8, ptr null, i64 48298 store <4 x i32> %vmovl.i111, ptr null, align 4299 store <4 x i32> %vmovl.i110, ptr %add.ptr29, align 4300 store <4 x i32> %vmovl.i109, ptr %add.ptr32, align 4301 store <4 x i32> %vmovl.i108, ptr %add.ptr35, align 4302 ret void303}304 305define void @test11(<2 x i64> %0, i64 %1, <2 x i64> %2) {306; CHECK-LABEL: @test11(307; CHECK-NEXT: entry:308; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> [[TMP0:%.*]], i64 [[TMP1:%.*]], i32 1309; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <2 x i64> [[TMP2:%.*]], <2 x i64> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>310; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <2 x i64> [[TMP3]], <2 x i64> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>311; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <4 x i64> [[TMP4]], <4 x i64> [[TMP5]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>312; CHECK-NEXT: [[TMP7:%.*]] = add <4 x i64> <i64 5, i64 0, i64 0, i64 0>, [[TMP6]]313; CHECK-NEXT: [[TMP9:%.*]] = trunc <4 x i64> [[TMP7]] to <4 x i8>314; CHECK-NEXT: [[TMP11:%.*]] = urem <4 x i8> [[TMP9]], zeroinitializer315; CHECK-NEXT: [[TMP12:%.*]] = icmp ne <4 x i8> [[TMP11]], zeroinitializer316; CHECK-NEXT: ret void317;318entry:319 %3 = insertelement <2 x i64> %0, i64 %1, i32 1320 %4 = add <2 x i64> <i64 5, i64 0>, %2321 %5 = trunc <2 x i64> %3 to <2 x i8>322 %6 = trunc <2 x i64> %4 to <2 x i8>323 %7 = urem <2 x i8> %5, zeroinitializer324 %8 = urem <2 x i8> %6, zeroinitializer325 %9 = icmp ne <2 x i8> %7, zeroinitializer326 %10 = icmp ne <2 x i8> %8, zeroinitializer327 ret void328}329 330define void @test12() {331; CHECK-LABEL: @test12(332; CHECK-NEXT: entry:333; CHECK-NEXT: [[TMP0:%.*]] = getelementptr float, ptr null, i64 33334; CHECK-NEXT: [[TMP1:%.*]] = getelementptr float, ptr null, i64 50335; CHECK-NEXT: [[TMP2:%.*]] = getelementptr float, ptr null, i64 75336; CHECK-NEXT: [[TMP3:%.*]] = load <8 x float>, ptr [[TMP1]], align 4337; CHECK-NEXT: [[TMP4:%.*]] = load <8 x float>, ptr [[TMP2]], align 4338; CHECK-NEXT: [[TMP5:%.*]] = load <16 x float>, ptr [[TMP0]], align 4339; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <8 x float> [[TMP4]], <8 x float> poison, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, 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 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>340; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <8 x float> [[TMP3]], <8 x float> poison, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, 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 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>341; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <32 x float> [[TMP6]], <32 x float> [[TMP7]], <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, 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, i32 31>342; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <16 x float> [[TMP5]], <16 x float> poison, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, 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 poison>343; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <32 x float> [[TMP10]], <32 x float> [[TMP11]], <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47>344; CHECK-NEXT: [[TMP9:%.*]] = fpext <32 x float> [[TMP8]] to <32 x double>345; CHECK-NEXT: [[TMP14:%.*]] = fadd <32 x double> zeroinitializer, [[TMP9]]346; CHECK-NEXT: [[TMP15:%.*]] = fptrunc <32 x double> [[TMP14]] to <32 x float>347; CHECK-NEXT: [[TMP16:%.*]] = fcmp ogt <32 x float> zeroinitializer, [[TMP15]]348; CHECK-NEXT: ret void349;350entry:351 %0 = getelementptr float, ptr null, i64 33352 %1 = getelementptr float, ptr null, i64 41353 %2 = getelementptr float, ptr null, i64 50354 %3 = getelementptr float, ptr null, i64 75355 %4 = load <8 x float>, ptr %0, align 4356 %5 = load <8 x float>, ptr %1, align 4357 %6 = load <8 x float>, ptr %2, align 4358 %7 = load <8 x float>, ptr %3, align 4359 %8 = fpext <8 x float> %4 to <8 x double>360 %9 = fpext <8 x float> %5 to <8 x double>361 %10 = fpext <8 x float> %6 to <8 x double>362 %11 = fpext <8 x float> %7 to <8 x double>363 %12 = fadd <8 x double> zeroinitializer, %8364 %13 = fadd <8 x double> zeroinitializer, %9365 %14 = fadd <8 x double> zeroinitializer, %10366 %15 = fadd <8 x double> zeroinitializer, %11367 %16 = fptrunc <8 x double> %12 to <8 x float>368 %17 = fptrunc <8 x double> %13 to <8 x float>369 %18 = fptrunc <8 x double> %14 to <8 x float>370 %19 = fptrunc <8 x double> %15 to <8 x float>371 %20 = fcmp ogt <8 x float> zeroinitializer, %16372 %21 = fcmp ogt <8 x float> zeroinitializer, %17373 %22 = fcmp ogt <8 x float> zeroinitializer, %18374 %23 = fcmp ogt <8 x float> zeroinitializer, %19375 ret void376}377 378define void @test13(<8 x i32> %0, ptr %out0, ptr %out1, ptr %out2) {379; CHECK-LABEL: @test13(380; CHECK-NEXT: entry:381; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[TMP0:%.*]], <8 x i32> poison, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>382; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>383; CHECK-NEXT: br label [[FOR_END_LOOPEXIT:%.*]]384; CHECK: for.end.loopexit:385; CHECK-NEXT: [[TMP4:%.*]] = phi <16 x i32> [ [[TMP3]], [[ENTRY:%.*]] ]386; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <16 x i32> [[TMP4]], <16 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>387; CHECK-NEXT: [[OR0:%.*]] = or <4 x i32> [[TMP6]], zeroinitializer388; CHECK-NEXT: store <4 x i32> [[OR0]], ptr [[OUT0:%.*]], align 4389; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>390; CHECK-NEXT: store <4 x i32> [[TMP7]], ptr [[OUT1:%.*]], align 4391; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> poison, <4 x i32> <i32 12, i32 13, i32 14, i32 15>392; CHECK-NEXT: store <4 x i32> [[TMP8]], ptr [[OUT2:%.*]], align 4393; CHECK-NEXT: ret void394;395entry:396 %1 = shufflevector <8 x i32> %0, <8 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>397 %2 = shufflevector <8 x i32> %0, <8 x i32> zeroinitializer, <4 x i32> <i32 4, i32 5, i32 6, i32 7>398 %3 = shufflevector <8 x i32> %0, <8 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>399 %4 = shufflevector <8 x i32> %0, <8 x i32> zeroinitializer, <4 x i32> <i32 4, i32 5, i32 6, i32 7>400 br label %for.end.loopexit401 402for.end.loopexit:403 %phi0 = phi <4 x i32> [ %1, %entry ]404 %phi1 = phi <4 x i32> [ %2, %entry ]405 %phi2 = phi <4 x i32> [ %3, %entry ]406 %phi3 = phi <4 x i32> [ %4, %entry ]407 %or0 = or <4 x i32> %phi1, zeroinitializer408 store <4 x i32> %or0, ptr %out0, align 4409 store <4 x i32> %1, ptr %out1, align 4410 store <4 x i32> %4, ptr %out2, align 4411 ret void412}413 414define void @test14(<8 x i1> %0) {415; CHECK-LABEL: @test14(416; CHECK-NEXT: entry:417; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x i1> [[TMP0:%.*]], <8 x i1> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>418; CHECK-NEXT: [[TMP3:%.*]] = sext <16 x i1> [[TMP2]] to <16 x i16>419; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i16> [[TMP3]], <16 x i16> poison, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>420; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <16 x i16> [[TMP3]], <16 x i16> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>421; CHECK-NEXT: br label [[FOR_END_LOOPEXIT:%.*]]422; CHECK: for.end.loopexit:423; CHECK-NEXT: [[TMP6:%.*]] = phi <16 x i16> [ [[TMP5]], [[ENTRY:%.*]] ]424; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <16 x i16> [[TMP6]], <16 x i16> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>425; CHECK-NEXT: [[OR0:%.*]] = or <4 x i16> [[TMP8]], zeroinitializer426; CHECK-NEXT: ret void427;428entry:429 %sext0 = sext <8 x i1> %0 to <8 x i16>430 %sext1 = sext <8 x i1> %0 to <8 x i16>431 %1 = shufflevector <8 x i16> %sext0, <8 x i16> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>432 %2 = shufflevector <8 x i16> %sext0, <8 x i16> zeroinitializer, <4 x i32> <i32 4, i32 5, i32 6, i32 7>433 %3 = shufflevector <8 x i16> %sext1, <8 x i16> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>434 %4 = shufflevector <8 x i16> %sext1, <8 x i16> zeroinitializer, <4 x i32> <i32 4, i32 5, i32 6, i32 7>435 br label %for.end.loopexit436 437for.end.loopexit:438 %phi0 = phi <4 x i16> [ %1, %entry ]439 %phi1 = phi <4 x i16> [ %2, %entry ]440 %phi2 = phi <4 x i16> [ %3, %entry ]441 %phi3 = phi <4 x i16> [ %4, %entry ]442 %or0 = or <4 x i16> %phi1, zeroinitializer443 ret void444}445 446define i32 @test15() {447; CHECK-LABEL: @test15(448; CHECK-NEXT: entry:449; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr null, i64 480450; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr null, i64 160451; CHECK-NEXT: [[TMP2:%.*]] = load <8 x float>, ptr [[TMP1]], align 16452; CHECK-NEXT: [[TMP3:%.*]] = load <4 x float>, ptr [[TMP1]], align 16453; CHECK-NEXT: store <4 x float> [[TMP3]], ptr null, align 16454; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <8 x float> [[TMP2]], <8 x float> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>455; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <16 x float> [[TMP10]], <16 x float> <float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>456; CHECK-NEXT: [[TMP12:%.*]] = fadd <16 x float> zeroinitializer, [[TMP5]]457; CHECK-NEXT: store <16 x float> [[TMP12]], ptr [[TMP0]], align 16458; CHECK-NEXT: ret i32 0459;460entry:461 %0 = getelementptr i8, ptr null, i64 512462 %1 = getelementptr i8, ptr null, i64 528463 %2 = getelementptr i8, ptr null, i64 480464 %3 = getelementptr i8, ptr null, i64 496465 %4 = getelementptr i8, ptr null, i64 160466 %5 = load <4 x float>, ptr %4, align 16467 %6 = getelementptr i8, ptr null, i64 176468 %7 = load <4 x float>, ptr %6, align 16469 store <4 x float> %5, ptr null, align 16470 %8 = fadd <4 x float> zeroinitializer, %5471 %9 = fadd <4 x float> zeroinitializer, %7472 store <4 x float> %8, ptr %2, align 16473 store <4 x float> %9, ptr %3, align 16474 %10 = fadd <4 x float> zeroinitializer, zeroinitializer475 %11 = fadd <4 x float> zeroinitializer, zeroinitializer476 store <4 x float> %10, ptr %0, align 16477 store <4 x float> %11, ptr %1, align 16478 ret i32 0479}480