522 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=slp-vectorizer,dce -slp-threshold=-999 -S -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s3 4target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"5target triple = "x86_64-apple-macosx10.8.0"6 7declare double @llvm.fabs.f64(double) nounwind readnone8 9define void @vec_fabs_f64(ptr %a, ptr %b, ptr %c) {10; CHECK-LABEL: @vec_fabs_f64(11; CHECK-NEXT: entry:12; CHECK-NEXT: [[TMP1:%.*]] = load <2 x double>, ptr [[A:%.*]], align 813; CHECK-NEXT: [[TMP3:%.*]] = load <2 x double>, ptr [[B:%.*]], align 814; CHECK-NEXT: [[TMP4:%.*]] = fmul <2 x double> [[TMP1]], [[TMP3]]15; CHECK-NEXT: [[TMP5:%.*]] = call <2 x double> @llvm.fabs.v2f64(<2 x double> [[TMP4]])16; CHECK-NEXT: store <2 x double> [[TMP5]], ptr [[C:%.*]], align 817; CHECK-NEXT: ret void18;19entry:20 %i0 = load double, ptr %a, align 821 %i1 = load double, ptr %b, align 822 %mul = fmul double %i0, %i123 %call = tail call double @llvm.fabs.f64(double %mul) nounwind readnone24 %arrayidx3 = getelementptr inbounds double, ptr %a, i64 125 %i3 = load double, ptr %arrayidx3, align 826 %arrayidx4 = getelementptr inbounds double, ptr %b, i64 127 %i4 = load double, ptr %arrayidx4, align 828 %mul5 = fmul double %i3, %i429 %call5 = tail call double @llvm.fabs.f64(double %mul5) nounwind readnone30 store double %call, ptr %c, align 831 %arrayidx5 = getelementptr inbounds double, ptr %c, i64 132 store double %call5, ptr %arrayidx5, align 833 ret void34}35 36declare float @llvm.copysign.f32(float, float) nounwind readnone37 38define void @vec_copysign_f32(ptr %a, ptr %b, ptr noalias %c) {39; CHECK-LABEL: @vec_copysign_f32(40; CHECK-NEXT: entry:41; CHECK-NEXT: [[TMP1:%.*]] = load <4 x float>, ptr [[A:%.*]], align 442; CHECK-NEXT: [[TMP3:%.*]] = load <4 x float>, ptr [[B:%.*]], align 443; CHECK-NEXT: [[TMP4:%.*]] = call <4 x float> @llvm.copysign.v4f32(<4 x float> [[TMP1]], <4 x float> [[TMP3]])44; CHECK-NEXT: store <4 x float> [[TMP4]], ptr [[C:%.*]], align 445; CHECK-NEXT: ret void46;47entry:48 %0 = load float, ptr %a, align 449 %1 = load float, ptr %b, align 450 %call0 = tail call float @llvm.copysign.f32(float %0, float %1) nounwind readnone51 store float %call0, ptr %c, align 452 53 %ix2 = getelementptr inbounds float, ptr %a, i64 154 %2 = load float, ptr %ix2, align 455 %ix3 = getelementptr inbounds float, ptr %b, i64 156 %3 = load float, ptr %ix3, align 457 %call1 = tail call float @llvm.copysign.f32(float %2, float %3) nounwind readnone58 %c1 = getelementptr inbounds float, ptr %c, i64 159 store float %call1, ptr %c1, align 460 61 %ix4 = getelementptr inbounds float, ptr %a, i64 262 %4 = load float, ptr %ix4, align 463 %ix5 = getelementptr inbounds float, ptr %b, i64 264 %5 = load float, ptr %ix5, align 465 %call2 = tail call float @llvm.copysign.f32(float %4, float %5) nounwind readnone66 %c2 = getelementptr inbounds float, ptr %c, i64 267 store float %call2, ptr %c2, align 468 69 %ix6 = getelementptr inbounds float, ptr %a, i64 370 %6 = load float, ptr %ix6, align 471 %ix7 = getelementptr inbounds float, ptr %b, i64 372 %7 = load float, ptr %ix7, align 473 %call3 = tail call float @llvm.copysign.f32(float %6, float %7) nounwind readnone74 %c3 = getelementptr inbounds float, ptr %c, i64 375 store float %call3, ptr %c3, align 476 77 ret void78}79 80declare i32 @llvm.bswap.i32(i32) nounwind readnone81 82define void @vec_bswap_i32(ptr %a, ptr %b, ptr %c) {83; CHECK-LABEL: @vec_bswap_i32(84; CHECK-NEXT: entry:85; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[A:%.*]], align 486; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr [[B:%.*]], align 487; CHECK-NEXT: [[TMP4:%.*]] = add <4 x i32> [[TMP1]], [[TMP3]]88; CHECK-NEXT: [[TMP5:%.*]] = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> [[TMP4]])89; CHECK-NEXT: store <4 x i32> [[TMP5]], ptr [[C:%.*]], align 490; CHECK-NEXT: ret void91;92entry:93 %i0 = load i32, ptr %a, align 494 %i1 = load i32, ptr %b, align 495 %add1 = add i32 %i0, %i196 %call1 = tail call i32 @llvm.bswap.i32(i32 %add1) nounwind readnone97 98 %arrayidx2 = getelementptr inbounds i32, ptr %a, i32 199 %i2 = load i32, ptr %arrayidx2, align 4100 %arrayidx3 = getelementptr inbounds i32, ptr %b, i32 1101 %i3 = load i32, ptr %arrayidx3, align 4102 %add2 = add i32 %i2, %i3103 %call2 = tail call i32 @llvm.bswap.i32(i32 %add2) nounwind readnone104 105 %arrayidx4 = getelementptr inbounds i32, ptr %a, i32 2106 %i4 = load i32, ptr %arrayidx4, align 4107 %arrayidx5 = getelementptr inbounds i32, ptr %b, i32 2108 %i5 = load i32, ptr %arrayidx5, align 4109 %add3 = add i32 %i4, %i5110 %call3 = tail call i32 @llvm.bswap.i32(i32 %add3) nounwind readnone111 112 %arrayidx6 = getelementptr inbounds i32, ptr %a, i32 3113 %i6 = load i32, ptr %arrayidx6, align 4114 %arrayidx7 = getelementptr inbounds i32, ptr %b, i32 3115 %i7 = load i32, ptr %arrayidx7, align 4116 %add4 = add i32 %i6, %i7117 %call4 = tail call i32 @llvm.bswap.i32(i32 %add4) nounwind readnone118 119 store i32 %call1, ptr %c, align 4120 %arrayidx8 = getelementptr inbounds i32, ptr %c, i32 1121 store i32 %call2, ptr %arrayidx8, align 4122 %arrayidx9 = getelementptr inbounds i32, ptr %c, i32 2123 store i32 %call3, ptr %arrayidx9, align 4124 %arrayidx10 = getelementptr inbounds i32, ptr %c, i32 3125 store i32 %call4, ptr %arrayidx10, align 4126 ret void127 128}129 130declare i32 @llvm.ctlz.i32(i32,i1) nounwind readnone131 132define void @vec_ctlz_i32(ptr %a, ptr %b, ptr %c, i1) {133; CHECK-LABEL: @vec_ctlz_i32(134; CHECK-NEXT: entry:135; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr [[A:%.*]], align 4136; CHECK-NEXT: [[TMP4:%.*]] = load <4 x i32>, ptr [[B:%.*]], align 4137; CHECK-NEXT: [[TMP5:%.*]] = add <4 x i32> [[TMP2]], [[TMP4]]138; CHECK-NEXT: [[TMP6:%.*]] = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> [[TMP5]], i1 true)139; CHECK-NEXT: store <4 x i32> [[TMP6]], ptr [[C:%.*]], align 4140; CHECK-NEXT: ret void141;142entry:143 %i0 = load i32, ptr %a, align 4144 %i1 = load i32, ptr %b, align 4145 %add1 = add i32 %i0, %i1146 %call1 = tail call i32 @llvm.ctlz.i32(i32 %add1,i1 true) nounwind readnone147 148 %arrayidx2 = getelementptr inbounds i32, ptr %a, i32 1149 %i2 = load i32, ptr %arrayidx2, align 4150 %arrayidx3 = getelementptr inbounds i32, ptr %b, i32 1151 %i3 = load i32, ptr %arrayidx3, align 4152 %add2 = add i32 %i2, %i3153 %call2 = tail call i32 @llvm.ctlz.i32(i32 %add2,i1 true) nounwind readnone154 155 %arrayidx4 = getelementptr inbounds i32, ptr %a, i32 2156 %i4 = load i32, ptr %arrayidx4, align 4157 %arrayidx5 = getelementptr inbounds i32, ptr %b, i32 2158 %i5 = load i32, ptr %arrayidx5, align 4159 %add3 = add i32 %i4, %i5160 %call3 = tail call i32 @llvm.ctlz.i32(i32 %add3,i1 true) nounwind readnone161 162 %arrayidx6 = getelementptr inbounds i32, ptr %a, i32 3163 %i6 = load i32, ptr %arrayidx6, align 4164 %arrayidx7 = getelementptr inbounds i32, ptr %b, i32 3165 %i7 = load i32, ptr %arrayidx7, align 4166 %add4 = add i32 %i6, %i7167 %call4 = tail call i32 @llvm.ctlz.i32(i32 %add4,i1 true) nounwind readnone168 169 store i32 %call1, ptr %c, align 4170 %arrayidx8 = getelementptr inbounds i32, ptr %c, i32 1171 store i32 %call2, ptr %arrayidx8, align 4172 %arrayidx9 = getelementptr inbounds i32, ptr %c, i32 2173 store i32 %call3, ptr %arrayidx9, align 4174 %arrayidx10 = getelementptr inbounds i32, ptr %c, i32 3175 store i32 %call4, ptr %arrayidx10, align 4176 ret void177 178}179 180define void @vec_ctlz_i32_neg(ptr %a, ptr %b, ptr %c, i1) {181; CHECK-LABEL: @vec_ctlz_i32_neg(182; CHECK-NEXT: entry:183; CHECK-NEXT: [[I0:%.*]] = load i32, ptr [[A:%.*]], align 4184; CHECK-NEXT: [[I1:%.*]] = load i32, ptr [[B:%.*]], align 4185; CHECK-NEXT: [[ADD1:%.*]] = add i32 [[I0]], [[I1]]186; CHECK-NEXT: [[CALL1:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[ADD1]], i1 true) #[[ATTR3:[0-9]+]]187; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 1188; CHECK-NEXT: [[I2:%.*]] = load i32, ptr [[ARRAYIDX2]], align 4189; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 1190; CHECK-NEXT: [[I3:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4191; CHECK-NEXT: [[ADD2:%.*]] = add i32 [[I2]], [[I3]]192; CHECK-NEXT: [[CALL2:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[ADD2]], i1 false) #[[ATTR3]]193; CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 2194; CHECK-NEXT: [[I4:%.*]] = load i32, ptr [[ARRAYIDX4]], align 4195; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 2196; CHECK-NEXT: [[I5:%.*]] = load i32, ptr [[ARRAYIDX5]], align 4197; CHECK-NEXT: [[ADD3:%.*]] = add i32 [[I4]], [[I5]]198; CHECK-NEXT: [[CALL3:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[ADD3]], i1 true) #[[ATTR3]]199; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 3200; CHECK-NEXT: [[I6:%.*]] = load i32, ptr [[ARRAYIDX6]], align 4201; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 3202; CHECK-NEXT: [[I7:%.*]] = load i32, ptr [[ARRAYIDX7]], align 4203; CHECK-NEXT: [[ADD4:%.*]] = add i32 [[I6]], [[I7]]204; CHECK-NEXT: [[CALL4:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[ADD4]], i1 false) #[[ATTR3]]205; CHECK-NEXT: store i32 [[CALL1]], ptr [[C:%.*]], align 4206; CHECK-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, ptr [[C]], i32 1207; CHECK-NEXT: store i32 [[CALL2]], ptr [[ARRAYIDX8]], align 4208; CHECK-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds i32, ptr [[C]], i32 2209; CHECK-NEXT: store i32 [[CALL3]], ptr [[ARRAYIDX9]], align 4210; CHECK-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds i32, ptr [[C]], i32 3211; CHECK-NEXT: store i32 [[CALL4]], ptr [[ARRAYIDX10]], align 4212; CHECK-NEXT: ret void213;214entry:215 %i0 = load i32, ptr %a, align 4216 %i1 = load i32, ptr %b, align 4217 %add1 = add i32 %i0, %i1218 %call1 = tail call i32 @llvm.ctlz.i32(i32 %add1,i1 true) nounwind readnone219 220 %arrayidx2 = getelementptr inbounds i32, ptr %a, i32 1221 %i2 = load i32, ptr %arrayidx2, align 4222 %arrayidx3 = getelementptr inbounds i32, ptr %b, i32 1223 %i3 = load i32, ptr %arrayidx3, align 4224 %add2 = add i32 %i2, %i3225 %call2 = tail call i32 @llvm.ctlz.i32(i32 %add2,i1 false) nounwind readnone226 227 %arrayidx4 = getelementptr inbounds i32, ptr %a, i32 2228 %i4 = load i32, ptr %arrayidx4, align 4229 %arrayidx5 = getelementptr inbounds i32, ptr %b, i32 2230 %i5 = load i32, ptr %arrayidx5, align 4231 %add3 = add i32 %i4, %i5232 %call3 = tail call i32 @llvm.ctlz.i32(i32 %add3,i1 true) nounwind readnone233 234 %arrayidx6 = getelementptr inbounds i32, ptr %a, i32 3235 %i6 = load i32, ptr %arrayidx6, align 4236 %arrayidx7 = getelementptr inbounds i32, ptr %b, i32 3237 %i7 = load i32, ptr %arrayidx7, align 4238 %add4 = add i32 %i6, %i7239 %call4 = tail call i32 @llvm.ctlz.i32(i32 %add4,i1 false) nounwind readnone240 241 store i32 %call1, ptr %c, align 4242 %arrayidx8 = getelementptr inbounds i32, ptr %c, i32 1243 store i32 %call2, ptr %arrayidx8, align 4244 %arrayidx9 = getelementptr inbounds i32, ptr %c, i32 2245 store i32 %call3, ptr %arrayidx9, align 4246 %arrayidx10 = getelementptr inbounds i32, ptr %c, i32 3247 store i32 %call4, ptr %arrayidx10, align 4248 ret void249 250 251}252 253 254declare i32 @llvm.cttz.i32(i32,i1) nounwind readnone255 256define void @vec_cttz_i32(ptr %a, ptr %b, ptr %c, i1) {257; CHECK-LABEL: @vec_cttz_i32(258; CHECK-NEXT: entry:259; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr [[A:%.*]], align 4260; CHECK-NEXT: [[TMP4:%.*]] = load <4 x i32>, ptr [[B:%.*]], align 4261; CHECK-NEXT: [[TMP5:%.*]] = add <4 x i32> [[TMP2]], [[TMP4]]262; CHECK-NEXT: [[TMP6:%.*]] = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> [[TMP5]], i1 true)263; CHECK-NEXT: store <4 x i32> [[TMP6]], ptr [[C:%.*]], align 4264; CHECK-NEXT: ret void265;266entry:267 %i0 = load i32, ptr %a, align 4268 %i1 = load i32, ptr %b, align 4269 %add1 = add i32 %i0, %i1270 %call1 = tail call i32 @llvm.cttz.i32(i32 %add1,i1 true) nounwind readnone271 272 %arrayidx2 = getelementptr inbounds i32, ptr %a, i32 1273 %i2 = load i32, ptr %arrayidx2, align 4274 %arrayidx3 = getelementptr inbounds i32, ptr %b, i32 1275 %i3 = load i32, ptr %arrayidx3, align 4276 %add2 = add i32 %i2, %i3277 %call2 = tail call i32 @llvm.cttz.i32(i32 %add2,i1 true) nounwind readnone278 279 %arrayidx4 = getelementptr inbounds i32, ptr %a, i32 2280 %i4 = load i32, ptr %arrayidx4, align 4281 %arrayidx5 = getelementptr inbounds i32, ptr %b, i32 2282 %i5 = load i32, ptr %arrayidx5, align 4283 %add3 = add i32 %i4, %i5284 %call3 = tail call i32 @llvm.cttz.i32(i32 %add3,i1 true) nounwind readnone285 286 %arrayidx6 = getelementptr inbounds i32, ptr %a, i32 3287 %i6 = load i32, ptr %arrayidx6, align 4288 %arrayidx7 = getelementptr inbounds i32, ptr %b, i32 3289 %i7 = load i32, ptr %arrayidx7, align 4290 %add4 = add i32 %i6, %i7291 %call4 = tail call i32 @llvm.cttz.i32(i32 %add4,i1 true) nounwind readnone292 293 store i32 %call1, ptr %c, align 4294 %arrayidx8 = getelementptr inbounds i32, ptr %c, i32 1295 store i32 %call2, ptr %arrayidx8, align 4296 %arrayidx9 = getelementptr inbounds i32, ptr %c, i32 2297 store i32 %call3, ptr %arrayidx9, align 4298 %arrayidx10 = getelementptr inbounds i32, ptr %c, i32 3299 store i32 %call4, ptr %arrayidx10, align 4300 ret void301 302}303 304define void @vec_cttz_i32_neg(ptr %a, ptr %b, ptr %c, i1) {305; CHECK-LABEL: @vec_cttz_i32_neg(306; CHECK-NEXT: entry:307; CHECK-NEXT: [[I0:%.*]] = load i32, ptr [[A:%.*]], align 4308; CHECK-NEXT: [[I1:%.*]] = load i32, ptr [[B:%.*]], align 4309; CHECK-NEXT: [[ADD1:%.*]] = add i32 [[I0]], [[I1]]310; CHECK-NEXT: [[CALL1:%.*]] = tail call i32 @llvm.cttz.i32(i32 [[ADD1]], i1 true) #[[ATTR3]]311; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 1312; CHECK-NEXT: [[I2:%.*]] = load i32, ptr [[ARRAYIDX2]], align 4313; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 1314; CHECK-NEXT: [[I3:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4315; CHECK-NEXT: [[ADD2:%.*]] = add i32 [[I2]], [[I3]]316; CHECK-NEXT: [[CALL2:%.*]] = tail call i32 @llvm.cttz.i32(i32 [[ADD2]], i1 false) #[[ATTR3]]317; CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 2318; CHECK-NEXT: [[I4:%.*]] = load i32, ptr [[ARRAYIDX4]], align 4319; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 2320; CHECK-NEXT: [[I5:%.*]] = load i32, ptr [[ARRAYIDX5]], align 4321; CHECK-NEXT: [[ADD3:%.*]] = add i32 [[I4]], [[I5]]322; CHECK-NEXT: [[CALL3:%.*]] = tail call i32 @llvm.cttz.i32(i32 [[ADD3]], i1 true) #[[ATTR3]]323; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 3324; CHECK-NEXT: [[I6:%.*]] = load i32, ptr [[ARRAYIDX6]], align 4325; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 3326; CHECK-NEXT: [[I7:%.*]] = load i32, ptr [[ARRAYIDX7]], align 4327; CHECK-NEXT: [[ADD4:%.*]] = add i32 [[I6]], [[I7]]328; CHECK-NEXT: [[CALL4:%.*]] = tail call i32 @llvm.cttz.i32(i32 [[ADD4]], i1 false) #[[ATTR3]]329; CHECK-NEXT: store i32 [[CALL1]], ptr [[C:%.*]], align 4330; CHECK-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, ptr [[C]], i32 1331; CHECK-NEXT: store i32 [[CALL2]], ptr [[ARRAYIDX8]], align 4332; CHECK-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds i32, ptr [[C]], i32 2333; CHECK-NEXT: store i32 [[CALL3]], ptr [[ARRAYIDX9]], align 4334; CHECK-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds i32, ptr [[C]], i32 3335; CHECK-NEXT: store i32 [[CALL4]], ptr [[ARRAYIDX10]], align 4336; CHECK-NEXT: ret void337;338entry:339 %i0 = load i32, ptr %a, align 4340 %i1 = load i32, ptr %b, align 4341 %add1 = add i32 %i0, %i1342 %call1 = tail call i32 @llvm.cttz.i32(i32 %add1,i1 true) nounwind readnone343 344 %arrayidx2 = getelementptr inbounds i32, ptr %a, i32 1345 %i2 = load i32, ptr %arrayidx2, align 4346 %arrayidx3 = getelementptr inbounds i32, ptr %b, i32 1347 %i3 = load i32, ptr %arrayidx3, align 4348 %add2 = add i32 %i2, %i3349 %call2 = tail call i32 @llvm.cttz.i32(i32 %add2,i1 false) nounwind readnone350 351 %arrayidx4 = getelementptr inbounds i32, ptr %a, i32 2352 %i4 = load i32, ptr %arrayidx4, align 4353 %arrayidx5 = getelementptr inbounds i32, ptr %b, i32 2354 %i5 = load i32, ptr %arrayidx5, align 4355 %add3 = add i32 %i4, %i5356 %call3 = tail call i32 @llvm.cttz.i32(i32 %add3,i1 true) nounwind readnone357 358 %arrayidx6 = getelementptr inbounds i32, ptr %a, i32 3359 %i6 = load i32, ptr %arrayidx6, align 4360 %arrayidx7 = getelementptr inbounds i32, ptr %b, i32 3361 %i7 = load i32, ptr %arrayidx7, align 4362 %add4 = add i32 %i6, %i7363 %call4 = tail call i32 @llvm.cttz.i32(i32 %add4,i1 false) nounwind readnone364 365 store i32 %call1, ptr %c, align 4366 %arrayidx8 = getelementptr inbounds i32, ptr %c, i32 1367 store i32 %call2, ptr %arrayidx8, align 4368 %arrayidx9 = getelementptr inbounds i32, ptr %c, i32 2369 store i32 %call3, ptr %arrayidx9, align 4370 %arrayidx10 = getelementptr inbounds i32, ptr %c, i32 3371 store i32 %call4, ptr %arrayidx10, align 4372 ret void373 374}375 376 377declare float @llvm.powi.f32.i32(float, i32)378define void @vec_powi_f32(ptr %a, ptr %b, ptr %c, i32 %P) {379; CHECK-LABEL: @vec_powi_f32(380; CHECK-NEXT: entry:381; CHECK-NEXT: [[I0:%.*]] = load float, ptr [[A:%.*]], align 4382; CHECK-NEXT: [[I1:%.*]] = load float, ptr [[B:%.*]], align 4383; CHECK-NEXT: [[ADD1:%.*]] = fadd float [[I0]], [[I1]]384; CHECK-NEXT: [[CALL1:%.*]] = tail call float @llvm.powi.f32.i32(float [[ADD1]], i32 [[P:%.*]]) #[[ATTR3]]385; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[A]], i32 1386; CHECK-NEXT: [[I2:%.*]] = load float, ptr [[ARRAYIDX2]], align 4387; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds float, ptr [[B]], i32 1388; CHECK-NEXT: [[I3:%.*]] = load float, ptr [[ARRAYIDX3]], align 4389; CHECK-NEXT: [[ADD2:%.*]] = fadd float [[I2]], [[I3]]390; CHECK-NEXT: [[CALL2:%.*]] = tail call float @llvm.powi.f32.i32(float [[ADD2]], i32 [[P]]) #[[ATTR3]]391; CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds float, ptr [[A]], i32 2392; CHECK-NEXT: [[I4:%.*]] = load float, ptr [[ARRAYIDX4]], align 4393; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds float, ptr [[B]], i32 2394; CHECK-NEXT: [[I5:%.*]] = load float, ptr [[ARRAYIDX5]], align 4395; CHECK-NEXT: [[ADD3:%.*]] = fadd float [[I4]], [[I5]]396; CHECK-NEXT: [[CALL3:%.*]] = tail call float @llvm.powi.f32.i32(float [[ADD3]], i32 [[P]]) #[[ATTR3]]397; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds float, ptr [[A]], i32 3398; CHECK-NEXT: [[I6:%.*]] = load float, ptr [[ARRAYIDX6]], align 4399; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds float, ptr [[B]], i32 3400; CHECK-NEXT: [[I7:%.*]] = load float, ptr [[ARRAYIDX7]], align 4401; CHECK-NEXT: [[ADD4:%.*]] = fadd float [[I6]], [[I7]]402; CHECK-NEXT: [[CALL4:%.*]] = tail call float @llvm.powi.f32.i32(float [[ADD4]], i32 [[P]]) #[[ATTR3]]403; CHECK-NEXT: store float [[CALL1]], ptr [[C:%.*]], align 4404; CHECK-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds float, ptr [[C]], i32 1405; CHECK-NEXT: store float [[CALL2]], ptr [[ARRAYIDX8]], align 4406; CHECK-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds float, ptr [[C]], i32 2407; CHECK-NEXT: store float [[CALL3]], ptr [[ARRAYIDX9]], align 4408; CHECK-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds float, ptr [[C]], i32 3409; CHECK-NEXT: store float [[CALL4]], ptr [[ARRAYIDX10]], align 4410; CHECK-NEXT: ret void411;412entry:413 %i0 = load float, ptr %a, align 4414 %i1 = load float, ptr %b, align 4415 %add1 = fadd float %i0, %i1416 %call1 = tail call float @llvm.powi.f32.i32(float %add1,i32 %P) nounwind readnone417 418 %arrayidx2 = getelementptr inbounds float, ptr %a, i32 1419 %i2 = load float, ptr %arrayidx2, align 4420 %arrayidx3 = getelementptr inbounds float, ptr %b, i32 1421 %i3 = load float, ptr %arrayidx3, align 4422 %add2 = fadd float %i2, %i3423 %call2 = tail call float @llvm.powi.f32.i32(float %add2,i32 %P) nounwind readnone424 425 %arrayidx4 = getelementptr inbounds float, ptr %a, i32 2426 %i4 = load float, ptr %arrayidx4, align 4427 %arrayidx5 = getelementptr inbounds float, ptr %b, i32 2428 %i5 = load float, ptr %arrayidx5, align 4429 %add3 = fadd float %i4, %i5430 %call3 = tail call float @llvm.powi.f32.i32(float %add3,i32 %P) nounwind readnone431 432 %arrayidx6 = getelementptr inbounds float, ptr %a, i32 3433 %i6 = load float, ptr %arrayidx6, align 4434 %arrayidx7 = getelementptr inbounds float, ptr %b, i32 3435 %i7 = load float, ptr %arrayidx7, align 4436 %add4 = fadd float %i6, %i7437 %call4 = tail call float @llvm.powi.f32.i32(float %add4,i32 %P) nounwind readnone438 439 store float %call1, ptr %c, align 4440 %arrayidx8 = getelementptr inbounds float, ptr %c, i32 1441 store float %call2, ptr %arrayidx8, align 4442 %arrayidx9 = getelementptr inbounds float, ptr %c, i32 2443 store float %call3, ptr %arrayidx9, align 4444 %arrayidx10 = getelementptr inbounds float, ptr %c, i32 3445 store float %call4, ptr %arrayidx10, align 4446 ret void447 448}449 450 451define void @vec_powi_f32_neg(ptr %a, ptr %b, ptr %c, i32 %P, i32 %Q) {452; CHECK-LABEL: @vec_powi_f32_neg(453; CHECK-NEXT: entry:454; CHECK-NEXT: [[I0:%.*]] = load float, ptr [[A:%.*]], align 4455; CHECK-NEXT: [[I1:%.*]] = load float, ptr [[B:%.*]], align 4456; CHECK-NEXT: [[ADD1:%.*]] = fadd float [[I0]], [[I1]]457; CHECK-NEXT: [[CALL1:%.*]] = tail call float @llvm.powi.f32.i32(float [[ADD1]], i32 [[P:%.*]]) #[[ATTR3]]458; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[A]], i32 1459; CHECK-NEXT: [[I2:%.*]] = load float, ptr [[ARRAYIDX2]], align 4460; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds float, ptr [[B]], i32 1461; CHECK-NEXT: [[I3:%.*]] = load float, ptr [[ARRAYIDX3]], align 4462; CHECK-NEXT: [[ADD2:%.*]] = fadd float [[I2]], [[I3]]463; CHECK-NEXT: [[CALL2:%.*]] = tail call float @llvm.powi.f32.i32(float [[ADD2]], i32 [[Q:%.*]]) #[[ATTR3]]464; CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds float, ptr [[A]], i32 2465; CHECK-NEXT: [[I4:%.*]] = load float, ptr [[ARRAYIDX4]], align 4466; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds float, ptr [[B]], i32 2467; CHECK-NEXT: [[I5:%.*]] = load float, ptr [[ARRAYIDX5]], align 4468; CHECK-NEXT: [[ADD3:%.*]] = fadd float [[I4]], [[I5]]469; CHECK-NEXT: [[CALL3:%.*]] = tail call float @llvm.powi.f32.i32(float [[ADD3]], i32 [[P]]) #[[ATTR3]]470; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds float, ptr [[A]], i32 3471; CHECK-NEXT: [[I6:%.*]] = load float, ptr [[ARRAYIDX6]], align 4472; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds float, ptr [[B]], i32 3473; CHECK-NEXT: [[I7:%.*]] = load float, ptr [[ARRAYIDX7]], align 4474; CHECK-NEXT: [[ADD4:%.*]] = fadd float [[I6]], [[I7]]475; CHECK-NEXT: [[CALL4:%.*]] = tail call float @llvm.powi.f32.i32(float [[ADD4]], i32 [[Q]]) #[[ATTR3]]476; CHECK-NEXT: store float [[CALL1]], ptr [[C:%.*]], align 4477; CHECK-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds float, ptr [[C]], i32 1478; CHECK-NEXT: store float [[CALL2]], ptr [[ARRAYIDX8]], align 4479; CHECK-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds float, ptr [[C]], i32 2480; CHECK-NEXT: store float [[CALL3]], ptr [[ARRAYIDX9]], align 4481; CHECK-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds float, ptr [[C]], i32 3482; CHECK-NEXT: store float [[CALL4]], ptr [[ARRAYIDX10]], align 4483; CHECK-NEXT: ret void484;485entry:486 %i0 = load float, ptr %a, align 4487 %i1 = load float, ptr %b, align 4488 %add1 = fadd float %i0, %i1489 %call1 = tail call float @llvm.powi.f32.i32(float %add1,i32 %P) nounwind readnone490 491 %arrayidx2 = getelementptr inbounds float, ptr %a, i32 1492 %i2 = load float, ptr %arrayidx2, align 4493 %arrayidx3 = getelementptr inbounds float, ptr %b, i32 1494 %i3 = load float, ptr %arrayidx3, align 4495 %add2 = fadd float %i2, %i3496 %call2 = tail call float @llvm.powi.f32.i32(float %add2,i32 %Q) nounwind readnone497 498 %arrayidx4 = getelementptr inbounds float, ptr %a, i32 2499 %i4 = load float, ptr %arrayidx4, align 4500 %arrayidx5 = getelementptr inbounds float, ptr %b, i32 2501 %i5 = load float, ptr %arrayidx5, align 4502 %add3 = fadd float %i4, %i5503 %call3 = tail call float @llvm.powi.f32.i32(float %add3,i32 %P) nounwind readnone504 505 %arrayidx6 = getelementptr inbounds float, ptr %a, i32 3506 %i6 = load float, ptr %arrayidx6, align 4507 %arrayidx7 = getelementptr inbounds float, ptr %b, i32 3508 %i7 = load float, ptr %arrayidx7, align 4509 %add4 = fadd float %i6, %i7510 %call4 = tail call float @llvm.powi.f32.i32(float %add4,i32 %Q) nounwind readnone511 512 store float %call1, ptr %c, align 4513 %arrayidx8 = getelementptr inbounds float, ptr %c, i32 1514 store float %call2, ptr %arrayidx8, align 4515 %arrayidx9 = getelementptr inbounds float, ptr %c, i32 2516 store float %call3, ptr %arrayidx9, align 4517 %arrayidx10 = getelementptr inbounds float, ptr %c, i32 3518 store float %call4, ptr %arrayidx10, align 4519 ret void520 521}522