blob: 959371a7d21e7271d749ef38c6006f2766f1f34c [file] [log] [blame]
; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
; CHECK: %[[#int32:]] = OpTypeInt 32 0
; CHECK: %[[#int64:]] = OpTypeInt 64 0
; CHECK: %[[#vec3:]] = OpTypeVector %[[#int64]] 3
; CHECK: %[[#ptr_input_vec3:]] = OpTypePointer Input %[[#vec3]]
; CHECK: %[[#global_size_var:]] = OpVariable %[[#ptr_input_vec3]] Input
; CHECK: %[[#load_gs1:]] = OpLoad %[[#vec3]] %[[#global_size_var]] Aligned 1
; CHECK: %[[#extract3:]] = OpCompositeExtract %[[#int64]] %[[#load_gs1]] 0
; CHECK: %[[#bitcast1:]] = OpBitcast %[[#]] %[[#]]
; CHECK: %[[#load_out1:]] = OpLoad %[[#]] %[[#bitcast1]] Aligned 8
; CHECK: %[[#gep1:]] = OpInBoundsPtrAccessChain %[[#]] %[[#load_out1]] %[[#]]
; CHECK: OpStore %[[#gep1]] %[[#extract3]] Aligned 8
; CHECK: %[[#load_param_x:]] = OpLoad %[[#int32]] %[[#]]
; CHECK: %[[#load_gs2:]] = OpLoad %[[#vec3]] %[[#global_size_var]] Aligned 1
; CHECK: %[[#dyn_extract:]] = OpVectorExtractDynamic %[[#int64]] %[[#load_gs2]] %[[#load_param_x]]
; CHECK: %[[#cmp:]] = OpULessThan %[[#]] %[[#load_param_x]] %[[#]]
; CHECK: %[[#select2:]] = OpSelect %[[#int64]] %[[#cmp]] %[[#dyn_extract]] %[[#]]
; CHECK: %[[#bitcast2:]] = OpBitcast %[[#]] %[[#]]
; CHECK: %[[#load_out2:]] = OpLoad %[[#]] %[[#bitcast2]] Aligned 8
; CHECK: %[[#gep2:]] = OpInBoundsPtrAccessChain %[[#]] %[[#load_out2]] %[[#]]
; CHECK: OpStore %[[#gep2]] %[[#select2]] Aligned 8
define dso_local spir_kernel void @ggs(ptr noundef align 8 %out, i32 noundef %x) {
entry:
%out.addr = alloca ptr, align 8
%x.addr = alloca i32, align 4
store ptr %out, ptr %out.addr, align 8
store i32 %x, ptr %x.addr, align 4
%call = call i64 @_Z15get_global_sizej(i32 noundef 0)
%0 = load ptr, ptr %out.addr, align 8
%arrayidx = getelementptr inbounds i64, ptr %0, i64 0
store i64 %call, ptr %arrayidx, align 8
%call1 = call i64 @_Z15get_global_sizej(i32 noundef 3)
%1 = load ptr, ptr %out.addr, align 8
%arrayidx2 = getelementptr inbounds i64, ptr %1, i64 1
store i64 %call1, ptr %arrayidx2, align 8
%2 = load i32, ptr %x.addr, align 4
%call3 = call i64 @_Z15get_global_sizej(i32 noundef %2)
%3 = load ptr, ptr %out.addr, align 8
%arrayidx4 = getelementptr inbounds i64, ptr %3, i64 2
store i64 %call3, ptr %arrayidx4, align 8
ret void
}
declare i64 @_Z15get_global_sizej(i32 noundef)