1; RUN: opt < %s -passes=loop-vectorize,dce,instcombine -force-vector-interleave=1 -force-vector-width=4 -S | FileCheck %s 2 3define void @sqrt_f32(i32 %n, ptr %y, ptr %x) { 4; CHECK-LABEL: @sqrt_f32( 5; CHECK: llvm.sqrt.v4f32 6; CHECK: ret void 7; 8entry: 9 %cmp6 = icmp sgt i32 %n, 0 10 br i1 %cmp6, label %for.body, label %for.end 11 12for.body: ; preds = %entry, %for.body 13 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 14 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 15 %0 = load float, ptr %arrayidx, align 4 16 %call = tail call float @llvm.sqrt.f32(float %0) 17 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 18 store float %call, ptr %arrayidx2, align 4 19 %indvars.iv.next = add i64 %indvars.iv, 1 20 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 21 %exitcond = icmp eq i32 %lftr.wideiv, %n 22 br i1 %exitcond, label %for.end, label %for.body 23 24for.end: ; preds = %for.body, %entry 25 ret void 26} 27 28declare float @llvm.sqrt.f32(float) 29 30define void @sqrt_f64(i32 %n, ptr %y, ptr %x) { 31; CHECK-LABEL: @sqrt_f64( 32; CHECK: llvm.sqrt.v4f64 33; CHECK: ret void 34; 35entry: 36 %cmp6 = icmp sgt i32 %n, 0 37 br i1 %cmp6, label %for.body, label %for.end 38 39for.body: ; preds = %entry, %for.body 40 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 41 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 42 %0 = load double, ptr %arrayidx, align 8 43 %call = tail call double @llvm.sqrt.f64(double %0) 44 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 45 store double %call, ptr %arrayidx2, align 8 46 %indvars.iv.next = add i64 %indvars.iv, 1 47 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 48 %exitcond = icmp eq i32 %lftr.wideiv, %n 49 br i1 %exitcond, label %for.end, label %for.body 50 51for.end: ; preds = %for.body, %entry 52 ret void 53} 54 55declare double @llvm.sqrt.f64(double) 56 57define void @sin_f32(i32 %n, ptr %y, ptr %x) { 58; CHECK-LABEL: @sin_f32( 59; CHECK: llvm.sin.v4f32 60; CHECK: ret void 61; 62entry: 63 %cmp6 = icmp sgt i32 %n, 0 64 br i1 %cmp6, label %for.body, label %for.end 65 66for.body: ; preds = %entry, %for.body 67 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 68 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 69 %0 = load float, ptr %arrayidx, align 4 70 %call = tail call float @llvm.sin.f32(float %0) 71 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 72 store float %call, ptr %arrayidx2, align 4 73 %indvars.iv.next = add i64 %indvars.iv, 1 74 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 75 %exitcond = icmp eq i32 %lftr.wideiv, %n 76 br i1 %exitcond, label %for.end, label %for.body 77 78for.end: ; preds = %for.body, %entry 79 ret void 80} 81 82declare float @llvm.sin.f32(float) 83 84define void @sin_f64(i32 %n, ptr %y, ptr %x) { 85; CHECK-LABEL: @sin_f64( 86; CHECK: llvm.sin.v4f64 87; CHECK: ret void 88; 89entry: 90 %cmp6 = icmp sgt i32 %n, 0 91 br i1 %cmp6, label %for.body, label %for.end 92 93for.body: ; preds = %entry, %for.body 94 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 95 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 96 %0 = load double, ptr %arrayidx, align 8 97 %call = tail call double @llvm.sin.f64(double %0) 98 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 99 store double %call, ptr %arrayidx2, align 8 100 %indvars.iv.next = add i64 %indvars.iv, 1 101 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 102 %exitcond = icmp eq i32 %lftr.wideiv, %n 103 br i1 %exitcond, label %for.end, label %for.body 104 105for.end: ; preds = %for.body, %entry 106 ret void 107} 108 109declare double @llvm.sin.f64(double) 110 111define void @cos_f32(i32 %n, ptr %y, ptr %x) { 112; CHECK-LABEL: @cos_f32( 113; CHECK: llvm.cos.v4f32 114; CHECK: ret void 115; 116entry: 117 %cmp6 = icmp sgt i32 %n, 0 118 br i1 %cmp6, label %for.body, label %for.end 119 120for.body: ; preds = %entry, %for.body 121 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 122 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 123 %0 = load float, ptr %arrayidx, align 4 124 %call = tail call float @llvm.cos.f32(float %0) 125 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 126 store float %call, ptr %arrayidx2, align 4 127 %indvars.iv.next = add i64 %indvars.iv, 1 128 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 129 %exitcond = icmp eq i32 %lftr.wideiv, %n 130 br i1 %exitcond, label %for.end, label %for.body 131 132for.end: ; preds = %for.body, %entry 133 ret void 134} 135 136declare float @llvm.cos.f32(float) 137 138define void @cos_f64(i32 %n, ptr %y, ptr %x) { 139; CHECK-LABEL: @cos_f64( 140; CHECK: llvm.cos.v4f64 141; CHECK: ret void 142; 143entry: 144 %cmp6 = icmp sgt i32 %n, 0 145 br i1 %cmp6, label %for.body, label %for.end 146 147for.body: ; preds = %entry, %for.body 148 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 149 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 150 %0 = load double, ptr %arrayidx, align 8 151 %call = tail call double @llvm.cos.f64(double %0) 152 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 153 store double %call, ptr %arrayidx2, align 8 154 %indvars.iv.next = add i64 %indvars.iv, 1 155 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 156 %exitcond = icmp eq i32 %lftr.wideiv, %n 157 br i1 %exitcond, label %for.end, label %for.body 158 159for.end: ; preds = %for.body, %entry 160 ret void 161} 162 163declare double @llvm.cos.f64(double) 164 165define void @tan_f32(i32 %n, ptr %y, ptr %x) { 166; CHECK-LABEL: @tan_f32( 167; CHECK: llvm.tan.v4f32 168; CHECK: ret void 169; 170entry: 171 %cmp6 = icmp sgt i32 %n, 0 172 br i1 %cmp6, label %for.body, label %for.end 173 174for.body: ; preds = %entry, %for.body 175 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 176 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 177 %0 = load float, ptr %arrayidx, align 4 178 %call = tail call float @llvm.tan.f32(float %0) 179 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 180 store float %call, ptr %arrayidx2, align 4 181 %indvars.iv.next = add i64 %indvars.iv, 1 182 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 183 %exitcond = icmp eq i32 %lftr.wideiv, %n 184 br i1 %exitcond, label %for.end, label %for.body 185 186for.end: ; preds = %for.body, %entry 187 ret void 188} 189 190declare float @llvm.tan.f32(float) 191 192define void @tan_f64(i32 %n, ptr %y, ptr %x) { 193; CHECK-LABEL: @tan_f64( 194; CHECK: llvm.tan.v4f64 195; CHECK: ret void 196; 197entry: 198 %cmp6 = icmp sgt i32 %n, 0 199 br i1 %cmp6, label %for.body, label %for.end 200 201for.body: ; preds = %entry, %for.body 202 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 203 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 204 %0 = load double, ptr %arrayidx, align 8 205 %call = tail call double @llvm.tan.f64(double %0) 206 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 207 store double %call, ptr %arrayidx2, align 8 208 %indvars.iv.next = add i64 %indvars.iv, 1 209 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 210 %exitcond = icmp eq i32 %lftr.wideiv, %n 211 br i1 %exitcond, label %for.end, label %for.body 212 213for.end: ; preds = %for.body, %entry 214 ret void 215} 216 217declare double @llvm.tan.f64(double) 218 219define void @exp_f32(i32 %n, ptr %y, ptr %x) { 220; CHECK-LABEL: @exp_f32( 221; CHECK: llvm.exp.v4f32 222; CHECK: ret void 223; 224entry: 225 %cmp6 = icmp sgt i32 %n, 0 226 br i1 %cmp6, label %for.body, label %for.end 227 228for.body: ; preds = %entry, %for.body 229 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 230 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 231 %0 = load float, ptr %arrayidx, align 4 232 %call = tail call float @llvm.exp.f32(float %0) 233 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 234 store float %call, ptr %arrayidx2, align 4 235 %indvars.iv.next = add i64 %indvars.iv, 1 236 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 237 %exitcond = icmp eq i32 %lftr.wideiv, %n 238 br i1 %exitcond, label %for.end, label %for.body 239 240for.end: ; preds = %for.body, %entry 241 ret void 242} 243 244declare float @llvm.exp.f32(float) 245 246define void @exp_f64(i32 %n, ptr %y, ptr %x) { 247; CHECK-LABEL: @exp_f64( 248; CHECK: llvm.exp.v4f64 249; CHECK: ret void 250; 251entry: 252 %cmp6 = icmp sgt i32 %n, 0 253 br i1 %cmp6, label %for.body, label %for.end 254 255for.body: ; preds = %entry, %for.body 256 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 257 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 258 %0 = load double, ptr %arrayidx, align 8 259 %call = tail call double @llvm.exp.f64(double %0) 260 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 261 store double %call, ptr %arrayidx2, align 8 262 %indvars.iv.next = add i64 %indvars.iv, 1 263 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 264 %exitcond = icmp eq i32 %lftr.wideiv, %n 265 br i1 %exitcond, label %for.end, label %for.body 266 267for.end: ; preds = %for.body, %entry 268 ret void 269} 270 271declare double @llvm.exp.f64(double) 272 273define void @exp2_f32(i32 %n, ptr %y, ptr %x) { 274; CHECK-LABEL: @exp2_f32( 275; CHECK: llvm.exp2.v4f32 276; CHECK: ret void 277; 278entry: 279 %cmp6 = icmp sgt i32 %n, 0 280 br i1 %cmp6, label %for.body, label %for.end 281 282for.body: ; preds = %entry, %for.body 283 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 284 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 285 %0 = load float, ptr %arrayidx, align 4 286 %call = tail call float @llvm.exp2.f32(float %0) 287 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 288 store float %call, ptr %arrayidx2, align 4 289 %indvars.iv.next = add i64 %indvars.iv, 1 290 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 291 %exitcond = icmp eq i32 %lftr.wideiv, %n 292 br i1 %exitcond, label %for.end, label %for.body 293 294for.end: ; preds = %for.body, %entry 295 ret void 296} 297 298declare float @llvm.exp2.f32(float) 299 300define void @exp2_f64(i32 %n, ptr %y, ptr %x) { 301; CHECK-LABEL: @exp2_f64( 302; CHECK: llvm.exp2.v4f64 303; CHECK: ret void 304; 305entry: 306 %cmp6 = icmp sgt i32 %n, 0 307 br i1 %cmp6, label %for.body, label %for.end 308 309for.body: ; preds = %entry, %for.body 310 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 311 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 312 %0 = load double, ptr %arrayidx, align 8 313 %call = tail call double @llvm.exp2.f64(double %0) 314 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 315 store double %call, ptr %arrayidx2, align 8 316 %indvars.iv.next = add i64 %indvars.iv, 1 317 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 318 %exitcond = icmp eq i32 %lftr.wideiv, %n 319 br i1 %exitcond, label %for.end, label %for.body 320 321for.end: ; preds = %for.body, %entry 322 ret void 323} 324 325declare double @llvm.exp2.f64(double) 326 327define void @log_f32(i32 %n, ptr %y, ptr %x) { 328; CHECK-LABEL: @log_f32( 329; CHECK: llvm.log.v4f32 330; CHECK: ret void 331; 332entry: 333 %cmp6 = icmp sgt i32 %n, 0 334 br i1 %cmp6, label %for.body, label %for.end 335 336for.body: ; preds = %entry, %for.body 337 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 338 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 339 %0 = load float, ptr %arrayidx, align 4 340 %call = tail call float @llvm.log.f32(float %0) 341 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 342 store float %call, ptr %arrayidx2, align 4 343 %indvars.iv.next = add i64 %indvars.iv, 1 344 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 345 %exitcond = icmp eq i32 %lftr.wideiv, %n 346 br i1 %exitcond, label %for.end, label %for.body 347 348for.end: ; preds = %for.body, %entry 349 ret void 350} 351 352declare float @llvm.log.f32(float) 353 354define void @log_f64(i32 %n, ptr %y, ptr %x) { 355; CHECK-LABEL: @log_f64( 356; CHECK: llvm.log.v4f64 357; CHECK: ret void 358; 359entry: 360 %cmp6 = icmp sgt i32 %n, 0 361 br i1 %cmp6, label %for.body, label %for.end 362 363for.body: ; preds = %entry, %for.body 364 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 365 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 366 %0 = load double, ptr %arrayidx, align 8 367 %call = tail call double @llvm.log.f64(double %0) 368 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 369 store double %call, ptr %arrayidx2, align 8 370 %indvars.iv.next = add i64 %indvars.iv, 1 371 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 372 %exitcond = icmp eq i32 %lftr.wideiv, %n 373 br i1 %exitcond, label %for.end, label %for.body 374 375for.end: ; preds = %for.body, %entry 376 ret void 377} 378 379declare double @llvm.log.f64(double) 380 381define void @log10_f32(i32 %n, ptr %y, ptr %x) { 382; CHECK-LABEL: @log10_f32( 383; CHECK: llvm.log10.v4f32 384; CHECK: ret void 385; 386entry: 387 %cmp6 = icmp sgt i32 %n, 0 388 br i1 %cmp6, label %for.body, label %for.end 389 390for.body: ; preds = %entry, %for.body 391 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 392 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 393 %0 = load float, ptr %arrayidx, align 4 394 %call = tail call float @llvm.log10.f32(float %0) 395 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 396 store float %call, ptr %arrayidx2, align 4 397 %indvars.iv.next = add i64 %indvars.iv, 1 398 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 399 %exitcond = icmp eq i32 %lftr.wideiv, %n 400 br i1 %exitcond, label %for.end, label %for.body 401 402for.end: ; preds = %for.body, %entry 403 ret void 404} 405 406declare float @llvm.log10.f32(float) 407 408define void @log10_f64(i32 %n, ptr %y, ptr %x) { 409; CHECK-LABEL: @log10_f64( 410; CHECK: llvm.log10.v4f64 411; CHECK: ret void 412; 413entry: 414 %cmp6 = icmp sgt i32 %n, 0 415 br i1 %cmp6, label %for.body, label %for.end 416 417for.body: ; preds = %entry, %for.body 418 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 419 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 420 %0 = load double, ptr %arrayidx, align 8 421 %call = tail call double @llvm.log10.f64(double %0) 422 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 423 store double %call, ptr %arrayidx2, align 8 424 %indvars.iv.next = add i64 %indvars.iv, 1 425 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 426 %exitcond = icmp eq i32 %lftr.wideiv, %n 427 br i1 %exitcond, label %for.end, label %for.body 428 429for.end: ; preds = %for.body, %entry 430 ret void 431} 432 433declare double @llvm.log10.f64(double) 434 435define void @log2_f32(i32 %n, ptr %y, ptr %x) { 436; CHECK-LABEL: @log2_f32( 437; CHECK: llvm.log2.v4f32 438; CHECK: ret void 439; 440entry: 441 %cmp6 = icmp sgt i32 %n, 0 442 br i1 %cmp6, label %for.body, label %for.end 443 444for.body: ; preds = %entry, %for.body 445 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 446 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 447 %0 = load float, ptr %arrayidx, align 4 448 %call = tail call float @llvm.log2.f32(float %0) 449 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 450 store float %call, ptr %arrayidx2, align 4 451 %indvars.iv.next = add i64 %indvars.iv, 1 452 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 453 %exitcond = icmp eq i32 %lftr.wideiv, %n 454 br i1 %exitcond, label %for.end, label %for.body 455 456for.end: ; preds = %for.body, %entry 457 ret void 458} 459 460declare float @llvm.log2.f32(float) 461 462define void @log2_f64(i32 %n, ptr %y, ptr %x) { 463; CHECK-LABEL: @log2_f64( 464; CHECK: llvm.log2.v4f64 465; CHECK: ret void 466; 467entry: 468 %cmp6 = icmp sgt i32 %n, 0 469 br i1 %cmp6, label %for.body, label %for.end 470 471for.body: ; preds = %entry, %for.body 472 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 473 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 474 %0 = load double, ptr %arrayidx, align 8 475 %call = tail call double @llvm.log2.f64(double %0) 476 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 477 store double %call, ptr %arrayidx2, align 8 478 %indvars.iv.next = add i64 %indvars.iv, 1 479 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 480 %exitcond = icmp eq i32 %lftr.wideiv, %n 481 br i1 %exitcond, label %for.end, label %for.body 482 483for.end: ; preds = %for.body, %entry 484 ret void 485} 486 487declare double @llvm.log2.f64(double) 488 489define void @fabs_f32(i32 %n, ptr %y, ptr %x) { 490; CHECK-LABEL: @fabs_f32( 491; CHECK: llvm.fabs.v4f32 492; CHECK: ret void 493; 494entry: 495 %cmp6 = icmp sgt i32 %n, 0 496 br i1 %cmp6, label %for.body, label %for.end 497 498for.body: ; preds = %entry, %for.body 499 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 500 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 501 %0 = load float, ptr %arrayidx, align 4 502 %call = tail call float @llvm.fabs.f32(float %0) 503 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 504 store float %call, ptr %arrayidx2, align 4 505 %indvars.iv.next = add i64 %indvars.iv, 1 506 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 507 %exitcond = icmp eq i32 %lftr.wideiv, %n 508 br i1 %exitcond, label %for.end, label %for.body 509 510for.end: ; preds = %for.body, %entry 511 ret void 512} 513 514declare float @llvm.fabs.f32(float) 515 516define void @fabs_f64(i32 %n, ptr %y, ptr %x) { 517; CHECK-LABEL: @fabs_f64( 518; CHECK: llvm.fabs.v4f64 519; CHECK: ret void 520; 521entry: 522 %cmp6 = icmp sgt i32 %n, 0 523 br i1 %cmp6, label %for.body, label %for.end 524 525for.body: ; preds = %entry, %for.body 526 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 527 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 528 %0 = load double, ptr %arrayidx, align 8 529 %call = tail call double @llvm.fabs(double %0) 530 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 531 store double %call, ptr %arrayidx2, align 8 532 %indvars.iv.next = add i64 %indvars.iv, 1 533 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 534 %exitcond = icmp eq i32 %lftr.wideiv, %n 535 br i1 %exitcond, label %for.end, label %for.body 536 537for.end: ; preds = %for.body, %entry 538 ret void 539} 540 541declare double @llvm.fabs(double) 542 543define void @copysign_f32(i32 %n, ptr %y, ptr %x, ptr %z) { 544; CHECK-LABEL: @copysign_f32( 545; CHECK: llvm.copysign.v4f32 546; CHECK: ret void 547; 548entry: 549 %cmp6 = icmp sgt i32 %n, 0 550 br i1 %cmp6, label %for.body, label %for.end 551 552for.body: ; preds = %entry, %for.body 553 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 554 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 555 %0 = load float, ptr %arrayidx, align 4 556 %arrayidx1 = getelementptr inbounds float, ptr %z, i64 %indvars.iv 557 %1 = load float, ptr %arrayidx1, align 4 558 %call = tail call float @llvm.copysign.f32(float %0, float %1) 559 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 560 store float %call, ptr %arrayidx2, align 4 561 %indvars.iv.next = add i64 %indvars.iv, 1 562 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 563 %exitcond = icmp eq i32 %lftr.wideiv, %n 564 br i1 %exitcond, label %for.end, label %for.body 565 566for.end: ; preds = %for.body, %entry 567 ret void 568} 569 570declare float @llvm.copysign.f32(float, float) 571 572define void @copysign_f64(i32 %n, ptr %y, ptr %x, ptr %z) { 573; CHECK-LABEL: @copysign_f64( 574; CHECK: llvm.copysign.v4f64 575; CHECK: ret void 576; 577entry: 578 %cmp6 = icmp sgt i32 %n, 0 579 br i1 %cmp6, label %for.body, label %for.end 580 581for.body: ; preds = %entry, %for.body 582 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 583 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 584 %0 = load double, ptr %arrayidx, align 8 585 %arrayidx1 = getelementptr inbounds double, ptr %z, i64 %indvars.iv 586 %1 = load double, ptr %arrayidx1, align 8 587 %call = tail call double @llvm.copysign(double %0, double %1) 588 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 589 store double %call, ptr %arrayidx2, align 8 590 %indvars.iv.next = add i64 %indvars.iv, 1 591 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 592 %exitcond = icmp eq i32 %lftr.wideiv, %n 593 br i1 %exitcond, label %for.end, label %for.body 594 595for.end: ; preds = %for.body, %entry 596 ret void 597} 598 599declare double @llvm.copysign(double, double) 600 601define void @floor_f32(i32 %n, ptr %y, ptr %x) { 602; CHECK-LABEL: @floor_f32( 603; CHECK: llvm.floor.v4f32 604; CHECK: ret void 605; 606entry: 607 %cmp6 = icmp sgt i32 %n, 0 608 br i1 %cmp6, label %for.body, label %for.end 609 610for.body: ; preds = %entry, %for.body 611 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 612 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 613 %0 = load float, ptr %arrayidx, align 4 614 %call = tail call float @llvm.floor.f32(float %0) 615 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 616 store float %call, ptr %arrayidx2, align 4 617 %indvars.iv.next = add i64 %indvars.iv, 1 618 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 619 %exitcond = icmp eq i32 %lftr.wideiv, %n 620 br i1 %exitcond, label %for.end, label %for.body 621 622for.end: ; preds = %for.body, %entry 623 ret void 624} 625 626declare float @llvm.floor.f32(float) 627 628define void @floor_f64(i32 %n, ptr %y, ptr %x) { 629; CHECK-LABEL: @floor_f64( 630; CHECK: llvm.floor.v4f64 631; CHECK: ret void 632; 633entry: 634 %cmp6 = icmp sgt i32 %n, 0 635 br i1 %cmp6, label %for.body, label %for.end 636 637for.body: ; preds = %entry, %for.body 638 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 639 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 640 %0 = load double, ptr %arrayidx, align 8 641 %call = tail call double @llvm.floor.f64(double %0) 642 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 643 store double %call, ptr %arrayidx2, align 8 644 %indvars.iv.next = add i64 %indvars.iv, 1 645 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 646 %exitcond = icmp eq i32 %lftr.wideiv, %n 647 br i1 %exitcond, label %for.end, label %for.body 648 649for.end: ; preds = %for.body, %entry 650 ret void 651} 652 653declare double @llvm.floor.f64(double) 654 655define void @ceil_f32(i32 %n, ptr %y, ptr %x) { 656; CHECK-LABEL: @ceil_f32( 657; CHECK: llvm.ceil.v4f32 658; CHECK: ret void 659; 660entry: 661 %cmp6 = icmp sgt i32 %n, 0 662 br i1 %cmp6, label %for.body, label %for.end 663 664for.body: ; preds = %entry, %for.body 665 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 666 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 667 %0 = load float, ptr %arrayidx, align 4 668 %call = tail call float @llvm.ceil.f32(float %0) 669 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 670 store float %call, ptr %arrayidx2, align 4 671 %indvars.iv.next = add i64 %indvars.iv, 1 672 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 673 %exitcond = icmp eq i32 %lftr.wideiv, %n 674 br i1 %exitcond, label %for.end, label %for.body 675 676for.end: ; preds = %for.body, %entry 677 ret void 678} 679 680declare float @llvm.ceil.f32(float) 681 682define void @ceil_f64(i32 %n, ptr %y, ptr %x) { 683; CHECK-LABEL: @ceil_f64( 684; CHECK: llvm.ceil.v4f64 685; CHECK: ret void 686; 687entry: 688 %cmp6 = icmp sgt i32 %n, 0 689 br i1 %cmp6, label %for.body, label %for.end 690 691for.body: ; preds = %entry, %for.body 692 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 693 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 694 %0 = load double, ptr %arrayidx, align 8 695 %call = tail call double @llvm.ceil.f64(double %0) 696 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 697 store double %call, ptr %arrayidx2, align 8 698 %indvars.iv.next = add i64 %indvars.iv, 1 699 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 700 %exitcond = icmp eq i32 %lftr.wideiv, %n 701 br i1 %exitcond, label %for.end, label %for.body 702 703for.end: ; preds = %for.body, %entry 704 ret void 705} 706 707declare double @llvm.ceil.f64(double) 708 709define void @trunc_f32(i32 %n, ptr %y, ptr %x) { 710; CHECK-LABEL: @trunc_f32( 711; CHECK: llvm.trunc.v4f32 712; CHECK: ret void 713; 714entry: 715 %cmp6 = icmp sgt i32 %n, 0 716 br i1 %cmp6, label %for.body, label %for.end 717 718for.body: ; preds = %entry, %for.body 719 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 720 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 721 %0 = load float, ptr %arrayidx, align 4 722 %call = tail call float @llvm.trunc.f32(float %0) 723 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 724 store float %call, ptr %arrayidx2, align 4 725 %indvars.iv.next = add i64 %indvars.iv, 1 726 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 727 %exitcond = icmp eq i32 %lftr.wideiv, %n 728 br i1 %exitcond, label %for.end, label %for.body 729 730for.end: ; preds = %for.body, %entry 731 ret void 732} 733 734declare float @llvm.trunc.f32(float) 735 736define void @trunc_f64(i32 %n, ptr %y, ptr %x) { 737; CHECK-LABEL: @trunc_f64( 738; CHECK: llvm.trunc.v4f64 739; CHECK: ret void 740; 741entry: 742 %cmp6 = icmp sgt i32 %n, 0 743 br i1 %cmp6, label %for.body, label %for.end 744 745for.body: ; preds = %entry, %for.body 746 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 747 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 748 %0 = load double, ptr %arrayidx, align 8 749 %call = tail call double @llvm.trunc.f64(double %0) 750 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 751 store double %call, ptr %arrayidx2, align 8 752 %indvars.iv.next = add i64 %indvars.iv, 1 753 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 754 %exitcond = icmp eq i32 %lftr.wideiv, %n 755 br i1 %exitcond, label %for.end, label %for.body 756 757for.end: ; preds = %for.body, %entry 758 ret void 759} 760 761declare double @llvm.trunc.f64(double) 762 763define void @rint_f32(i32 %n, ptr %y, ptr %x) { 764; CHECK-LABEL: @rint_f32( 765; CHECK: llvm.rint.v4f32 766; CHECK: ret void 767; 768entry: 769 %cmp6 = icmp sgt i32 %n, 0 770 br i1 %cmp6, label %for.body, label %for.end 771 772for.body: ; preds = %entry, %for.body 773 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 774 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 775 %0 = load float, ptr %arrayidx, align 4 776 %call = tail call float @llvm.rint.f32(float %0) 777 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 778 store float %call, ptr %arrayidx2, align 4 779 %indvars.iv.next = add i64 %indvars.iv, 1 780 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 781 %exitcond = icmp eq i32 %lftr.wideiv, %n 782 br i1 %exitcond, label %for.end, label %for.body 783 784for.end: ; preds = %for.body, %entry 785 ret void 786} 787 788declare float @llvm.rint.f32(float) 789 790define void @rint_f64(i32 %n, ptr %y, ptr %x) { 791; CHECK-LABEL: @rint_f64( 792; CHECK: llvm.rint.v4f64 793; CHECK: ret void 794; 795entry: 796 %cmp6 = icmp sgt i32 %n, 0 797 br i1 %cmp6, label %for.body, label %for.end 798 799for.body: ; preds = %entry, %for.body 800 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 801 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 802 %0 = load double, ptr %arrayidx, align 8 803 %call = tail call double @llvm.rint.f64(double %0) 804 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 805 store double %call, ptr %arrayidx2, align 8 806 %indvars.iv.next = add i64 %indvars.iv, 1 807 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 808 %exitcond = icmp eq i32 %lftr.wideiv, %n 809 br i1 %exitcond, label %for.end, label %for.body 810 811for.end: ; preds = %for.body, %entry 812 ret void 813} 814 815declare double @llvm.rint.f64(double) 816 817define void @nearbyint_f32(i32 %n, ptr %y, ptr %x) { 818; CHECK-LABEL: @nearbyint_f32( 819; CHECK: llvm.nearbyint.v4f32 820; CHECK: ret void 821; 822entry: 823 %cmp6 = icmp sgt i32 %n, 0 824 br i1 %cmp6, label %for.body, label %for.end 825 826for.body: ; preds = %entry, %for.body 827 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 828 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 829 %0 = load float, ptr %arrayidx, align 4 830 %call = tail call float @llvm.nearbyint.f32(float %0) 831 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 832 store float %call, ptr %arrayidx2, align 4 833 %indvars.iv.next = add i64 %indvars.iv, 1 834 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 835 %exitcond = icmp eq i32 %lftr.wideiv, %n 836 br i1 %exitcond, label %for.end, label %for.body 837 838for.end: ; preds = %for.body, %entry 839 ret void 840} 841 842declare float @llvm.nearbyint.f32(float) 843 844define void @nearbyint_f64(i32 %n, ptr %y, ptr %x) { 845; CHECK-LABEL: @nearbyint_f64( 846; CHECK: llvm.nearbyint.v4f64 847; CHECK: ret void 848; 849entry: 850 %cmp6 = icmp sgt i32 %n, 0 851 br i1 %cmp6, label %for.body, label %for.end 852 853for.body: ; preds = %entry, %for.body 854 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 855 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 856 %0 = load double, ptr %arrayidx, align 8 857 %call = tail call double @llvm.nearbyint.f64(double %0) 858 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 859 store double %call, ptr %arrayidx2, align 8 860 %indvars.iv.next = add i64 %indvars.iv, 1 861 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 862 %exitcond = icmp eq i32 %lftr.wideiv, %n 863 br i1 %exitcond, label %for.end, label %for.body 864 865for.end: ; preds = %for.body, %entry 866 ret void 867} 868 869declare double @llvm.nearbyint.f64(double) 870 871define void @round_f32(i32 %n, ptr %y, ptr %x) { 872; CHECK-LABEL: @round_f32( 873; CHECK: llvm.round.v4f32 874; CHECK: ret void 875; 876entry: 877 %cmp6 = icmp sgt i32 %n, 0 878 br i1 %cmp6, label %for.body, label %for.end 879 880for.body: ; preds = %entry, %for.body 881 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 882 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 883 %0 = load float, ptr %arrayidx, align 4 884 %call = tail call float @llvm.round.f32(float %0) 885 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 886 store float %call, ptr %arrayidx2, align 4 887 %indvars.iv.next = add i64 %indvars.iv, 1 888 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 889 %exitcond = icmp eq i32 %lftr.wideiv, %n 890 br i1 %exitcond, label %for.end, label %for.body 891 892for.end: ; preds = %for.body, %entry 893 ret void 894} 895 896declare float @llvm.round.f32(float) 897 898define void @round_f64(i32 %n, ptr %y, ptr %x) { 899; CHECK-LABEL: @round_f64( 900; CHECK: llvm.round.v4f64 901; CHECK: ret void 902; 903entry: 904 %cmp6 = icmp sgt i32 %n, 0 905 br i1 %cmp6, label %for.body, label %for.end 906 907for.body: ; preds = %entry, %for.body 908 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 909 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 910 %0 = load double, ptr %arrayidx, align 8 911 %call = tail call double @llvm.round.f64(double %0) 912 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 913 store double %call, ptr %arrayidx2, align 8 914 %indvars.iv.next = add i64 %indvars.iv, 1 915 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 916 %exitcond = icmp eq i32 %lftr.wideiv, %n 917 br i1 %exitcond, label %for.end, label %for.body 918 919for.end: ; preds = %for.body, %entry 920 ret void 921} 922 923declare double @llvm.round.f64(double) 924 925define void @roundeven_f32(i32 %n, ptr %y, ptr %x) { 926; CHECK-LABEL: @roundeven_f32( 927; CHECK: llvm.roundeven.v4f32 928; CHECK: ret void 929; 930entry: 931 %cmp6 = icmp sgt i32 %n, 0 932 br i1 %cmp6, label %for.body, label %for.end 933 934for.body: ; preds = %entry, %for.body 935 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 936 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 937 %0 = load float, ptr %arrayidx, align 4 938 %call = tail call float @llvm.roundeven.f32(float %0) 939 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 940 store float %call, ptr %arrayidx2, align 4 941 %indvars.iv.next = add i64 %indvars.iv, 1 942 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 943 %exitcond = icmp eq i32 %lftr.wideiv, %n 944 br i1 %exitcond, label %for.end, label %for.body 945 946for.end: ; preds = %for.body, %entry 947 ret void 948} 949 950declare float @llvm.roundeven.f32(float) 951 952define void @roundeven_f64(i32 %n, ptr %y, ptr %x) { 953; CHECK-LABEL: @roundeven_f64( 954; CHECK: llvm.roundeven.v4f64 955; CHECK: ret void 956; 957entry: 958 %cmp6 = icmp sgt i32 %n, 0 959 br i1 %cmp6, label %for.body, label %for.end 960 961for.body: ; preds = %entry, %for.body 962 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 963 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 964 %0 = load double, ptr %arrayidx, align 8 965 %call = tail call double @llvm.roundeven.f64(double %0) 966 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 967 store double %call, ptr %arrayidx2, align 8 968 %indvars.iv.next = add i64 %indvars.iv, 1 969 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 970 %exitcond = icmp eq i32 %lftr.wideiv, %n 971 br i1 %exitcond, label %for.end, label %for.body 972 973for.end: ; preds = %for.body, %entry 974 ret void 975} 976 977declare double @llvm.roundeven.f64(double) 978 979define void @fma_f32(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) { 980; CHECK-LABEL: @fma_f32( 981; CHECK: llvm.fma.v4f32 982; CHECK: ret void 983; 984entry: 985 %cmp12 = icmp sgt i32 %n, 0 986 br i1 %cmp12, label %for.body, label %for.end 987 988for.body: ; preds = %entry, %for.body 989 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 990 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 991 %0 = load float, ptr %arrayidx, align 4 992 %arrayidx2 = getelementptr inbounds float, ptr %w, i64 %indvars.iv 993 %1 = load float, ptr %arrayidx2, align 4 994 %arrayidx4 = getelementptr inbounds float, ptr %z, i64 %indvars.iv 995 %2 = load float, ptr %arrayidx4, align 4 996 %3 = tail call float @llvm.fma.f32(float %0, float %2, float %1) 997 %arrayidx6 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 998 store float %3, ptr %arrayidx6, align 4 999 %indvars.iv.next = add i64 %indvars.iv, 1 1000 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1001 %exitcond = icmp eq i32 %lftr.wideiv, %n 1002 br i1 %exitcond, label %for.end, label %for.body 1003 1004for.end: ; preds = %for.body, %entry 1005 ret void 1006} 1007 1008declare float @llvm.fma.f32(float, float, float) 1009 1010define void @fma_f64(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) { 1011; CHECK-LABEL: @fma_f64( 1012; CHECK: llvm.fma.v4f64 1013; CHECK: ret void 1014; 1015entry: 1016 %cmp12 = icmp sgt i32 %n, 0 1017 br i1 %cmp12, label %for.body, label %for.end 1018 1019for.body: ; preds = %entry, %for.body 1020 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1021 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 1022 %0 = load double, ptr %arrayidx, align 8 1023 %arrayidx2 = getelementptr inbounds double, ptr %w, i64 %indvars.iv 1024 %1 = load double, ptr %arrayidx2, align 8 1025 %arrayidx4 = getelementptr inbounds double, ptr %z, i64 %indvars.iv 1026 %2 = load double, ptr %arrayidx4, align 8 1027 %3 = tail call double @llvm.fma.f64(double %0, double %2, double %1) 1028 %arrayidx6 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 1029 store double %3, ptr %arrayidx6, align 8 1030 %indvars.iv.next = add i64 %indvars.iv, 1 1031 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1032 %exitcond = icmp eq i32 %lftr.wideiv, %n 1033 br i1 %exitcond, label %for.end, label %for.body 1034 1035for.end: ; preds = %for.body, %entry 1036 ret void 1037} 1038 1039declare double @llvm.fma.f64(double, double, double) 1040 1041define void @fmuladd_f32(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) { 1042; CHECK-LABEL: @fmuladd_f32( 1043; CHECK: llvm.fmuladd.v4f32 1044; CHECK: ret void 1045; 1046entry: 1047 %cmp12 = icmp sgt i32 %n, 0 1048 br i1 %cmp12, label %for.body, label %for.end 1049 1050for.body: ; preds = %entry, %for.body 1051 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1052 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 1053 %0 = load float, ptr %arrayidx, align 4 1054 %arrayidx2 = getelementptr inbounds float, ptr %w, i64 %indvars.iv 1055 %1 = load float, ptr %arrayidx2, align 4 1056 %arrayidx4 = getelementptr inbounds float, ptr %z, i64 %indvars.iv 1057 %2 = load float, ptr %arrayidx4, align 4 1058 %3 = tail call float @llvm.fmuladd.f32(float %0, float %2, float %1) 1059 %arrayidx6 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 1060 store float %3, ptr %arrayidx6, align 4 1061 %indvars.iv.next = add i64 %indvars.iv, 1 1062 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1063 %exitcond = icmp eq i32 %lftr.wideiv, %n 1064 br i1 %exitcond, label %for.end, label %for.body 1065 1066for.end: ; preds = %for.body, %entry 1067 ret void 1068} 1069 1070declare float @llvm.fmuladd.f32(float, float, float) 1071 1072define void @fmuladd_f64(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) { 1073; CHECK-LABEL: @fmuladd_f64( 1074; CHECK: llvm.fmuladd.v4f64 1075; CHECK: ret void 1076; 1077entry: 1078 %cmp12 = icmp sgt i32 %n, 0 1079 br i1 %cmp12, label %for.body, label %for.end 1080 1081for.body: ; preds = %entry, %for.body 1082 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1083 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 1084 %0 = load double, ptr %arrayidx, align 8 1085 %arrayidx2 = getelementptr inbounds double, ptr %w, i64 %indvars.iv 1086 %1 = load double, ptr %arrayidx2, align 8 1087 %arrayidx4 = getelementptr inbounds double, ptr %z, i64 %indvars.iv 1088 %2 = load double, ptr %arrayidx4, align 8 1089 %3 = tail call double @llvm.fmuladd.f64(double %0, double %2, double %1) 1090 %arrayidx6 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 1091 store double %3, ptr %arrayidx6, align 8 1092 %indvars.iv.next = add i64 %indvars.iv, 1 1093 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1094 %exitcond = icmp eq i32 %lftr.wideiv, %n 1095 br i1 %exitcond, label %for.end, label %for.body 1096 1097for.end: ; preds = %for.body, %entry 1098 ret void 1099} 1100 1101declare double @llvm.fmuladd.f64(double, double, double) 1102 1103define void @pow_f32(i32 %n, ptr %y, ptr %x, ptr %z) { 1104; CHECK-LABEL: @pow_f32( 1105; CHECK: llvm.pow.v4f32 1106; CHECK: ret void 1107; 1108entry: 1109 %cmp9 = icmp sgt i32 %n, 0 1110 br i1 %cmp9, label %for.body, label %for.end 1111 1112for.body: ; preds = %entry, %for.body 1113 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1114 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 1115 %0 = load float, ptr %arrayidx, align 4 1116 %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv 1117 %1 = load float, ptr %arrayidx2, align 4 1118 %call = tail call float @llvm.pow.f32(float %0, float %1) 1119 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 1120 store float %call, ptr %arrayidx4, align 4 1121 %indvars.iv.next = add i64 %indvars.iv, 1 1122 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1123 %exitcond = icmp eq i32 %lftr.wideiv, %n 1124 br i1 %exitcond, label %for.end, label %for.body 1125 1126for.end: ; preds = %for.body, %entry 1127 ret void 1128} 1129 1130declare float @llvm.pow.f32(float, float) 1131 1132define void @pow_f64(i32 %n, ptr %y, ptr %x, ptr %z) { 1133; CHECK-LABEL: @pow_f64( 1134; CHECK: llvm.pow.v4f64 1135; CHECK: ret void 1136; 1137entry: 1138 %cmp9 = icmp sgt i32 %n, 0 1139 br i1 %cmp9, label %for.body, label %for.end 1140 1141for.body: ; preds = %entry, %for.body 1142 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1143 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 1144 %0 = load double, ptr %arrayidx, align 8 1145 %arrayidx2 = getelementptr inbounds double, ptr %z, i64 %indvars.iv 1146 %1 = load double, ptr %arrayidx2, align 8 1147 %call = tail call double @llvm.pow.f64(double %0, double %1) 1148 %arrayidx4 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 1149 store double %call, ptr %arrayidx4, align 8 1150 %indvars.iv.next = add i64 %indvars.iv, 1 1151 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1152 %exitcond = icmp eq i32 %lftr.wideiv, %n 1153 br i1 %exitcond, label %for.end, label %for.body 1154 1155for.end: ; preds = %for.body, %entry 1156 ret void 1157} 1158 1159define void @fabs_libm(ptr %x) { 1160; CHECK: fabs_libm 1161; CHECK: call <4 x float> @llvm.fabs.v4f32 1162; CHECK: ret void 1163; 1164entry: 1165 br label %for.body 1166 1167for.body: ; preds = %entry, %for.body 1168 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 1169 %arrayidx = getelementptr inbounds float, ptr %x, i64 %indvars.iv 1170 %0 = load float, ptr %arrayidx, align 4 1171 %call = tail call float @fabsf(float %0) nounwind readnone 1172 store float %call, ptr %arrayidx, align 4 1173 %indvars.iv.next = add i64 %indvars.iv, 1 1174 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1175 %exitcond = icmp eq i32 %lftr.wideiv, 1024 1176 br i1 %exitcond, label %for.end, label %for.body 1177 1178for.end: ; preds = %for.body 1179 ret void 1180} 1181 1182declare float @fabsf(float) nounwind readnone 1183 1184declare double @llvm.pow.f64(double, double) 1185 1186; Make sure we don't replace calls to functions with standard library function 1187; signatures but defined with internal linkage. 1188 1189define internal float @roundf(float %x) { 1190 ret float 0.00000000 1191} 1192define void @internal_round(ptr %x) { 1193; CHECK-LABEL: internal_round 1194; CHECK-NOT: load <4 x float> 1195; CHECK: ret void 1196; 1197entry: 1198 br label %for.body 1199 1200for.body: ; preds = %entry, %for.body 1201 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 1202 %arrayidx = getelementptr inbounds float, ptr %x, i64 %indvars.iv 1203 %0 = load float, ptr %arrayidx, align 4 1204 %call = tail call float @roundf(float %0) 1205 store float %call, ptr %arrayidx, align 4 1206 %indvars.iv.next = add i64 %indvars.iv, 1 1207 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1208 %exitcond = icmp eq i32 %lftr.wideiv, 1024 1209 br i1 %exitcond, label %for.end, label %for.body 1210 1211for.end: ; preds = %for.body 1212 ret void 1213} 1214 1215; Make sure we don't replace calls to functions with standard library names but 1216; different signatures. 1217 1218declare void @round(double %f) 1219 1220define void @wrong_signature(ptr %x) { 1221; CHECK-LABEL: wrong_signature 1222; CHECK-NOT: load <4 x double> 1223; CHECK: ret void 1224; 1225entry: 1226 br label %for.body 1227 1228for.body: ; preds = %entry, %for.body 1229 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 1230 %arrayidx = getelementptr inbounds double, ptr %x, i64 %indvars.iv 1231 %0 = load double, ptr %arrayidx, align 4 1232 store double %0, ptr %arrayidx, align 4 1233 tail call void @round(double %0) 1234 %indvars.iv.next = add i64 %indvars.iv, 1 1235 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1236 %exitcond = icmp eq i32 %lftr.wideiv, 1024 1237 br i1 %exitcond, label %for.end, label %for.body 1238 1239for.end: ; preds = %for.body 1240 ret void 1241} 1242 1243declare double @llvm.powi.f64.i32(double %Val, i32 %power) 1244 1245define void @powi_f64(i32 %n, ptr %y, ptr %x, i32 %P) { 1246; CHECK-LABEL: @powi_f64( 1247; CHECK: llvm.powi.v4f64 1248; CHECK: ret void 1249; 1250entry: 1251 %cmp9 = icmp sgt i32 %n, 0 1252 br i1 %cmp9, label %for.body, label %for.end 1253 1254for.body: ; preds = %entry, %for.body 1255 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1256 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 1257 %0 = load double, ptr %arrayidx, align 8 1258 %call = tail call double @llvm.powi.f64.i32(double %0, i32 %P) 1259 %arrayidx4 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 1260 store double %call, ptr %arrayidx4, align 8 1261 %indvars.iv.next = add i64 %indvars.iv, 1 1262 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1263 %exitcond = icmp eq i32 %lftr.wideiv, %n 1264 br i1 %exitcond, label %for.end, label %for.body 1265 1266for.end: ; preds = %for.body, %entry 1267 ret void 1268} 1269 1270define void @powi_f64_neg(i32 %n, ptr %y, ptr %x) { 1271; CHECK-LABEL: @powi_f64_neg( 1272; CHECK-NOT: llvm.powi.v4f64 1273; CHECK: ret void 1274; 1275entry: 1276 %cmp9 = icmp sgt i32 %n, 0 1277 br i1 %cmp9, label %for.body, label %for.end 1278 1279for.body: ; preds = %entry, %for.body 1280 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1281 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv 1282 %0 = load double, ptr %arrayidx, align 8 1283 %1 = trunc i64 %indvars.iv to i32 1284 %call = tail call double @llvm.powi.f64.i32(double %0, i32 %1) 1285 %arrayidx4 = getelementptr inbounds double, ptr %x, i64 %indvars.iv 1286 store double %call, ptr %arrayidx4, align 8 1287 %indvars.iv.next = add i64 %indvars.iv, 1 1288 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1289 %exitcond = icmp eq i32 %lftr.wideiv, %n 1290 br i1 %exitcond, label %for.end, label %for.body 1291 1292for.end: ; preds = %for.body, %entry 1293 ret void 1294} 1295 1296declare i64 @llvm.cttz.i64 (i64, i1) 1297 1298define void @cttz_f64(i32 %n, ptr %y, ptr %x) { 1299; CHECK-LABEL: @cttz_f64( 1300; CHECK: llvm.cttz.v4i64 1301; CHECK: ret void 1302; 1303entry: 1304 %cmp9 = icmp sgt i32 %n, 0 1305 br i1 %cmp9, label %for.body, label %for.end 1306 1307for.body: ; preds = %entry, %for.body 1308 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1309 %arrayidx = getelementptr inbounds i64, ptr %y, i64 %indvars.iv 1310 %0 = load i64, ptr %arrayidx, align 8 1311 %call = tail call i64 @llvm.cttz.i64(i64 %0, i1 true) 1312 %arrayidx4 = getelementptr inbounds i64, ptr %x, i64 %indvars.iv 1313 store i64 %call, ptr %arrayidx4, align 8 1314 %indvars.iv.next = add i64 %indvars.iv, 1 1315 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1316 %exitcond = icmp eq i32 %lftr.wideiv, %n 1317 br i1 %exitcond, label %for.end, label %for.body 1318 1319for.end: ; preds = %for.body, %entry 1320 ret void 1321} 1322 1323declare i64 @llvm.ctlz.i64 (i64, i1) 1324 1325define void @ctlz_f64(i32 %n, ptr %y, ptr %x) { 1326; CHECK-LABEL: @ctlz_f64( 1327; CHECK: llvm.ctlz.v4i64 1328; CHECK: ret void 1329; 1330entry: 1331 %cmp9 = icmp sgt i32 %n, 0 1332 br i1 %cmp9, label %for.body, label %for.end 1333 1334for.body: ; preds = %entry, %for.body 1335 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1336 %arrayidx = getelementptr inbounds i64, ptr %y, i64 %indvars.iv 1337 %0 = load i64, ptr %arrayidx, align 8 1338 %call = tail call i64 @llvm.ctlz.i64(i64 %0, i1 true) 1339 %arrayidx4 = getelementptr inbounds i64, ptr %x, i64 %indvars.iv 1340 store i64 %call, ptr %arrayidx4, align 8 1341 %indvars.iv.next = add i64 %indvars.iv, 1 1342 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1343 %exitcond = icmp eq i32 %lftr.wideiv, %n 1344 br i1 %exitcond, label %for.end, label %for.body 1345 1346for.end: ; preds = %for.body, %entry 1347 ret void 1348} 1349 1350declare i64 @llvm.abs.i64 (i64, i1) 1351 1352define void @abs_i64(i32 %n, ptr %y, ptr %x) { 1353; CHECK-LABEL: @abs_i64( 1354; CHECK: llvm.abs.v4i64(<4 x i64> [[WIDE_LOADX:%.*]], i1 true) 1355; CHECK: ret void 1356; 1357entry: 1358 %cmp9 = icmp sgt i32 %n, 0 1359 br i1 %cmp9, label %for.body, label %for.end 1360 1361for.body: ; preds = %entry, %for.body 1362 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1363 %arrayidx = getelementptr inbounds i64, ptr %y, i64 %indvars.iv 1364 %0 = load i64, ptr %arrayidx, align 8 1365 %call = tail call i64 @llvm.abs.i64(i64 %0, i1 true) 1366 %arrayidx4 = getelementptr inbounds i64, ptr %x, i64 %indvars.iv 1367 store i64 %call, ptr %arrayidx4, align 8 1368 %indvars.iv.next = add i64 %indvars.iv, 1 1369 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1370 %exitcond = icmp eq i32 %lftr.wideiv, %n 1371 br i1 %exitcond, label %for.end, label %for.body 1372 1373for.end: ; preds = %for.body, %entry 1374 ret void 1375} 1376 1377declare i32 @llvm.smin.i32 (i32, i32) 1378 1379define void @smin_i32(i32 %n, ptr %x, ptr %y) { 1380; CHECK-LABEL: @smin_i32( 1381; CHECK: call <4 x i32> @llvm.smin.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]]) 1382; CHECK: ret void 1383; 1384entry: 1385 %cmp = icmp sgt i32 %n, 0 1386 br i1 %cmp, label %loop, label %end 1387 1388loop: 1389 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ] 1390 %xi = getelementptr inbounds i32, ptr %x, i32 %iv 1391 %yi = getelementptr inbounds i32, ptr %y, i32 %iv 1392 %xld = load i32, ptr %xi, align 4 1393 %yld = load i32, ptr %yi, align 4 1394 %call = tail call i32 @llvm.smin.i32(i32 %xld, i32 %yld) 1395 store i32 %call, ptr %xi, align 4 1396 %iv.next = add i32 %iv, 1 1397 %exitcond = icmp eq i32 %iv.next, %n 1398 br i1 %exitcond, label %end, label %loop 1399 1400end: 1401 ret void 1402} 1403 1404declare i32 @llvm.smax.i32 (i32, i32) 1405 1406define void @smax_i32(i32 %n, ptr %x, ptr %y) { 1407; CHECK-LABEL: @smax_i32( 1408; CHECK: call <4 x i32> @llvm.smax.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]]) 1409; CHECK: ret void 1410; 1411entry: 1412 %cmp = icmp sgt i32 %n, 0 1413 br i1 %cmp, label %loop, label %end 1414 1415loop: 1416 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ] 1417 %xi = getelementptr inbounds i32, ptr %x, i32 %iv 1418 %yi = getelementptr inbounds i32, ptr %y, i32 %iv 1419 %xld = load i32, ptr %xi, align 4 1420 %yld = load i32, ptr %yi, align 4 1421 %call = tail call i32 @llvm.smax.i32(i32 %xld, i32 %yld) 1422 store i32 %call, ptr %xi, align 4 1423 %iv.next = add i32 %iv, 1 1424 %exitcond = icmp eq i32 %iv.next, %n 1425 br i1 %exitcond, label %end, label %loop 1426 1427end: 1428 ret void 1429} 1430 1431declare i32 @llvm.umin.i32 (i32, i32) 1432 1433define void @umin_i32(i32 %n, ptr %x, ptr %y) { 1434; CHECK-LABEL: @umin_i32( 1435; CHECK: call <4 x i32> @llvm.umin.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]]) 1436; CHECK: ret void 1437; 1438entry: 1439 %cmp = icmp sgt i32 %n, 0 1440 br i1 %cmp, label %loop, label %end 1441 1442loop: 1443 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ] 1444 %xi = getelementptr inbounds i32, ptr %x, i32 %iv 1445 %yi = getelementptr inbounds i32, ptr %y, i32 %iv 1446 %xld = load i32, ptr %xi, align 4 1447 %yld = load i32, ptr %yi, align 4 1448 %call = tail call i32 @llvm.umin.i32(i32 %xld, i32 %yld) 1449 store i32 %call, ptr %xi, align 4 1450 %iv.next = add i32 %iv, 1 1451 %exitcond = icmp eq i32 %iv.next, %n 1452 br i1 %exitcond, label %end, label %loop 1453 1454end: 1455 ret void 1456} 1457 1458declare i32 @llvm.umax.i32 (i32, i32) 1459 1460define void @umax_i32(i32 %n, ptr %x, ptr %y) { 1461; CHECK-LABEL: @umax_i32( 1462; CHECK: call <4 x i32> @llvm.umax.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]]) 1463; CHECK: ret void 1464; 1465entry: 1466 %cmp = icmp sgt i32 %n, 0 1467 br i1 %cmp, label %loop, label %end 1468 1469loop: 1470 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ] 1471 %xi = getelementptr inbounds i32, ptr %x, i32 %iv 1472 %yi = getelementptr inbounds i32, ptr %y, i32 %iv 1473 %xld = load i32, ptr %xi, align 4 1474 %yld = load i32, ptr %yi, align 4 1475 %call = tail call i32 @llvm.umax.i32(i32 %xld, i32 %yld) 1476 store i32 %call, ptr %xi, align 4 1477 %iv.next = add i32 %iv, 1 1478 %exitcond = icmp eq i32 %iv.next, %n 1479 br i1 %exitcond, label %end, label %loop 1480 1481end: 1482 ret void 1483} 1484 1485declare i32 @llvm.fshl.i32 (i32, i32, i32) 1486 1487define void @fshl_i32(i32 %n, ptr %x, ptr %y, i32 %shAmt) { 1488; CHECK-LABEL: @fshl_i32( 1489; CHECK: call <4 x i32> @llvm.fshl.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]], <4 x i32> [[SPLAT:%.*]]) 1490; CHECK: ret void 1491; 1492entry: 1493 %cmp = icmp sgt i32 %n, 0 1494 br i1 %cmp, label %loop, label %end 1495 1496loop: 1497 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ] 1498 %xi = getelementptr inbounds i32, ptr %x, i32 %iv 1499 %yi = getelementptr inbounds i32, ptr %y, i32 %iv 1500 %xld = load i32, ptr %xi, align 4 1501 %yld = load i32, ptr %yi, align 4 1502 %call = tail call i32 @llvm.fshl.i32(i32 %xld, i32 %yld, i32 %shAmt) 1503 store i32 %call, ptr %xi, align 4 1504 %iv.next = add i32 %iv, 1 1505 %exitcond = icmp eq i32 %iv.next, %n 1506 br i1 %exitcond, label %end, label %loop 1507 1508end: 1509 ret void 1510} 1511 1512declare i32 @llvm.fshr.i32 (i32, i32, i32) 1513 1514define void @fshr_i32(i32 %n, ptr %x, ptr %y, i32 %shAmt) { 1515; CHECK-LABEL: @fshr_i32( 1516; CHECK: call <4 x i32> @llvm.fshr.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]], <4 x i32> [[SPLAT:%.*]]) 1517; CHECK: ret void 1518; 1519entry: 1520 %cmp = icmp sgt i32 %n, 0 1521 br i1 %cmp, label %loop, label %end 1522 1523loop: 1524 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ] 1525 %xi = getelementptr inbounds i32, ptr %x, i32 %iv 1526 %yi = getelementptr inbounds i32, ptr %y, i32 %iv 1527 %xld = load i32, ptr %xi, align 4 1528 %yld = load i32, ptr %yi, align 4 1529 %call = tail call i32 @llvm.fshr.i32(i32 %xld, i32 %yld, i32 %shAmt) 1530 store i32 %call, ptr %xi, align 4 1531 %iv.next = add i32 %iv, 1 1532 %exitcond = icmp eq i32 %iv.next, %n 1533 br i1 %exitcond, label %end, label %loop 1534 1535end: 1536 ret void 1537} 1538 1539declare float @llvm.minnum.f32(float, float) 1540 1541define void @minnum_f32(i32 %n, ptr %y, ptr %x, ptr %z) { 1542; CHECK-LABEL: @minnum_f32( 1543; CHECK: llvm.minnum.v4f32 1544; CHECK: ret void 1545; 1546entry: 1547 %cmp9 = icmp sgt i32 %n, 0 1548 br i1 %cmp9, label %for.body, label %for.end 1549 1550for.body: ; preds = %entry, %for.body 1551 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1552 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 1553 %0 = load float, ptr %arrayidx, align 4 1554 %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv 1555 %1 = load float, ptr %arrayidx2, align 4 1556 %call = tail call float @llvm.minnum.f32(float %0, float %1) 1557 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 1558 store float %call, ptr %arrayidx4, align 4 1559 %indvars.iv.next = add i64 %indvars.iv, 1 1560 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1561 %exitcond = icmp eq i32 %lftr.wideiv, %n 1562 br i1 %exitcond, label %for.end, label %for.body 1563 1564for.end: ; preds = %for.body, %entry 1565 ret void 1566} 1567 1568declare float @llvm.maxnum.f32(float, float) 1569 1570define void @maxnum_f32(i32 %n, ptr %y, ptr %x, ptr %z) { 1571; CHECK-LABEL: @maxnum_f32( 1572; CHECK: llvm.maxnum.v4f32 1573; CHECK: ret void 1574; 1575entry: 1576 %cmp9 = icmp sgt i32 %n, 0 1577 br i1 %cmp9, label %for.body, label %for.end 1578 1579for.body: ; preds = %entry, %for.body 1580 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1581 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 1582 %0 = load float, ptr %arrayidx, align 4 1583 %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv 1584 %1 = load float, ptr %arrayidx2, align 4 1585 %call = tail call float @llvm.maxnum.f32(float %0, float %1) 1586 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 1587 store float %call, ptr %arrayidx4, align 4 1588 %indvars.iv.next = add i64 %indvars.iv, 1 1589 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1590 %exitcond = icmp eq i32 %lftr.wideiv, %n 1591 br i1 %exitcond, label %for.end, label %for.body 1592 1593for.end: ; preds = %for.body, %entry 1594 ret void 1595} 1596 1597declare float @llvm.minimum.f32(float, float) 1598 1599define void @minimum_f32(i32 %n, ptr %y, ptr %x, ptr %z) { 1600; CHECK-LABEL: @minimum_f32( 1601; CHECK: llvm.minimum.v4f32 1602; CHECK: ret void 1603; 1604entry: 1605 %cmp9 = icmp sgt i32 %n, 0 1606 br i1 %cmp9, label %for.body, label %for.end 1607 1608for.body: ; preds = %entry, %for.body 1609 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1610 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 1611 %0 = load float, ptr %arrayidx, align 4 1612 %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv 1613 %1 = load float, ptr %arrayidx2, align 4 1614 %call = tail call float @llvm.minimum.f32(float %0, float %1) 1615 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 1616 store float %call, ptr %arrayidx4, align 4 1617 %indvars.iv.next = add i64 %indvars.iv, 1 1618 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1619 %exitcond = icmp eq i32 %lftr.wideiv, %n 1620 br i1 %exitcond, label %for.end, label %for.body 1621 1622for.end: ; preds = %for.body, %entry 1623 ret void 1624} 1625 1626declare float @llvm.maximum.f32(float, float) 1627 1628define void @maximum_f32(i32 %n, ptr %y, ptr %x, ptr %z) { 1629; CHECK-LABEL: @maximum_f32( 1630; CHECK: llvm.maximum.v4f32 1631; CHECK: ret void 1632; 1633entry: 1634 %cmp9 = icmp sgt i32 %n, 0 1635 br i1 %cmp9, label %for.body, label %for.end 1636 1637for.body: ; preds = %entry, %for.body 1638 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1639 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv 1640 %0 = load float, ptr %arrayidx, align 4 1641 %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv 1642 %1 = load float, ptr %arrayidx2, align 4 1643 %call = tail call float @llvm.maximum.f32(float %0, float %1) 1644 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv 1645 store float %call, ptr %arrayidx4, align 4 1646 %indvars.iv.next = add i64 %indvars.iv, 1 1647 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 1648 %exitcond = icmp eq i32 %lftr.wideiv, %n 1649 br i1 %exitcond, label %for.end, label %for.body 1650 1651for.end: ; preds = %for.body, %entry 1652 ret void 1653} 1654 1655declare i32 @llvm.lrint.i32.f32(float) 1656 1657define void @lrint_i32_f32(ptr %x, ptr %y, i64 %n) { 1658; CHECK-LABEL: @lrint_i32_f32( 1659; CHECK: llvm.lrint.v4i32.v4f32 1660; CHECK: ret void 1661; 1662entry: 1663 %cmp = icmp sgt i64 %n, 0 1664 br i1 %cmp, label %for.body, label %exit 1665 1666for.body: ; preds = %entry, %for.body 1667 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ] 1668 %gep.load = getelementptr inbounds float, ptr %x, i64 %iv 1669 %0 = load float, ptr %gep.load, align 4 1670 %1 = tail call i32 @llvm.lrint.i32.f32(float %0) 1671 %gep.store = getelementptr inbounds i32, ptr %y, i64 %iv 1672 store i32 %1, ptr %gep.store, align 4 1673 %iv.next = add nuw nsw i64 %iv, 1 1674 %exitcond = icmp eq i64 %iv.next, %n 1675 br i1 %exitcond, label %exit, label %for.body 1676 1677exit: ; preds = %for.body, %entry 1678 ret void 1679} 1680 1681declare i64 @llvm.llrint.i64.f32(float) 1682 1683define void @llrint_i64_f32(ptr %x, ptr %y, i64 %n) { 1684; CHECK-LABEL: @llrint_i64_f32( 1685; CHECK: llvm.llrint.v4i64.v4f32 1686; CHECK: ret void 1687; 1688entry: 1689 %cmp = icmp sgt i64 %n, 0 1690 br i1 %cmp, label %for.body, label %exit 1691 1692for.body: ; preds = %entry, %for.body 1693 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ] 1694 %gep.load = getelementptr inbounds float, ptr %x, i64 %iv 1695 %0 = load float, ptr %gep.load, align 4 1696 %1 = tail call i64 @llvm.llrint.i64.f32(float %0) 1697 %gep.store = getelementptr inbounds i64, ptr %y, i64 %iv 1698 store i64 %1, ptr %gep.store, align 4 1699 %iv.next = add nuw nsw i64 %iv, 1 1700 %exitcond = icmp eq i64 %iv.next, %n 1701 br i1 %exitcond, label %exit, label %for.body 1702 1703exit: ; preds = %for.body, %entry 1704 ret void 1705} 1706