xref: /llvm-project/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_variable_length_array/vararr.ll (revision 67d3ef74b31e1517d4f679e754cc2b3041c95901)
1; Modified from: https://github.com/KhronosGroup/SPIRV-LLVM-Translator/test/extensions/INTEL/SPV_INTEL_variable_length_array/basic.ll
2
3; RUN: not llc -O0 -mtriple=spirv32-unknown-unknown %s -o %t.spvt 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR
4; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_INTEL_variable_length_array %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
5; TODO: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_INTEL_variable_length_array %s -o - -filetype=obj | spirv-val %}
6
7; CHECK-ERROR: LLVM ERROR: array allocation: this instruction requires the following SPIR-V extension: SPV_INTEL_variable_length_array
8
9; CHECK-SPIRV: Capability VariableLengthArrayINTEL
10; CHECK-SPIRV: Extension "SPV_INTEL_variable_length_array"
11
12; CHECK-SPIRV-DAG: OpName %[[Len:.*]] "a"
13; CHECK-SPIRV-DAG: %[[Long:.*]] = OpTypeInt 64 0
14; CHECK-SPIRV-DAG: %[[Int:.*]] = OpTypeInt 32 0
15; CHECK-SPIRV-DAG: %[[Char:.*]] = OpTypeInt 8 0
16; CHECK-SPIRV-DAG: %[[CharPtr:.*]] = OpTypePointer {{[a-zA-Z]+}} %[[Char]]
17; CHECK-SPIRV-DAG: %[[IntPtr:.*]] = OpTypePointer {{[a-zA-Z]+}} %[[Int]]
18; CHECK-SPIRV: %[[Len]] = OpFunctionParameter %[[Long:.*]]
19; CHECK-SPIRV: %[[SavedMem1:.*]] = OpSaveMemoryINTEL %[[CharPtr]]
20; CHECK-SPIRV: OpVariableLengthArrayINTEL %[[IntPtr]] %[[Len]]
21; CHECK-SPIRV: OpRestoreMemoryINTEL %[[SavedMem1]]
22; CHECK-SPIRV: %[[SavedMem2:.*]] = OpSaveMemoryINTEL %[[CharPtr]]
23; CHECK-SPIRV: OpVariableLengthArrayINTEL %[[IntPtr]] %[[Len]]
24; CHECK-SPIRV: OpRestoreMemoryINTEL %[[SavedMem2]]
25
26target 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"
27target triple = "spir"
28
29define dso_local spir_func i32 @foo(i64 %a, i64 %b) {
30entry:
31  %vector1 = alloca [42 x i32], align 16
32  call void @llvm.lifetime.start.p0(i64 168, ptr nonnull %vector1)
33  %stack1 = call ptr @llvm.stacksave.p0()
34  %vla = alloca i32, i64 %a, align 16
35  %arrayidx = getelementptr inbounds i32, ptr %vla, i64 %b
36  %elem1 = load i32, ptr %arrayidx, align 4
37  call void @llvm.stackrestore.p0(ptr %stack1)
38  %stack2 = call ptr @llvm.stacksave.p0()
39  %vla2 = alloca i32, i64 %a, align 16
40  %arrayidx3 = getelementptr inbounds [42 x i32], ptr %vector1, i64 0, i64 %b
41  %elemt = load i32, ptr %arrayidx3, align 4
42  %add = add nsw i32 %elemt, %elem1
43  %arrayidx4 = getelementptr inbounds i32, ptr %vla2, i64 %b
44  %elem2 = load i32, ptr %arrayidx4, align 4
45  %add5 = add nsw i32 %add, %elem2
46  call void @llvm.stackrestore.p0(ptr %stack2)
47  call void @llvm.lifetime.end.p0(i64 168, ptr nonnull %vector1)
48  ret i32 %add5
49}
50
51declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
52declare ptr @llvm.stacksave.p0()
53declare void @llvm.stackrestore.p0(ptr)
54declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
55