|
| 1 | +# This file is a part of Julia. License is MIT: https://julialang.org/license |
| 2 | + |
| 3 | +# RUN: julia --startup-file=no %s %t | llvm-link -S %t/* | FileCheck %s |
| 4 | +# RUN: julia --startup-file=no %s %t | llvm-link -S %t/* | opt -load libjulia%shlibext -LowerSIMDLoop -S - | FileCheck %s -check-prefix=LOWER |
| 5 | +using InteractiveUtils |
| 6 | +using Printf |
| 7 | + |
| 8 | +dir = ARGS[1] |
| 9 | +rm(dir, force=true, recursive=true) |
| 10 | +mkdir(dir) |
| 11 | + |
| 12 | +# CHECK-LABEL: @julia_simdf_ |
| 13 | +# LOWER-LABEL: @julia_simdf_ |
| 14 | +function simdf(X) |
| 15 | + acc = zero(eltype(X)) |
| 16 | + @simd for x in X |
| 17 | + acc += x |
| 18 | +# CHECK: call void @julia.loopinfo_marker(), {{.*}}, !julia.loopinfo [[LOOPINFO:![0-9]+]] |
| 19 | +# LOWER-NOT: llvm.mem.parallel_loop_access |
| 20 | +# LOWER-NOT: call void @julia.loopinfo_marker() |
| 21 | +# LOWER: fadd fast double |
| 22 | +# LOWER: br {{.*}}, !llvm.loop [[LOOPID:![0-9]+]] |
| 23 | + end |
| 24 | + acc |
| 25 | +end |
| 26 | + |
| 27 | +# CHECK-LABEL: @julia_simdf2_ |
| 28 | +# LOWER-LABEL: @julia_simdf2_ |
| 29 | +function simdf2(X) |
| 30 | + acc = zero(eltype(X)) |
| 31 | + @simd ivdep for x in X |
| 32 | + acc += x |
| 33 | +# CHECK: call void @julia.loopinfo_marker(), {{.*}}, !julia.loopinfo [[LOOPINFO2:![0-9]+]] |
| 34 | +# LOWER: llvm.mem.parallel_loop_access |
| 35 | +# LOWER-NOT: call void @julia.loopinfo_marker() |
| 36 | +# LOWER: fadd fast double |
| 37 | +# LOWER: br {{.*}}, !llvm.loop [[LOOPID2:![0-9]+]] |
| 38 | + end |
| 39 | + acc |
| 40 | +end |
| 41 | + |
| 42 | +@noinline iterate(i) = @show i |
| 43 | + |
| 44 | +# CHECK-LABEL: @julia_loop_unroll |
| 45 | +# LOWER-LABEL: @julia_loop_unroll |
| 46 | +@eval function loop_unroll(N) |
| 47 | + for i in 1:N |
| 48 | + iterate(i) |
| 49 | + $(Expr(:loopinfo, (Symbol("llvm.loop.unroll.count"), 3))) |
| 50 | +# CHECK: call void @julia.loopinfo_marker(), {{.*}}, !julia.loopinfo [[LOOPINFO3:![0-9]+]] |
| 51 | +# LOWER-NOT: call void @julia.loopinfo_marker() |
| 52 | +# LOWER: br {{.*}}, !llvm.loop [[LOOPID3:![0-9]+]] |
| 53 | + end |
| 54 | +end |
| 55 | + |
| 56 | +# CHECK-LABEL: @julia_loop_unroll2 |
| 57 | +# LOWER-LABEL: @julia_loop_unroll2 |
| 58 | +@eval function loop_unroll2(I) |
| 59 | + for i in 1:10 |
| 60 | + for j in I |
| 61 | + j == 2 && continue |
| 62 | + iterate(i) |
| 63 | + end |
| 64 | + $(Expr(:loopinfo, (Symbol("llvm.loop.unroll.full"),))) |
| 65 | +# CHECK: call void @julia.loopinfo_marker(), {{.*}}, !julia.loopinfo [[LOOPINFO4:![0-9]+]] |
| 66 | +# LOWER-NOT: call void @julia.loopinfo_marker() |
| 67 | +# LOWER: br {{.*}}, !llvm.loop [[LOOPID4:![0-9]+]] |
| 68 | + end |
| 69 | +end |
| 70 | + |
| 71 | +## Check all the MD nodes |
| 72 | +# CHECK: [[LOOPINFO]] = !{!"julia.simdloop"} |
| 73 | +# CHECK: [[LOOPINFO2]] = !{!"julia.simdloop", !"julia.ivdep"} |
| 74 | +# CHECK: [[LOOPINFO3]] = !{[[LOOPUNROLL:![0-9]+]]} |
| 75 | +# CHECK: [[LOOPUNROLL]] = !{!"llvm.loop.unroll.count", i64 3} |
| 76 | +# CHECK: [[LOOPINFO4]] = !{[[LOOPUNROLL2:![0-9]+]]} |
| 77 | +# CHECK: [[LOOPUNROLL2]] = !{!"llvm.loop.unroll.full"} |
| 78 | +# LOWER: [[LOOPID]] = distinct !{[[LOOPID]]} |
| 79 | +# LOWER: [[LOOPID2]] = distinct !{[[LOOPID2]]} |
| 80 | +# LOWER: [[LOOPID3]] = distinct !{[[LOOPID3]], [[LOOPUNROLL:![0-9]+]]} |
| 81 | +# LOWER: [[LOOPUNROLL]] = !{!"llvm.loop.unroll.count", i64 3} |
| 82 | +# LOWER: [[LOOPID4]] = distinct !{[[LOOPID4]], [[LOOPUNROLL2:![0-9]+]]} |
| 83 | +# LOWER: [[LOOPUNROLL2]] = !{!"llvm.loop.unroll.full"} |
| 84 | + |
| 85 | +# Emit LLVM IR to dir |
| 86 | +counter = 0 |
| 87 | +function emit(f, tt...) |
| 88 | + global counter |
| 89 | + name = nameof(f) |
| 90 | + open(joinpath(dir, @sprintf("%05d-%s.ll", counter, name)), "w") do io |
| 91 | + code_llvm(io, f, tt, raw=true, optimize=false, dump_module=true, debuginfo=:none) |
| 92 | + end |
| 93 | + counter+=1 |
| 94 | +end |
| 95 | + |
| 96 | +# Maintaining the order is important |
| 97 | +emit(simdf, Vector{Float64}) |
| 98 | +emit(simdf2, Vector{Float64}) |
| 99 | +emit(loop_unroll, Int64) |
| 100 | +emit(loop_unroll2, Int64) |
| 101 | + |
0 commit comments