1; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s 2; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} 3 4;; Support of doubles is required. 5; CHECK: OpCapability Float64 6; CHECK: "fun01" 7define spir_kernel void @fun01(i32 addrspace(1)* noalias %a, i32 addrspace(1)* %b, i32 %c) { 8entry: 9 %a.addr = alloca i32 addrspace(1)*, align 8 10 %b.addr = alloca i32 addrspace(1)*, align 8 11 %c.addr = alloca i32, align 4 12 store i32 addrspace(1)* %a, i32 addrspace(1)** %a.addr, align 8 13 store i32 addrspace(1)* %b, i32 addrspace(1)** %b.addr, align 8 14 store i32 %c, i32* %c.addr, align 4 15 %0 = load i32 addrspace(1)*, i32 addrspace(1)** %b.addr, align 8 16 %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %0, i64 0 17 %1 = load i32, i32 addrspace(1)* %arrayidx, align 4 18 %2 = load i32 addrspace(1)*, i32 addrspace(1)** %a.addr, align 8 19 %arrayidx1 = getelementptr inbounds i32, i32 addrspace(1)* %2, i64 0 20 store i32 %1, i32 addrspace(1)* %arrayidx1, align 4 21 %3 = load i32 addrspace(1)*, i32 addrspace(1)** %b.addr, align 8 22 %cmp = icmp ugt i32 addrspace(1)* %3, null 23 br i1 %cmp, label %if.then, label %if.end 24 25if.then: ; preds = %entry 26 %4 = load i32 addrspace(1)*, i32 addrspace(1)** %a.addr, align 8 27 %arrayidx2 = getelementptr inbounds i32, i32 addrspace(1)* %4, i64 0 28 store i32 2, i32 addrspace(1)* %arrayidx2, align 4 29 br label %if.end 30 31if.end: ; preds = %if.then, %entry 32 ret void 33} 34 35; CHECK: "fun02" 36define spir_kernel void @fun02(double addrspace(1)* %a, double addrspace(1)* %b, i32 %c) { 37entry: 38 %a.addr = alloca double addrspace(1)*, align 8 39 %b.addr = alloca double addrspace(1)*, align 8 40 %c.addr = alloca i32, align 4 41 store double addrspace(1)* %a, double addrspace(1)** %a.addr, align 8 42 store double addrspace(1)* %b, double addrspace(1)** %b.addr, align 8 43 store i32 %c, i32* %c.addr, align 4 44 %0 = load i32, i32* %c.addr, align 4 45 %idxprom = sext i32 %0 to i64 46 %1 = load double addrspace(1)*, double addrspace(1)** %b.addr, align 8 47 %arrayidx = getelementptr inbounds double, double addrspace(1)* %1, i64 %idxprom 48 %2 = load double, double addrspace(1)* %arrayidx, align 8 49 %3 = load i32, i32* %c.addr, align 4 50 %idxprom1 = sext i32 %3 to i64 51 %4 = load double addrspace(1)*, double addrspace(1)** %a.addr, align 8 52 %arrayidx2 = getelementptr inbounds double, double addrspace(1)* %4, i64 %idxprom1 53 store double %2, double addrspace(1)* %arrayidx2, align 8 54 ret void 55} 56 57; CHECK: "test_builtin" 58define spir_func void @test_builtin(i32 addrspace(1)* %in, i32 addrspace(1)* %out) { 59entry: 60 %in.addr = alloca i32 addrspace(1)*, align 8 61 %out.addr = alloca i32 addrspace(1)*, align 8 62 %n = alloca i32, align 4 63 store i32 addrspace(1)* %in, i32 addrspace(1)** %in.addr, align 8 64 store i32 addrspace(1)* %out, i32 addrspace(1)** %out.addr, align 8 65 %call = call spir_func i64 @_Z13get_global_idj(i32 0) 66 %conv = trunc i64 %call to i32 67 store i32 %conv, i32* %n, align 4 68 %0 = load i32, i32* %n, align 4 69 %idxprom = sext i32 %0 to i64 70 %1 = load i32 addrspace(1)*, i32 addrspace(1)** %in.addr, align 8 71 %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %1, i64 %idxprom 72 %2 = load i32, i32 addrspace(1)* %arrayidx, align 4 73 %call1 = call spir_func i32 @_Z3absi(i32 %2) 74 %3 = load i32, i32* %n, align 4 75 %idxprom2 = sext i32 %3 to i64 76 %4 = load i32 addrspace(1)*, i32 addrspace(1)** %out.addr, align 8 77 %arrayidx3 = getelementptr inbounds i32, i32 addrspace(1)* %4, i64 %idxprom2 78 store i32 %call1, i32 addrspace(1)* %arrayidx3, align 4 79 ret void 80} 81 82; CHECK-NOT: "_Z13get_global_idj" 83declare spir_func i64 @_Z13get_global_idj(i32) 84 85; CHECK-NOT: "_Z3absi" 86declare spir_func i32 @_Z3absi(i32) 87 88; CHECK: "myabs" 89define spir_func i32 @myabs(i32 %x) { 90entry: 91 %x.addr = alloca i32, align 4 92 store i32 %x, i32* %x.addr, align 4 93 %0 = load i32, i32* %x.addr, align 4 94 %call = call spir_func i32 @_Z3absi(i32 %0) 95 ret i32 %call 96} 97 98; CHECK: "test_function_call" 99define spir_func void @test_function_call(i32 addrspace(1)* %in, i32 addrspace(1)* %out) { 100entry: 101 %in.addr = alloca i32 addrspace(1)*, align 8 102 %out.addr = alloca i32 addrspace(1)*, align 8 103 %n = alloca i32, align 4 104 store i32 addrspace(1)* %in, i32 addrspace(1)** %in.addr, align 8 105 store i32 addrspace(1)* %out, i32 addrspace(1)** %out.addr, align 8 106 %call = call spir_func i64 @_Z13get_global_idj(i32 0) 107 %conv = trunc i64 %call to i32 108 store i32 %conv, i32* %n, align 4 109 %0 = load i32, i32* %n, align 4 110 %idxprom = sext i32 %0 to i64 111 %1 = load i32 addrspace(1)*, i32 addrspace(1)** %in.addr, align 8 112 %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %1, i64 %idxprom 113 %2 = load i32, i32 addrspace(1)* %arrayidx, align 4 114 %call1 = call spir_func i32 @myabs(i32 %2) 115 %3 = load i32, i32* %n, align 4 116 %idxprom2 = sext i32 %3 to i64 117 %4 = load i32 addrspace(1)*, i32 addrspace(1)** %out.addr, align 8 118 %arrayidx3 = getelementptr inbounds i32, i32 addrspace(1)* %4, i64 %idxprom2 119 store i32 %call1, i32 addrspace(1)* %arrayidx3, align 4 120 ret void 121} 122