| ; 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 | |
| } |