1; RUN: opt < %s -vector-library=Accelerate -inject-tli-mappings -loop-vectorize -S | FileCheck %s 2 3target 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" 4target triple = "x86_64-unknown-linux-gnu" 5 6;CHECK-LABEL: @sqrt_f32( 7;CHECK: vsqrtf{{.*}}<4 x float> 8;CHECK: ret void 9declare float @sqrtf(float) nounwind readnone 10define void @sqrt_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 11entry: 12 %cmp6 = icmp sgt i32 %n, 0 13 br i1 %cmp6, label %for.body, label %for.end 14 15for.body: ; preds = %entry, %for.body 16 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 17 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 18 %0 = load float, float* %arrayidx, align 4 19 %call = tail call float @sqrtf(float %0) nounwind readnone 20 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 21 store float %call, float* %arrayidx2, align 4 22 %indvars.iv.next = add i64 %indvars.iv, 1 23 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 24 %exitcond = icmp eq i32 %lftr.wideiv, %n 25 br i1 %exitcond, label %for.end, label %for.body 26 27for.end: ; preds = %for.body, %entry 28 ret void 29} 30 31;CHECK-LABEL: @exp_f32( 32;CHECK: vexpf{{.*}}<4 x float> 33;CHECK: ret void 34declare float @expf(float) nounwind readnone 35define void @exp_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 36entry: 37 %cmp6 = icmp sgt i32 %n, 0 38 br i1 %cmp6, label %for.body, label %for.end 39 40for.body: ; preds = %entry, %for.body 41 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 42 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 43 %0 = load float, float* %arrayidx, align 4 44 %call = tail call float @expf(float %0) nounwind readnone 45 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 46 store float %call, float* %arrayidx2, align 4 47 %indvars.iv.next = add i64 %indvars.iv, 1 48 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 49 %exitcond = icmp eq i32 %lftr.wideiv, %n 50 br i1 %exitcond, label %for.end, label %for.body 51 52for.end: ; preds = %for.body, %entry 53 ret void 54} 55 56;CHECK-LABEL: @log_f32( 57;CHECK: vlogf{{.*}}<4 x float> 58;CHECK: ret void 59declare float @logf(float) nounwind readnone 60define void @log_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 61entry: 62 %cmp6 = icmp sgt i32 %n, 0 63 br i1 %cmp6, label %for.body, label %for.end 64 65for.body: ; preds = %entry, %for.body 66 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 67 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 68 %0 = load float, float* %arrayidx, align 4 69 %call = tail call float @logf(float %0) nounwind readnone 70 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 71 store float %call, float* %arrayidx2, align 4 72 %indvars.iv.next = add i64 %indvars.iv, 1 73 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 74 %exitcond = icmp eq i32 %lftr.wideiv, %n 75 br i1 %exitcond, label %for.end, label %for.body 76 77for.end: ; preds = %for.body, %entry 78 ret void 79} 80 81; For abs instruction we'll generate vector intrinsic, as it's cheaper than a lib call. 82;CHECK-LABEL: @fabs_f32( 83;CHECK: fabs{{.*}}<4 x float> 84;CHECK: ret void 85declare float @fabsf(float) nounwind readnone 86define void @fabs_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 87entry: 88 %cmp6 = icmp sgt i32 %n, 0 89 br i1 %cmp6, label %for.body, label %for.end 90 91for.body: ; preds = %entry, %for.body 92 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 93 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 94 %0 = load float, float* %arrayidx, align 4 95 %call = tail call float @fabsf(float %0) nounwind readnone 96 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 97 store float %call, float* %arrayidx2, align 4 98 %indvars.iv.next = add i64 %indvars.iv, 1 99 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 100 %exitcond = icmp eq i32 %lftr.wideiv, %n 101 br i1 %exitcond, label %for.end, label %for.body 102 103for.end: ; preds = %for.body, %entry 104 ret void 105} 106 107; Test that we can vectorize an intrinsic into a vector call. 108;CHECK-LABEL: @exp_f32_intrin( 109;CHECK: vexpf{{.*}}<4 x float> 110;CHECK: ret void 111declare float @llvm.exp.f32(float) nounwind readnone 112define void @exp_f32_intrin(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 113entry: 114 %cmp6 = icmp sgt i32 %n, 0 115 br i1 %cmp6, label %for.body, label %for.end 116 117for.body: ; preds = %entry, %for.body 118 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 119 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 120 %0 = load float, float* %arrayidx, align 4 121 %call = tail call float @llvm.exp.f32(float %0) nounwind readnone 122 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 123 store float %call, float* %arrayidx2, align 4 124 %indvars.iv.next = add i64 %indvars.iv, 1 125 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 126 %exitcond = icmp eq i32 %lftr.wideiv, %n 127 br i1 %exitcond, label %for.end, label %for.body 128 129for.end: ; preds = %for.body, %entry 130 ret void 131} 132 133; Test that we don't vectorize arbitrary functions. 134;CHECK-LABEL: @foo_f32( 135;CHECK-NOT: foo{{.*}}<4 x float> 136;CHECK: ret void 137declare float @foo(float) nounwind readnone 138define void @foo_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 139entry: 140 %cmp6 = icmp sgt i32 %n, 0 141 br i1 %cmp6, label %for.body, label %for.end 142 143for.body: ; preds = %entry, %for.body 144 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 145 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 146 %0 = load float, float* %arrayidx, align 4 147 %call = tail call float @foo(float %0) nounwind readnone 148 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 149 store float %call, float* %arrayidx2, align 4 150 %indvars.iv.next = add i64 %indvars.iv, 1 151 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 152 %exitcond = icmp eq i32 %lftr.wideiv, %n 153 br i1 %exitcond, label %for.end, label %for.body 154 155for.end: ; preds = %for.body, %entry 156 ret void 157} 158 159; Test that we don't vectorize calls with nobuiltin attribute. 160;CHECK-LABEL: @sqrt_f32_nobuiltin( 161;CHECK-NOT: vsqrtf{{.*}}<4 x float> 162;CHECK: ret void 163define void @sqrt_f32_nobuiltin(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 164entry: 165 %cmp6 = icmp sgt i32 %n, 0 166 br i1 %cmp6, label %for.body, label %for.end 167 168for.body: ; preds = %entry, %for.body 169 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 170 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 171 %0 = load float, float* %arrayidx, align 4 172 %call = tail call float @sqrtf(float %0) nounwind readnone nobuiltin 173 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 174 store float %call, float* %arrayidx2, align 4 175 %indvars.iv.next = add i64 %indvars.iv, 1 176 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 177 %exitcond = icmp eq i32 %lftr.wideiv, %n 178 br i1 %exitcond, label %for.end, label %for.body 179 180for.end: ; preds = %for.body, %entry 181 ret void 182} 183 184;CHECK-LABEL: @ceil_f32( 185;CHECK: vceilf{{.*}}<4 x float> 186;CHECK: ret void 187declare float @ceilf(float) nounwind readnone 188define void @ceil_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 189entry: 190 %cmp6 = icmp sgt i32 %n, 0 191 br i1 %cmp6, label %for.body, label %for.end 192 193for.body: ; preds = %entry, %for.body 194 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 195 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 196 %0 = load float, float* %arrayidx, align 4 197 %call = tail call float @ceilf(float %0) nounwind readnone 198 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 199 store float %call, float* %arrayidx2, align 4 200 %indvars.iv.next = add i64 %indvars.iv, 1 201 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 202 %exitcond = icmp eq i32 %lftr.wideiv, %n 203 br i1 %exitcond, label %for.end, label %for.body 204 205for.end: ; preds = %for.body, %entry 206 ret void 207} 208 209;CHECK-LABEL: @floor_f32( 210;CHECK: vfloorf{{.*}}<4 x float> 211;CHECK: ret void 212declare float @floorf(float) nounwind readnone 213define void @floor_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 214entry: 215 %cmp6 = icmp sgt i32 %n, 0 216 br i1 %cmp6, label %for.body, label %for.end 217 218for.body: ; preds = %entry, %for.body 219 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 220 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 221 %0 = load float, float* %arrayidx, align 4 222 %call = tail call float @floorf(float %0) nounwind readnone 223 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 224 store float %call, float* %arrayidx2, align 4 225 %indvars.iv.next = add i64 %indvars.iv, 1 226 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 227 %exitcond = icmp eq i32 %lftr.wideiv, %n 228 br i1 %exitcond, label %for.end, label %for.body 229 230for.end: ; preds = %for.body, %entry 231 ret void 232} 233 234;CHECK-LABEL: @expm1_f32( 235;CHECK: vexpm1f{{.*}}<4 x float> 236;CHECK: ret void 237declare float @expm1f(float) nounwind readnone 238define void @expm1_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 239entry: 240 %cmp6 = icmp sgt i32 %n, 0 241 br i1 %cmp6, label %for.body, label %for.end 242 243for.body: ; preds = %entry, %for.body 244 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 245 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 246 %0 = load float, float* %arrayidx, align 4 247 %call = tail call float @expm1f(float %0) nounwind readnone 248 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 249 store float %call, float* %arrayidx2, align 4 250 %indvars.iv.next = add i64 %indvars.iv, 1 251 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 252 %exitcond = icmp eq i32 %lftr.wideiv, %n 253 br i1 %exitcond, label %for.end, label %for.body 254 255for.end: ; preds = %for.body, %entry 256 ret void 257} 258 259;CHECK-LABEL: @log1p_f32( 260;CHECK: vlog1pf{{.*}}<4 x float> 261;CHECK: ret void 262declare float @log1pf(float) nounwind readnone 263define void @log1p_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 264entry: 265 %cmp6 = icmp sgt i32 %n, 0 266 br i1 %cmp6, label %for.body, label %for.end 267 268for.body: ; preds = %entry, %for.body 269 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 270 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 271 %0 = load float, float* %arrayidx, align 4 272 %call = tail call float @log1pf(float %0) nounwind readnone 273 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 274 store float %call, float* %arrayidx2, align 4 275 %indvars.iv.next = add i64 %indvars.iv, 1 276 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 277 %exitcond = icmp eq i32 %lftr.wideiv, %n 278 br i1 %exitcond, label %for.end, label %for.body 279 280for.end: ; preds = %for.body, %entry 281 ret void 282} 283 284;CHECK-LABEL: @log10_f32( 285;CHECK: vlog10f{{.*}}<4 x float> 286;CHECK: ret void 287declare float @log10f(float) nounwind readnone 288define void @log10_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 289entry: 290 %cmp6 = icmp sgt i32 %n, 0 291 br i1 %cmp6, label %for.body, label %for.end 292 293for.body: ; preds = %entry, %for.body 294 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 295 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 296 %0 = load float, float* %arrayidx, align 4 297 %call = tail call float @log10f(float %0) nounwind readnone 298 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 299 store float %call, float* %arrayidx2, align 4 300 %indvars.iv.next = add i64 %indvars.iv, 1 301 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 302 %exitcond = icmp eq i32 %lftr.wideiv, %n 303 br i1 %exitcond, label %for.end, label %for.body 304 305for.end: ; preds = %for.body, %entry 306 ret void 307} 308 309;CHECK-LABEL: @logb_f32( 310;CHECK: vlogbf{{.*}}<4 x float> 311;CHECK: ret void 312declare float @logbf(float) nounwind readnone 313define void @logb_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 314entry: 315 %cmp6 = icmp sgt i32 %n, 0 316 br i1 %cmp6, label %for.body, label %for.end 317 318for.body: ; preds = %entry, %for.body 319 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 320 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 321 %0 = load float, float* %arrayidx, align 4 322 %call = tail call float @logbf(float %0) nounwind readnone 323 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 324 store float %call, float* %arrayidx2, align 4 325 %indvars.iv.next = add i64 %indvars.iv, 1 326 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 327 %exitcond = icmp eq i32 %lftr.wideiv, %n 328 br i1 %exitcond, label %for.end, label %for.body 329 330for.end: ; preds = %for.body, %entry 331 ret void 332} 333 334;CHECK-LABEL: @sin_f32( 335;CHECK: vsinf{{.*}}<4 x float> 336;CHECK: ret void 337declare float @sinf(float) nounwind readnone 338define void @sin_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 339entry: 340 %cmp6 = icmp sgt i32 %n, 0 341 br i1 %cmp6, label %for.body, label %for.end 342 343for.body: ; preds = %entry, %for.body 344 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 345 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 346 %0 = load float, float* %arrayidx, align 4 347 %call = tail call float @sinf(float %0) nounwind readnone 348 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 349 store float %call, float* %arrayidx2, align 4 350 %indvars.iv.next = add i64 %indvars.iv, 1 351 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 352 %exitcond = icmp eq i32 %lftr.wideiv, %n 353 br i1 %exitcond, label %for.end, label %for.body 354 355for.end: ; preds = %for.body, %entry 356 ret void 357} 358 359;CHECK-LABEL: @cos_f32( 360;CHECK: vcosf{{.*}}<4 x float> 361;CHECK: ret void 362declare float @cosf(float) nounwind readnone 363define void @cos_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 364entry: 365 %cmp6 = icmp sgt i32 %n, 0 366 br i1 %cmp6, label %for.body, label %for.end 367 368for.body: ; preds = %entry, %for.body 369 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 370 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 371 %0 = load float, float* %arrayidx, align 4 372 %call = tail call float @cosf(float %0) nounwind readnone 373 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 374 store float %call, float* %arrayidx2, align 4 375 %indvars.iv.next = add i64 %indvars.iv, 1 376 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 377 %exitcond = icmp eq i32 %lftr.wideiv, %n 378 br i1 %exitcond, label %for.end, label %for.body 379 380for.end: ; preds = %for.body, %entry 381 ret void 382} 383 384;CHECK-LABEL: @tan_f32( 385;CHECK: vtanf{{.*}}<4 x float> 386;CHECK: ret void 387declare float @tanf(float) nounwind readnone 388define void @tan_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 389entry: 390 %cmp6 = icmp sgt i32 %n, 0 391 br i1 %cmp6, label %for.body, label %for.end 392 393for.body: ; preds = %entry, %for.body 394 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 395 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 396 %0 = load float, float* %arrayidx, align 4 397 %call = tail call float @tanf(float %0) nounwind readnone 398 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 399 store float %call, float* %arrayidx2, align 4 400 %indvars.iv.next = add i64 %indvars.iv, 1 401 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 402 %exitcond = icmp eq i32 %lftr.wideiv, %n 403 br i1 %exitcond, label %for.end, label %for.body 404 405for.end: ; preds = %for.body, %entry 406 ret void 407} 408 409;CHECK-LABEL: @asin_f32( 410;CHECK: vasinf{{.*}}<4 x float> 411;CHECK: ret void 412declare float @asinf(float) nounwind readnone 413define void @asin_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 414entry: 415 %cmp6 = icmp sgt i32 %n, 0 416 br i1 %cmp6, label %for.body, label %for.end 417 418for.body: ; preds = %entry, %for.body 419 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 420 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 421 %0 = load float, float* %arrayidx, align 4 422 %call = tail call float @asinf(float %0) nounwind readnone 423 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 424 store float %call, float* %arrayidx2, align 4 425 %indvars.iv.next = add i64 %indvars.iv, 1 426 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 427 %exitcond = icmp eq i32 %lftr.wideiv, %n 428 br i1 %exitcond, label %for.end, label %for.body 429 430for.end: ; preds = %for.body, %entry 431 ret void 432} 433 434;CHECK-LABEL: @acos_f32( 435;CHECK: vacosf{{.*}}<4 x float> 436;CHECK: ret void 437declare float @acosf(float) nounwind readnone 438define void @acos_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 439entry: 440 %cmp6 = icmp sgt i32 %n, 0 441 br i1 %cmp6, label %for.body, label %for.end 442 443for.body: ; preds = %entry, %for.body 444 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 445 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 446 %0 = load float, float* %arrayidx, align 4 447 %call = tail call float @acosf(float %0) nounwind readnone 448 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 449 store float %call, float* %arrayidx2, align 4 450 %indvars.iv.next = add i64 %indvars.iv, 1 451 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 452 %exitcond = icmp eq i32 %lftr.wideiv, %n 453 br i1 %exitcond, label %for.end, label %for.body 454 455for.end: ; preds = %for.body, %entry 456 ret void 457} 458 459;CHECK-LABEL: @atan_f32( 460;CHECK: vatanf{{.*}}<4 x float> 461;CHECK: ret void 462declare float @atanf(float) nounwind readnone 463define void @atan_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 464entry: 465 %cmp6 = icmp sgt i32 %n, 0 466 br i1 %cmp6, label %for.body, label %for.end 467 468for.body: ; preds = %entry, %for.body 469 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 470 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 471 %0 = load float, float* %arrayidx, align 4 472 %call = tail call float @atanf(float %0) nounwind readnone 473 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 474 store float %call, float* %arrayidx2, align 4 475 %indvars.iv.next = add i64 %indvars.iv, 1 476 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 477 %exitcond = icmp eq i32 %lftr.wideiv, %n 478 br i1 %exitcond, label %for.end, label %for.body 479 480for.end: ; preds = %for.body, %entry 481 ret void 482} 483 484;CHECK-LABEL: @sinh_f32( 485;CHECK: vsinhf{{.*}}<4 x float> 486;CHECK: ret void 487declare float @sinhf(float) nounwind readnone 488define void @sinh_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 489entry: 490 %cmp6 = icmp sgt i32 %n, 0 491 br i1 %cmp6, label %for.body, label %for.end 492 493for.body: ; preds = %entry, %for.body 494 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 495 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 496 %0 = load float, float* %arrayidx, align 4 497 %call = tail call float @sinhf(float %0) nounwind readnone 498 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 499 store float %call, float* %arrayidx2, align 4 500 %indvars.iv.next = add i64 %indvars.iv, 1 501 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 502 %exitcond = icmp eq i32 %lftr.wideiv, %n 503 br i1 %exitcond, label %for.end, label %for.body 504 505for.end: ; preds = %for.body, %entry 506 ret void 507} 508 509;CHECK-LABEL: @cosh_f32( 510;CHECK: vcoshf{{.*}}<4 x float> 511;CHECK: ret void 512declare float @coshf(float) nounwind readnone 513define void @cosh_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 514entry: 515 %cmp6 = icmp sgt i32 %n, 0 516 br i1 %cmp6, label %for.body, label %for.end 517 518for.body: ; preds = %entry, %for.body 519 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 520 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 521 %0 = load float, float* %arrayidx, align 4 522 %call = tail call float @coshf(float %0) nounwind readnone 523 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 524 store float %call, float* %arrayidx2, align 4 525 %indvars.iv.next = add i64 %indvars.iv, 1 526 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 527 %exitcond = icmp eq i32 %lftr.wideiv, %n 528 br i1 %exitcond, label %for.end, label %for.body 529 530for.end: ; preds = %for.body, %entry 531 ret void 532} 533 534;CHECK-LABEL: @tanh_f32( 535;CHECK: vtanhf{{.*}}<4 x float> 536;CHECK: ret void 537declare float @tanhf(float) nounwind readnone 538define void @tanh_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 539entry: 540 %cmp6 = icmp sgt i32 %n, 0 541 br i1 %cmp6, label %for.body, label %for.end 542 543for.body: ; preds = %entry, %for.body 544 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 545 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 546 %0 = load float, float* %arrayidx, align 4 547 %call = tail call float @tanhf(float %0) nounwind readnone 548 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 549 store float %call, float* %arrayidx2, align 4 550 %indvars.iv.next = add i64 %indvars.iv, 1 551 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 552 %exitcond = icmp eq i32 %lftr.wideiv, %n 553 br i1 %exitcond, label %for.end, label %for.body 554 555for.end: ; preds = %for.body, %entry 556 ret void 557} 558 559;CHECK-LABEL: @asinh_f32( 560;CHECK: vasinhf{{.*}}<4 x float> 561;CHECK: ret void 562declare float @asinhf(float) nounwind readnone 563define void @asinh_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 564entry: 565 %cmp6 = icmp sgt i32 %n, 0 566 br i1 %cmp6, label %for.body, label %for.end 567 568for.body: ; preds = %entry, %for.body 569 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 570 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 571 %0 = load float, float* %arrayidx, align 4 572 %call = tail call float @asinhf(float %0) nounwind readnone 573 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 574 store float %call, float* %arrayidx2, align 4 575 %indvars.iv.next = add i64 %indvars.iv, 1 576 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 577 %exitcond = icmp eq i32 %lftr.wideiv, %n 578 br i1 %exitcond, label %for.end, label %for.body 579 580for.end: ; preds = %for.body, %entry 581 ret void 582} 583 584;CHECK-LABEL: @acosh_f32( 585;CHECK: vacoshf{{.*}}<4 x float> 586;CHECK: ret void 587declare float @acoshf(float) nounwind readnone 588define void @acosh_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 589entry: 590 %cmp6 = icmp sgt i32 %n, 0 591 br i1 %cmp6, label %for.body, label %for.end 592 593for.body: ; preds = %entry, %for.body 594 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 595 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 596 %0 = load float, float* %arrayidx, align 4 597 %call = tail call float @acoshf(float %0) nounwind readnone 598 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 599 store float %call, float* %arrayidx2, align 4 600 %indvars.iv.next = add i64 %indvars.iv, 1 601 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 602 %exitcond = icmp eq i32 %lftr.wideiv, %n 603 br i1 %exitcond, label %for.end, label %for.body 604 605for.end: ; preds = %for.body, %entry 606 ret void 607} 608 609;CHECK-LABEL: @atanh_f32( 610;CHECK: vatanhf{{.*}}<4 x float> 611;CHECK: ret void 612declare float @atanhf(float) nounwind readnone 613define void @atanh_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { 614entry: 615 %cmp6 = icmp sgt i32 %n, 0 616 br i1 %cmp6, label %for.body, label %for.end 617 618for.body: ; preds = %entry, %for.body 619 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 620 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv 621 %0 = load float, float* %arrayidx, align 4 622 %call = tail call float @atanhf(float %0) nounwind readnone 623 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv 624 store float %call, float* %arrayidx2, align 4 625 %indvars.iv.next = add i64 %indvars.iv, 1 626 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 627 %exitcond = icmp eq i32 %lftr.wideiv, %n 628 br i1 %exitcond, label %for.end, label %for.body 629 630for.end: ; preds = %for.body, %entry 631 ret void 632} 633