blob: 81262cff692455baac835500c3a466962a8d1107 [file] [edit]
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
; A nested aggregate extractvalue can produce an aggregate that is then used as
; the base of another insertvalue. The intermediate aggregate must be lowered as
; an i32 SPIR-V value-id before it is passed to llvm.spv.insertv.
; CHECK-DAG: %[[#I64:]] = OpTypeInt 64
; CHECK-DAG: %[[#ONE:]] = OpConstant %[[#]] 1
; CHECK-DAG: %[[#INNER:]] = OpTypeArray %[[#I64]] %[[#ONE]]
; CHECK-DAG: %[[#OUTER:]] = OpTypeArray %[[#INNER]] %[[#ONE]]
; CHECK: OpFunction
; CHECK: %[[#A:]] = OpFunctionParameter %[[#OUTER]]
; CHECK: %[[#X:]] = OpFunctionParameter %[[#I64]]
; CHECK: %[[#E:]] = OpCompositeExtract %[[#INNER]] %[[#A]] 0
; CHECK: %[[#I:]] = OpCompositeInsert %[[#INNER]] %[[#X]] %[[#E]] 0
; CHECK: %[[#R:]] = OpCompositeInsert %[[#OUTER]] %[[#I]] %[[#A]] 0
; CHECK: OpReturnValue %[[#R]]
define spir_func [1 x [1 x i64]] @f([1 x [1 x i64]] %a, i64 %x) {
%e = extractvalue [1 x [1 x i64]] %a, 0
%i = insertvalue [1 x i64] %e, i64 %x, 0
%r = insertvalue [1 x [1 x i64]] %a, [1 x i64] %i, 0
ret [1 x [1 x i64]] %r
}