1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: %if x86-registered-target %{ opt -passes=slp-vectorizer -S -mtriple=x86_64 < %s | FileCheck %s %} 3; RUN: %if aarch64-registered-target %{ opt -passes=slp-vectorizer -S -mtriple=aarch64 < %s | FileCheck %s %} 4; Vectorization tree roots at vector build sequence (insertelement), 5; SLP crashed on generating vector code for pair {%i4, 0.0} trying to produce 6; a shuffle with %ins1 as a source because it was marked deleted 7; due to vectorization. 8 9define void @test() { 10; CHECK-LABEL: define void @test() { 11; CHECK-NEXT: entry: 12; CHECK-NEXT: br label [[LOOP:%.*]] 13; CHECK: loop: 14; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x float> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[TMP3:%.*]], [[LOOP]] ] 15; CHECK-NEXT: [[TMP1:%.*]] = fadd <2 x float> zeroinitializer, [[TMP0]] 16; CHECK-NEXT: [[TMP2:%.*]] = select <2 x i1> zeroinitializer, <2 x float> [[TMP1]], <2 x float> zeroinitializer 17; CHECK-NEXT: [[TMP3]] = shufflevector <2 x float> [[TMP2]], <2 x float> <float poison, float 0.000000e+00>, <2 x i32> <i32 0, i32 3> 18; CHECK-NEXT: br label [[LOOP]] 19; 20entry: 21 br label %loop 22 23loop: 24 %ph0 = phi float [ 0.000000e+00, %entry ], [ %i4, %loop ] 25 %ph1 = phi float [ 0.000000e+00, %entry ], [ 0.000000e+00, %loop ] 26 %i = fadd float 0.000000e+00, %ph0 27 %i1 = fadd float 0.000000e+00, %ph1 28 %i2 = select i1 false, float %i, float 0.000000e+00 29 %i3 = select i1 false, float %i1, float 0.000000e+00 30 %ins0 = insertelement <2 x float> zeroinitializer, float %i2, i64 0 31 %ins1 = insertelement <2 x float> %ins0, float %i3, i64 1 32 %i4 = extractelement <2 x float> %ins1, i64 0 33 br label %loop 34} 35 36define void @test1() { 37; CHECK-LABEL: define void @test1() { 38; CHECK-NEXT: entry: 39; CHECK-NEXT: br label [[LOOP:%.*]] 40; CHECK: loop: 41; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x float> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[TMP2:%.*]], [[LOOP]] ] 42; CHECK-NEXT: [[TMP1:%.*]] = fadd <2 x float> zeroinitializer, [[TMP0]] 43; CHECK-NEXT: [[TMP2]] = select <2 x i1> zeroinitializer, <2 x float> [[TMP1]], <2 x float> zeroinitializer 44; CHECK-NEXT: br label [[LOOP]] 45; 46entry: 47 br label %loop 48 49loop: 50 %ph0 = phi float [ 0.000000e+00, %entry ], [ %i4, %loop ] 51 %ph1 = phi float [ 0.000000e+00, %entry ], [ %i5, %loop ] 52 %i = fadd float 0.000000e+00, %ph0 53 %i1 = fadd float 0.000000e+00, %ph1 54 %i2 = select i1 false, float %i, float 0.000000e+00 55 %i3 = select i1 false, float %i1, float 0.000000e+00 56 %ins0 = insertelement <2 x float> zeroinitializer, float %i2, i64 0 57 %ins1 = insertelement <2 x float> %ins0, float %i3, i64 1 58 %i4 = extractelement <2 x float> %ins1, i64 0 59 %i5 = extractelement <2 x float> %ins1, i64 1 60 br label %loop 61} 62 63define void @test2() { 64; CHECK-LABEL: define void @test2() { 65; CHECK-NEXT: entry: 66; CHECK-NEXT: br label [[BB3:%.*]] 67; CHECK: bb1: 68; CHECK-NEXT: [[PH:%.*]] = phi float [ poison, [[BB2:%.*]] ], [ [[TMP3:%.*]], [[LOOP:%.*]] ] 69; CHECK-NEXT: unreachable 70; CHECK: bb2: 71; CHECK-NEXT: br i1 poison, label [[BB3]], label [[BB1:%.*]] 72; CHECK: bb3: 73; CHECK-NEXT: br label [[LOOP]] 74; CHECK: loop: 75; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x float> [ zeroinitializer, [[BB3]] ], [ [[TMP2:%.*]], [[LOOP]] ] 76; CHECK-NEXT: [[TMP1:%.*]] = fadd <2 x float> zeroinitializer, [[TMP0]] 77; CHECK-NEXT: [[TMP2]] = select <2 x i1> zeroinitializer, <2 x float> [[TMP1]], <2 x float> zeroinitializer 78; CHECK-NEXT: [[TMP3]] = extractelement <2 x float> [[TMP2]], i64 1 79; CHECK-NEXT: br i1 poison, label [[BB1]], label [[LOOP]] 80; 81entry: 82 br label %bb3 83 84bb1: 85 %ph = phi float [ poison, %bb2 ], [ %i5, %loop ] 86 unreachable 87 88bb2: 89 br i1 poison, label %bb3, label %bb1 90 91bb3: 92 br label %loop 93 94loop: 95 %ph0 = phi float [ 0.000000e+00, %bb3 ], [ %i4, %loop ] 96 %ph1 = phi float [ 0.000000e+00, %bb3 ], [ %i5, %loop ] 97 %i = fadd float 0.000000e+00, %ph0 98 %i1 = fadd float 0.000000e+00, %ph1 99 %i2 = select i1 false, float %i, float 0.000000e+00 100 %i3 = select i1 false, float %i1, float 0.000000e+00 101 %ins0 = insertelement <2 x float> zeroinitializer, float %i2, i64 0 102 %ins1 = insertelement <2 x float> %ins0, float %i3, i64 1 103 %i4 = extractelement <2 x float> %ins1, i64 0 104 %i5 = extractelement <2 x float> %ins1, i64 1 105 br i1 poison, label %bb1, label %loop 106} 107