1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2; RUN: opt -S --passes=slp-vectorizer -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s 3 4define void @test() { 5; CHECK-LABEL: define void @test() { 6; CHECK-NEXT: [[ENTRY:.*:]] 7; CHECK-NEXT: br label %[[BB61:.*]] 8; CHECK: [[BB61]]: 9; CHECK-NEXT: br label %[[BB64:.*]] 10; CHECK: [[BB62:.*]]: 11; CHECK-NEXT: br i1 poison, label %[[BB63:.*]], label %[[BB64]] 12; CHECK: [[BB63]]: 13; CHECK-NEXT: br label %[[BB64]] 14; CHECK: [[BB64]]: 15; CHECK-NEXT: [[TMP25:%.*]] = phi <16 x float> [ poison, %[[BB61]] ], [ poison, %[[BB63]] ], [ poison, %[[BB62]] ] 16; CHECK-NEXT: [[I66:%.*]] = load float, ptr poison, align 16 17; CHECK-NEXT: [[I67:%.*]] = load float, ptr poison, align 4 18; CHECK-NEXT: [[I68:%.*]] = load float, ptr poison, align 8 19; CHECK-NEXT: [[I69:%.*]] = load float, ptr poison, align 4 20; CHECK-NEXT: [[I70:%.*]] = load float, ptr poison, align 4 21; CHECK-NEXT: [[I71:%.*]] = load float, ptr poison, align 16 22; CHECK-NEXT: [[I72:%.*]] = load float, ptr poison, align 4 23; CHECK-NEXT: [[I73:%.*]] = load float, ptr poison, align 8 24; CHECK-NEXT: [[I74:%.*]] = load float, ptr poison, align 4 25; CHECK-NEXT: [[I75:%.*]] = load float, ptr poison, align 16 26; CHECK-NEXT: [[I76:%.*]] = load float, ptr poison, align 4 27; CHECK-NEXT: [[TMP1:%.*]] = insertelement <16 x float> poison, float [[I76]], i32 0 28; CHECK-NEXT: [[TMP2:%.*]] = insertelement <16 x float> [[TMP1]], float [[I75]], i32 1 29; CHECK-NEXT: [[TMP3:%.*]] = insertelement <16 x float> [[TMP2]], float [[I74]], i32 2 30; CHECK-NEXT: [[TMP4:%.*]] = insertelement <16 x float> [[TMP3]], float [[I73]], i32 3 31; CHECK-NEXT: [[TMP5:%.*]] = insertelement <16 x float> [[TMP4]], float [[I71]], i32 4 32; CHECK-NEXT: [[TMP6:%.*]] = insertelement <16 x float> [[TMP5]], float [[I70]], i32 5 33; CHECK-NEXT: [[TMP7:%.*]] = insertelement <16 x float> [[TMP6]], float [[I68]], i32 6 34; CHECK-NEXT: [[TMP8:%.*]] = insertelement <16 x float> [[TMP7]], float [[I66]], i32 7 35; CHECK-NEXT: [[TMP9:%.*]] = insertelement <16 x float> [[TMP8]], float [[I72]], i32 13 36; CHECK-NEXT: [[TMP10:%.*]] = insertelement <16 x float> [[TMP9]], float [[I67]], i32 14 37; CHECK-NEXT: [[TMP11:%.*]] = insertelement <16 x float> [[TMP10]], float [[I69]], i32 15 38; CHECK-NEXT: br i1 poison, label %[[BB167:.*]], label %[[BB77:.*]] 39; CHECK: [[BB77]]: 40; CHECK-NEXT: [[TMP12:%.*]] = shufflevector <16 x float> [[TMP11]], <16 x float> poison, <8 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 14, i32 15, i32 poison, i32 poison> 41; CHECK-NEXT: [[TMP17:%.*]] = insertelement <8 x float> [[TMP12]], float [[I70]], i32 0 42; CHECK-NEXT: [[TMP30:%.*]] = insertelement <2 x float> poison, float [[I68]], i32 0 43; CHECK-NEXT: [[TMP31:%.*]] = insertelement <2 x float> [[TMP30]], float [[I66]], i32 1 44; CHECK-NEXT: [[TMP39:%.*]] = shufflevector <16 x float> [[TMP25]], <16 x float> poison, <16 x i32> <i32 poison, i32 poison, i32 3, i32 2, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> 45; CHECK-NEXT: [[TMP13:%.*]] = shufflevector <16 x float> [[TMP39]], <16 x float> [[TMP25]], <16 x i32> <i32 poison, i32 poison, i32 2, i32 3, i32 18, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 19, i32 poison, i32 poison> 46; CHECK-NEXT: br label %[[BB78:.*]] 47; CHECK: [[BB78]]: 48; CHECK-NEXT: [[TMP15:%.*]] = phi <8 x float> [ [[TMP17]], %[[BB77]] ], [ [[TMP36:%.*]], %[[BB78]] ] 49; CHECK-NEXT: [[TMP16:%.*]] = phi <2 x float> [ [[TMP31]], %[[BB77]] ], [ [[TMP37:%.*]], %[[BB78]] ] 50; CHECK-NEXT: [[TMP38:%.*]] = shufflevector <8 x float> [[TMP15]], <8 x float> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 1, i32 0, i32 3, i32 1, i32 3, i32 5, i32 3, i32 1, i32 0, i32 4, i32 5, i32 5> 51; CHECK-NEXT: [[TMP21:%.*]] = shufflevector <8 x float> [[TMP15]], <8 x float> poison, <16 x i32> <i32 2, i32 poison, i32 0, 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> 52; CHECK-NEXT: [[TMP20:%.*]] = shufflevector <2 x float> [[TMP16]], <2 x float> poison, <16 x i32> <i32 0, i32 1, 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> 53; CHECK-NEXT: [[TMP23:%.*]] = shufflevector <16 x float> [[TMP21]], <16 x float> [[TMP20]], <16 x i32> <i32 0, i32 17, i32 2, i32 16, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> 54; CHECK-NEXT: [[TMP22:%.*]] = shufflevector <8 x float> [[TMP15]], <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> 55; CHECK-NEXT: [[TMP40:%.*]] = shufflevector <16 x float> [[TMP23]], <16 x float> [[TMP22]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 18, i32 6, i32 7, i32 8, i32 20, i32 10, i32 11, i32 12, i32 21, i32 14, i32 15> 56; CHECK-NEXT: [[TMP24:%.*]] = shufflevector <16 x float> [[TMP40]], <16 x float> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 1, i32 5, i32 3, i32 1, i32 3, i32 9, i32 3, i32 1, i32 5, i32 13, i32 9, i32 9> 57; CHECK-NEXT: [[TMP18:%.*]] = fmul fast <16 x float> [[TMP24]], [[TMP13]] 58; CHECK-NEXT: [[TMP26:%.*]] = fmul fast <16 x float> [[TMP38]], [[TMP25]] 59; CHECK-NEXT: [[TMP27:%.*]] = fadd fast <16 x float> [[TMP26]], [[TMP18]] 60; CHECK-NEXT: [[TMP28:%.*]] = fadd fast <16 x float> [[TMP27]], poison 61; CHECK-NEXT: [[TMP29:%.*]] = fadd fast <16 x float> [[TMP28]], poison 62; CHECK-NEXT: [[TMP36]] = shufflevector <16 x float> [[TMP29]], <16 x float> poison, <8 x i32> <i32 5, i32 11, i32 12, i32 10, i32 14, i32 15, i32 poison, i32 poison> 63; CHECK-NEXT: [[TMP37]] = shufflevector <16 x float> [[TMP29]], <16 x float> poison, <2 x i32> <i32 6, i32 7> 64; CHECK-NEXT: br i1 poison, label %[[BB78]], label %[[BB167]] 65; CHECK: [[BB167]]: 66; CHECK-NEXT: [[TMP32:%.*]] = phi <16 x float> [ [[TMP11]], %[[BB64]] ], [ [[TMP29]], %[[BB78]] ] 67; CHECK-NEXT: [[TMP33:%.*]] = extractelement <16 x float> [[TMP32]], i32 14 68; CHECK-NEXT: store float [[TMP33]], ptr poison, align 1 69; CHECK-NEXT: [[TMP34:%.*]] = extractelement <16 x float> [[TMP32]], i32 13 70; CHECK-NEXT: store float [[TMP34]], ptr poison, align 1 71; CHECK-NEXT: [[TMP35:%.*]] = extractelement <16 x float> [[TMP32]], i32 15 72; CHECK-NEXT: br i1 poison, label %[[BB186:.*]], label %[[BB184:.*]] 73; CHECK: [[BB184]]: 74; CHECK-NEXT: br label %[[BB185:.*]] 75; CHECK: [[BB185]]: 76; CHECK-NEXT: br i1 poison, label %[[BB185]], label %[[BB186]] 77; CHECK: [[BB186]]: 78; CHECK-NEXT: [[I187:%.*]] = phi nsz float [ [[TMP35]], %[[BB167]] ], [ poison, %[[BB185]] ] 79; CHECK-NEXT: ret void 80; 81entry: 82 br label %bb61 83 84bb61: 85 br label %bb64 86 87bb62: 88 br i1 poison, label %bb63, label %bb64 89 90bb63: 91 br label %bb64 92 93bb64: 94 %i = phi nsz float [ poison, %bb61 ], [ poison, %bb63 ], [ poison, %bb62 ] 95 %i65 = phi nsz float [ poison, %bb61 ], [ poison, %bb63 ], [ poison, %bb62 ] 96 %i66 = load float, ptr poison, align 16 97 %i67 = load float, ptr poison, align 4 98 %i68 = load float, ptr poison, align 8 99 %i69 = load float, ptr poison, align 4 100 %i70 = load float, ptr poison, align 4 101 %i71 = load float, ptr poison, align 16 102 %i72 = load float, ptr poison, align 4 103 %i73 = load float, ptr poison, align 8 104 %i74 = load float, ptr poison, align 4 105 %i75 = load float, ptr poison, align 16 106 %i76 = load float, ptr poison, align 4 107 br i1 poison, label %bb167, label %bb77 108 109bb77: 110 br label %bb78 111 112bb78: 113 %i79 = phi nsz float [ %i66, %bb77 ], [ %i103, %bb78 ] 114 %i80 = phi nsz float [ %i67, %bb77 ], [ %i104, %bb78 ] 115 %i81 = phi nsz float [ %i68, %bb77 ], [ %i105, %bb78 ] 116 %i82 = phi nsz float [ poison, %bb77 ], [ %i106, %bb78 ] 117 %i83 = phi nsz float [ poison, %bb77 ], [ %i123, %bb78 ] 118 %i84 = phi nsz float [ %i69, %bb77 ], [ %i124, %bb78 ] 119 %i85 = phi nsz float [ poison, %bb77 ], [ %i125, %bb78 ] 120 %i86 = phi nsz float [ %i70, %bb77 ], [ %i126, %bb78 ] 121 %i87 = fmul fast float %i79, poison 122 %i88 = fmul fast float %i80, poison 123 %i89 = fmul fast float %i81, poison 124 %i90 = fmul fast float %i82, poison 125 %i91 = fmul fast float %i83, poison 126 %i92 = fadd fast float %i91, %i87 127 %i93 = fmul fast float %i84, poison 128 %i94 = fadd fast float %i93, %i88 129 %i95 = fmul fast float %i85, poison 130 %i96 = fadd fast float %i95, %i89 131 %i97 = fmul fast float %i86, poison 132 %i98 = fadd fast float %i97, %i90 133 %i99 = fadd fast float %i92, poison 134 %i100 = fadd fast float %i94, poison 135 %i101 = fadd fast float %i96, poison 136 %i102 = fadd fast float %i98, poison 137 %i103 = fadd fast float %i99, poison 138 %i104 = fadd fast float %i100, poison 139 %i105 = fadd fast float %i101, poison 140 %i106 = fadd fast float %i102, poison 141 %i107 = fmul fast float %i79, poison 142 %i108 = fmul fast float %i80, poison 143 %i109 = fmul fast float %i81, poison 144 %i110 = fmul fast float %i82, poison 145 %i111 = fmul fast float %i83, poison 146 %i112 = fadd fast float %i111, %i107 147 %i113 = fmul fast float %i84, poison 148 %i114 = fadd fast float %i113, %i108 149 %i115 = fmul fast float %i85, poison 150 %i116 = fadd fast float %i115, %i109 151 %i117 = fmul fast float %i86, poison 152 %i118 = fadd fast float %i117, %i110 153 %i119 = fadd fast float %i112, poison 154 %i120 = fadd fast float %i114, poison 155 %i121 = fadd fast float %i116, poison 156 %i122 = fadd fast float %i118, poison 157 %i123 = fadd fast float %i119, poison 158 %i124 = fadd fast float %i120, poison 159 %i125 = fadd fast float %i121, poison 160 %i126 = fadd fast float %i122, poison 161 %i127 = fmul fast float %i79, %i 162 %i128 = fmul fast float %i80, %i 163 %i129 = fmul fast float %i81, %i 164 %i130 = fmul fast float %i82, %i 165 %i131 = fmul fast float %i83, %i65 166 %i132 = fadd fast float %i131, %i127 167 %i133 = fmul fast float %i84, %i65 168 %i134 = fadd fast float %i133, %i128 169 %i135 = fmul fast float %i85, %i65 170 %i136 = fadd fast float %i135, %i129 171 %i137 = fmul fast float %i86, %i65 172 %i138 = fadd fast float %i137, %i130 173 %i139 = fadd fast float %i132, poison 174 %i140 = fadd fast float %i134, poison 175 %i141 = fadd fast float %i136, poison 176 %i142 = fadd fast float %i138, poison 177 %i143 = fadd fast float %i139, poison 178 %i144 = fadd fast float %i140, poison 179 %i145 = fadd fast float %i141, poison 180 %i146 = fadd fast float %i142, poison 181 %i147 = fmul fast float %i79, poison 182 %i148 = fmul fast float %i80, poison 183 %i149 = fmul fast float %i81, poison 184 %i150 = fmul fast float %i82, poison 185 %i151 = fmul fast float %i83, poison 186 %i152 = fadd fast float %i151, %i147 187 %i153 = fmul fast float %i84, poison 188 %i154 = fadd fast float %i153, %i148 189 %i155 = fmul fast float %i85, poison 190 %i156 = fadd fast float %i155, %i149 191 %i157 = fmul fast float %i86, poison 192 %i158 = fadd fast float %i157, %i150 193 %i159 = fadd fast float %i152, poison 194 %i160 = fadd fast float %i154, poison 195 %i161 = fadd fast float %i156, poison 196 %i162 = fadd fast float %i158, poison 197 %i163 = fadd fast float %i159, poison 198 %i164 = fadd fast float %i160, poison 199 %i165 = fadd fast float %i161, poison 200 %i166 = fadd fast float %i162, poison 201 br i1 poison, label %bb78, label %bb167 202 203bb167: 204 %i168 = phi nsz float [ %i76, %bb64 ], [ %i166, %bb78 ] 205 %i169 = phi nsz float [ poison, %bb64 ], [ %i165, %bb78 ] 206 %i170 = phi nsz float [ poison, %bb64 ], [ %i164, %bb78 ] 207 %i171 = phi nsz float [ %i75, %bb64 ], [ %i163, %bb78 ] 208 %i172 = phi nsz float [ %i74, %bb64 ], [ %i146, %bb78 ] 209 %i173 = phi nsz float [ %i73, %bb64 ], [ %i145, %bb78 ] 210 %i174 = phi nsz float [ %i72, %bb64 ], [ %i144, %bb78 ] 211 %i175 = phi nsz float [ %i71, %bb64 ], [ %i143, %bb78 ] 212 %i176 = phi nsz float [ %i70, %bb64 ], [ %i126, %bb78 ] 213 %i177 = phi nsz float [ poison, %bb64 ], [ %i125, %bb78 ] 214 %i178 = phi nsz float [ %i69, %bb64 ], [ %i124, %bb78 ] 215 %i179 = phi nsz float [ poison, %bb64 ], [ %i123, %bb78 ] 216 %i180 = phi nsz float [ poison, %bb64 ], [ %i106, %bb78 ] 217 %i181 = phi nsz float [ %i68, %bb64 ], [ %i105, %bb78 ] 218 %i182 = phi nsz float [ %i67, %bb64 ], [ %i104, %bb78 ] 219 %i183 = phi nsz float [ %i66, %bb64 ], [ %i103, %bb78 ] 220 store float %i182, ptr poison, align 1 221 store float %i174, ptr poison, align 1 222 br i1 poison, label %bb186, label %bb184 223 224bb184: 225 br label %bb185 226 227bb185: 228 br i1 poison, label %bb185, label %bb186 229 230bb186: 231 %i187 = phi nsz float [ %i178, %bb167 ], [ poison, %bb185 ] 232 ret void 233} 234