1 ; RUN: llvm-as < %s > %t.bc 2 ; RUN: llvm-spirv %t.bc -spirv-text -o %t.txt 3 ; RUN: FileCheck < %t.txt %s --check-prefix=SPIRV 4 ; RUN: llvm-spirv %t.bc -o %t.spv 5 ; RUN: llvm-spirv -r %t.spv -o %t.rev.bc 6 ; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=BACK-TO-LLVM 7 8 ; ModuleID = 'c:/work/tmp/testLink.c' 9 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024" 10 target triple = "spir-unknown-unknown" 11 12 ; SPIRV: Capability Linkage 13 ; SPIRV: EntryPoint 6 [[kern:[0-9]+]] "kern" 14 15 @ae = available_externally addrspace(1) global i32 79, align 4 16 ; SPIRV: Name [[ae:[0-9]+]] "ae" 17 ; BACK-TO-LLVM: @ae = available_externally addrspace(1) global i32 79, align 4 18 19 @i1 = addrspace(1) global i32 1, align 4 20 ; SPIRV: Name [[i1:[0-9]+]] "i1" 21 ; BACK-TO-LLVM: @i1 = addrspace(1) global i32 1, align 4 22 23 @i2 = internal addrspace(1) global i32 2, align 4 24 ; SPIRV: Name [[i2:[0-9]+]] "i2" 25 ; BACK-TO-LLVM: @i2 = internal addrspace(1) global i32 2, align 4 26 27 @i3 = addrspace(1) global i32 3, align 4 28 ; SPIRV: Name [[i3:[0-9]+]] "i3" 29 ; BACK-TO-LLVM: @i3 = addrspace(1) global i32 3, align 4 30 31 @i4 = common addrspace(1) global i32 0, align 4 32 ; SPIRV: Name [[i4:[0-9]+]] "i4" 33 ; BACK-TO-LLVM: @i4 = common addrspace(1) global i32 0, align 4 34 35 @i5 = internal addrspace(1) global i32 0, align 4 36 ; SPIRV: Name [[i5:[0-9]+]] "i5" 37 ; BACK-TO-LLVM: @i5 = internal addrspace(1) global i32 0, align 4 38 39 @color_table = addrspace(2) constant [2 x i32] [i32 0, i32 1], align 4 40 ; SPIRV: Name [[color_table:[0-9]+]] "color_table" 41 ; BACK-TO-LLVM: @color_table = addrspace(2) constant [2 x i32] [i32 0, i32 1], align 4 42 43 @noise_table = external addrspace(2) constant [256 x i32] 44 ; SPIRV: Name [[noise_table:[0-9]+]] "noise_table" 45 ; BACK-TO-LLVM: @noise_table = external addrspace(2) constant [256 x i32] 46 47 @w = addrspace(1) constant i32 0, align 4 48 ; SPIRV: Name [[w:[0-9]+]] "w" 49 ; BACK-TO-LLVM: @w = addrspace(1) constant i32 0, align 4 50 51 @f.color_table = internal addrspace(2) constant [2 x i32] [i32 2, i32 3], align 4 52 ; SPIRV: Name [[f_color_table:[0-9]+]] "f.color_table" 53 ; BACK-TO-LLVM: @f.color_table = internal addrspace(2) constant [2 x i32] [i32 2, i32 3], align 4 54 55 @e = external addrspace(1) global i32 56 ; SPIRV: Name [[e:[0-9]+]] "e" 57 ; BACK-TO-LLVM: @e = external addrspace(1) global i32 58 59 @f.t = internal addrspace(1) global i32 5, align 4 60 ; SPIRV: Name [[f_t:[0-9]+]] "f.t" 61 ; BACK-TO-LLVM: @f.t = internal addrspace(1) global i32 5, align 4 62 63 @f.stint = internal addrspace(1) global i32 0, align 4 64 ; SPIRV: Name [[f_stint:[0-9]+]] "f.stint" 65 ; BACK-TO-LLVM: @f.stint = internal addrspace(1) global i32 0, align 4 66 67 @f.inside = internal addrspace(1) global i32 0, align 4 68 ; SPIRV: Name [[f_inside:[0-9]+]] "f.inside" 69 ; BACK-TO-LLVM: @f.inside = internal addrspace(1) global i32 0, align 4 70 71 @f.b = internal addrspace(2) constant float 1.000000e+00, align 4 72 ; SPIRV: Name [[f_b:[0-9]+]] "f.b" 73 ; BACK-TO-LLVM: @f.b = internal addrspace(2) constant float 1.000000e+00, align 4 74 75 ; SPIRV-DAG: Name [[foo:[0-9]+]] "foo" 76 ; SPIRV-DAG: Name [[f:[0-9]+]] "f" 77 ; SPIRV-DAG: Name [[g:[0-9]+]] "g" 78 ; SPIRV-DAG: Name [[inline_fun:[0-9]+]] "inline_fun" 79 80 ; SPIRV-DAG: Decorate [[ae]] LinkageAttributes "ae" Import 81 ; SPIRV-DAG: Decorate [[e]] LinkageAttributes "e" Import 82 ; SPIRV-DAG: Decorate [[f]] LinkageAttributes "f" Export 83 ; SPIRV-DAG: Decorate [[w]] LinkageAttributes "w" Export 84 ; SPIRV-DAG: Decorate [[i1]] LinkageAttributes "i1" Export 85 ; SPIRV-DAG: Decorate [[i3]] LinkageAttributes "i3" Export 86 ; SPIRV-DAG: Decorate [[i4]] LinkageAttributes "i4" Export 87 ; SPIRV-DAG: Decorate [[foo]] LinkageAttributes "foo" Import 88 ; SPIRV-DAG: Decorate [[inline_fun]] LinkageAttributes "inline_fun" Export 89 ; SPIRV-DAG: Decorate [[color_table]] LinkageAttributes "color_table" Export 90 ; SPIRV-DAG: Decorate [[noise_table]] LinkageAttributes "noise_table" Import 91 92 ; SPIRV: Function {{[0-9]+}} [[foo]] 93 ; BACK-TO-LLVM: declare spir_func void @foo() 94 declare spir_func void @foo() #2 95 96 ; SPIRV: Function {{[0-9]+}} [[f]] 97 ; BACK-TO-LLVM: define spir_func void @f() 98 ; Function Attrs: nounwind 99 define spir_func void @f() #0 { 100 entry: 101 %q = alloca i32, align 4 102 %r = alloca i32, align 4 103 %0 = load i32, i32 addrspace(1)* @i2, align 4 104 store i32 %0, i32* %q, align 4 105 %1 = load i32, i32 addrspace(1)* @i3, align 4 106 store i32 %1, i32 addrspace(1)* @i5, align 4 107 %2 = load i32, i32 addrspace(1)* @e, align 4 108 store i32 %2, i32* %r, align 4 109 %3 = load i32, i32 addrspace(2)* getelementptr inbounds ([256 x i32], [256 x i32] addrspace(2)* @noise_table, i32 0, i32 0), align 4 110 store i32 %3, i32* %r, align 4 111 %4 = load i32, i32 addrspace(2)* getelementptr inbounds ([2 x i32], [2 x i32] addrspace(2)* @f.color_table, i32 0, i32 0), align 4 112 store i32 %4, i32* %r, align 4 113 %call = call spir_func i32 @g() 114 call spir_func void @inline_fun() 115 ret void 116 } 117 118 ; SPIRV: Function {{[0-9]+}} [[g]] 119 ; BACK-TO-LLVM: define internal spir_func i32 @g() 120 ; Function Attrs: nounwind 121 define internal spir_func i32 @g() #0 { 122 entry: 123 call spir_func void @foo() 124 ret i32 25 125 } 126 127 ; SPIRV: Function {{[0-9]+}} [[inline_fun]] 128 ; BACK-TO-LLVM: define spir_func void @inline_fun() 129 ; "linkonce_odr" is lost in translation ! 130 ; Function Attrs: inlinehint nounwind 131 define linkonce_odr spir_func void @inline_fun() #1 { 132 entry: 133 %t = alloca i32 addrspace(1)*, align 4 134 store i32 addrspace(1)* @i1, i32 addrspace(1)** %t, align 4 135 ret void 136 } 137 138 ; SPIRV: Function {{[0-9]+}} [[kern]] 139 ; BACK-TO-LLVM: define spir_kernel void @kern() 140 ; Function Attrs: nounwind 141 define spir_kernel void @kern() #0 { 142 entry: 143 call spir_func void @f() 144 ret void 145 } 146 147 attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 148 attributes #1 = { inlinehint nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 149 attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 150 151 !opencl.kernels = !{!0} 152 !opencl.enable.FP_CONTRACT = !{} 153 !opencl.spir.version = !{!6} 154 !opencl.ocl.version = !{!7} 155 !opencl.used.extensions = !{!8} 156 !opencl.used.optional.core.features = !{!8} 157 !opencl.compiler.options = !{!8} 158 159 !0 = !{void ()* @kern, !1, !2, !3, !4, !5} 160 !1 = !{!"kernel_arg_addr_space"} 161 !2 = !{!"kernel_arg_access_qual"} 162 !3 = !{!"kernel_arg_type"} 163 !4 = !{!"kernel_arg_base_type"} 164 !5 = !{!"kernel_arg_type_qual"} 165 !6 = !{i32 1, i32 2} 166 !7 = !{i32 2, i32 0} 167 !8 = !{} 168