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