brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.2 KiB · bb7d54c Raw
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