164792564SMatt Arsenault// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals --include-generated-funcs 264792564SMatt Arsenault// RUN: %clang_cc1 -fno-ident -no-enable-noundef-analysis %s -cl-std=CL2.0 -ffake-address-space-map -O0 -emit-llvm -o - -triple "spir-unknown-unknown" -fdenormal-fp-math-f32=preserve-sign -cl-uniform-work-group-size | FileCheck --check-prefix=SPIR32 %s 364792564SMatt Arsenault// RUN: %clang_cc1 -fno-ident -ffp-exception-behavior=strict -fexperimental-strict-floating-point -no-enable-noundef-analysis %s -cl-std=CL2.0 -ffake-address-space-map -O0 -emit-llvm -o - -triple "spir-unknown-unknown" | FileCheck --check-prefix=STRICTFP %s 464792564SMatt Arsenault 564792564SMatt Arsenault 664792564SMatt Arsenault// Test that attributes are correctly applied to functions introduced for 764792564SMatt Arsenault// enqueued blocks 864792564SMatt Arsenault 964792564SMatt Arsenault 1064792564SMatt Arsenaulttypedef void (^bl_t)(local void *); 1164792564SMatt Arsenaulttypedef struct {int a;} ndrange_t; 1264792564SMatt Arsenault 1364792564SMatt Arsenaultkernel void device_side_enqueue(global float *a, global float *b, int i) { 1464792564SMatt Arsenault queue_t default_queue; 1564792564SMatt Arsenault unsigned flags = 0; 1664792564SMatt Arsenault ndrange_t ndrange; 1764792564SMatt Arsenault 1864792564SMatt Arsenault enqueue_kernel(default_queue, flags, ndrange, 1964792564SMatt Arsenault ^(void) { 2064792564SMatt Arsenault a[i] = 4.0f * b[i] + 1.0f; 2164792564SMatt Arsenault }); 2264792564SMatt Arsenault} 2364792564SMatt Arsenault// SPIR32: Function Attrs: convergent noinline norecurse nounwind optnone 2464792564SMatt Arsenault// SPIR32-LABEL: define {{[^@]+}}@device_side_enqueue 2594473f4dSHari Limaye// SPIR32-SAME: (ptr addrspace(1) align 4 [[A:%.*]], ptr addrspace(1) align 4 [[B:%.*]], i32 [[I:%.*]]) #[[ATTR0:[0-9]+]] !kernel_arg_addr_space [[META2:![0-9]+]] !kernel_arg_access_qual [[META3:![0-9]+]] !kernel_arg_type [[META4:![0-9]+]] !kernel_arg_base_type [[META4]] !kernel_arg_type_qual [[META5:![0-9]+]] { 2664792564SMatt Arsenault// SPIR32-NEXT: entry: 2764792564SMatt Arsenault// SPIR32-NEXT: [[A_ADDR:%.*]] = alloca ptr addrspace(1), align 4 2864792564SMatt Arsenault// SPIR32-NEXT: [[B_ADDR:%.*]] = alloca ptr addrspace(1), align 4 2964792564SMatt Arsenault// SPIR32-NEXT: [[I_ADDR:%.*]] = alloca i32, align 4 30bcad161dSJoshua Cranmer// SPIR32-NEXT: [[DEFAULT_QUEUE:%.*]] = alloca target("spirv.Queue"), align 4 3164792564SMatt Arsenault// SPIR32-NEXT: [[FLAGS:%.*]] = alloca i32, align 4 3264792564SMatt Arsenault// SPIR32-NEXT: [[NDRANGE:%.*]] = alloca [[STRUCT_NDRANGE_T:%.*]], align 4 3364792564SMatt Arsenault// SPIR32-NEXT: [[TMP:%.*]] = alloca [[STRUCT_NDRANGE_T]], align 4 3464792564SMatt Arsenault// SPIR32-NEXT: [[BLOCK:%.*]] = alloca <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, align 4 3564792564SMatt Arsenault// SPIR32-NEXT: store ptr addrspace(1) [[A]], ptr [[A_ADDR]], align 4 3664792564SMatt Arsenault// SPIR32-NEXT: store ptr addrspace(1) [[B]], ptr [[B_ADDR]], align 4 3764792564SMatt Arsenault// SPIR32-NEXT: store i32 [[I]], ptr [[I_ADDR]], align 4 3864792564SMatt Arsenault// SPIR32-NEXT: store i32 0, ptr [[FLAGS]], align 4 39bcad161dSJoshua Cranmer// SPIR32-NEXT: [[TMP0:%.*]] = load target("spirv.Queue"), ptr [[DEFAULT_QUEUE]], align 4 4064792564SMatt Arsenault// SPIR32-NEXT: [[TMP1:%.*]] = load i32, ptr [[FLAGS]], align 4 4164792564SMatt Arsenault// SPIR32-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP]], ptr align 4 [[NDRANGE]], i32 4, i1 false) 4294473f4dSHari Limaye// SPIR32-NEXT: [[BLOCK_SIZE:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr [[BLOCK]], i32 0, i32 0 4364792564SMatt Arsenault// SPIR32-NEXT: store i32 24, ptr [[BLOCK_SIZE]], align 4 4494473f4dSHari Limaye// SPIR32-NEXT: [[BLOCK_ALIGN:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr [[BLOCK]], i32 0, i32 1 4564792564SMatt Arsenault// SPIR32-NEXT: store i32 4, ptr [[BLOCK_ALIGN]], align 4 4694473f4dSHari Limaye// SPIR32-NEXT: [[BLOCK_INVOKE:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr [[BLOCK]], i32 0, i32 2 4764792564SMatt Arsenault// SPIR32-NEXT: store ptr addrspace(4) addrspacecast (ptr @__device_side_enqueue_block_invoke to ptr addrspace(4)), ptr [[BLOCK_INVOKE]], align 4 4894473f4dSHari Limaye// SPIR32-NEXT: [[BLOCK_CAPTURED:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr [[BLOCK]], i32 0, i32 3 4964792564SMatt Arsenault// SPIR32-NEXT: [[TMP2:%.*]] = load ptr addrspace(1), ptr [[A_ADDR]], align 4 5064792564SMatt Arsenault// SPIR32-NEXT: store ptr addrspace(1) [[TMP2]], ptr [[BLOCK_CAPTURED]], align 4 5194473f4dSHari Limaye// SPIR32-NEXT: [[BLOCK_CAPTURED1:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr [[BLOCK]], i32 0, i32 4 5264792564SMatt Arsenault// SPIR32-NEXT: [[TMP3:%.*]] = load i32, ptr [[I_ADDR]], align 4 5364792564SMatt Arsenault// SPIR32-NEXT: store i32 [[TMP3]], ptr [[BLOCK_CAPTURED1]], align 4 5494473f4dSHari Limaye// SPIR32-NEXT: [[BLOCK_CAPTURED2:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr [[BLOCK]], i32 0, i32 5 5564792564SMatt Arsenault// SPIR32-NEXT: [[TMP4:%.*]] = load ptr addrspace(1), ptr [[B_ADDR]], align 4 5664792564SMatt Arsenault// SPIR32-NEXT: store ptr addrspace(1) [[TMP4]], ptr [[BLOCK_CAPTURED2]], align 4 5764792564SMatt Arsenault// SPIR32-NEXT: [[TMP5:%.*]] = addrspacecast ptr [[BLOCK]] to ptr addrspace(4) 58*4b50ec43SShilei Tian// SPIR32-NEXT: [[TMP6:%.*]] = call spir_func i32 @__enqueue_kernel_basic(target("spirv.Queue") [[TMP0]], i32 [[TMP1]], ptr [[TMP]], ptr addrspace(4) addrspacecast (ptr @__device_side_enqueue_block_invoke_kernel to ptr addrspace(4)), ptr addrspace(4) [[TMP5]]) 5964792564SMatt Arsenault// SPIR32-NEXT: ret void 6064792564SMatt Arsenault// 6164792564SMatt Arsenault// 6264792564SMatt Arsenault// SPIR32: Function Attrs: convergent noinline nounwind optnone 6364792564SMatt Arsenault// SPIR32-LABEL: define {{[^@]+}}@__device_side_enqueue_block_invoke 6464792564SMatt Arsenault// SPIR32-SAME: (ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR:%.*]]) #[[ATTR2:[0-9]+]] { 6564792564SMatt Arsenault// SPIR32-NEXT: entry: 6664792564SMatt Arsenault// SPIR32-NEXT: [[DOTBLOCK_DESCRIPTOR_ADDR:%.*]] = alloca ptr addrspace(4), align 4 6764792564SMatt Arsenault// SPIR32-NEXT: [[BLOCK_ADDR:%.*]] = alloca ptr addrspace(4), align 4 6864792564SMatt Arsenault// SPIR32-NEXT: store ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR]], ptr [[DOTBLOCK_DESCRIPTOR_ADDR]], align 4 6964792564SMatt Arsenault// SPIR32-NEXT: store ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR]], ptr [[BLOCK_ADDR]], align 4 7094473f4dSHari Limaye// SPIR32-NEXT: [[BLOCK_CAPTURE_ADDR:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR]], i32 0, i32 5 7164792564SMatt Arsenault// SPIR32-NEXT: [[TMP0:%.*]] = load ptr addrspace(1), ptr addrspace(4) [[BLOCK_CAPTURE_ADDR]], align 4 7294473f4dSHari Limaye// SPIR32-NEXT: [[BLOCK_CAPTURE_ADDR1:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR]], i32 0, i32 4 7364792564SMatt Arsenault// SPIR32-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(4) [[BLOCK_CAPTURE_ADDR1]], align 4 7464792564SMatt Arsenault// SPIR32-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[TMP0]], i32 [[TMP1]] 7564792564SMatt Arsenault// SPIR32-NEXT: [[TMP2:%.*]] = load float, ptr addrspace(1) [[ARRAYIDX]], align 4 7664792564SMatt Arsenault// SPIR32-NEXT: [[TMP3:%.*]] = call float @llvm.fmuladd.f32(float 4.000000e+00, float [[TMP2]], float 1.000000e+00) 7794473f4dSHari Limaye// SPIR32-NEXT: [[BLOCK_CAPTURE_ADDR2:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR]], i32 0, i32 3 7864792564SMatt Arsenault// SPIR32-NEXT: [[TMP4:%.*]] = load ptr addrspace(1), ptr addrspace(4) [[BLOCK_CAPTURE_ADDR2]], align 4 7994473f4dSHari Limaye// SPIR32-NEXT: [[BLOCK_CAPTURE_ADDR3:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR]], i32 0, i32 4 8064792564SMatt Arsenault// SPIR32-NEXT: [[TMP5:%.*]] = load i32, ptr addrspace(4) [[BLOCK_CAPTURE_ADDR3]], align 4 8164792564SMatt Arsenault// SPIR32-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[TMP4]], i32 [[TMP5]] 8264792564SMatt Arsenault// SPIR32-NEXT: store float [[TMP3]], ptr addrspace(1) [[ARRAYIDX4]], align 4 8364792564SMatt Arsenault// SPIR32-NEXT: ret void 8464792564SMatt Arsenault// 8564792564SMatt Arsenault// 8664792564SMatt Arsenault// SPIR32: Function Attrs: convergent nounwind 8764792564SMatt Arsenault// SPIR32-LABEL: define {{[^@]+}}@__device_side_enqueue_block_invoke_kernel 8864792564SMatt Arsenault// SPIR32-SAME: (ptr addrspace(4) [[TMP0:%.*]]) #[[ATTR4:[0-9]+]] { 8964792564SMatt Arsenault// SPIR32-NEXT: entry: 9064792564SMatt Arsenault// SPIR32-NEXT: call spir_func void @__device_side_enqueue_block_invoke(ptr addrspace(4) [[TMP0]]) 9164792564SMatt Arsenault// SPIR32-NEXT: ret void 9264792564SMatt Arsenault// 9364792564SMatt Arsenault// 9464792564SMatt Arsenault// STRICTFP: Function Attrs: convergent noinline norecurse nounwind optnone strictfp 9564792564SMatt Arsenault// STRICTFP-LABEL: define {{[^@]+}}@device_side_enqueue 9694473f4dSHari Limaye// STRICTFP-SAME: (ptr addrspace(1) align 4 [[A:%.*]], ptr addrspace(1) align 4 [[B:%.*]], i32 [[I:%.*]]) #[[ATTR0:[0-9]+]] !kernel_arg_addr_space [[META2:![0-9]+]] !kernel_arg_access_qual [[META3:![0-9]+]] !kernel_arg_type [[META4:![0-9]+]] !kernel_arg_base_type [[META4]] !kernel_arg_type_qual [[META5:![0-9]+]] { 9764792564SMatt Arsenault// STRICTFP-NEXT: entry: 9864792564SMatt Arsenault// STRICTFP-NEXT: [[A_ADDR:%.*]] = alloca ptr addrspace(1), align 4 9964792564SMatt Arsenault// STRICTFP-NEXT: [[B_ADDR:%.*]] = alloca ptr addrspace(1), align 4 10064792564SMatt Arsenault// STRICTFP-NEXT: [[I_ADDR:%.*]] = alloca i32, align 4 101bcad161dSJoshua Cranmer// STRICTFP-NEXT: [[DEFAULT_QUEUE:%.*]] = alloca target("spirv.Queue"), align 4 10264792564SMatt Arsenault// STRICTFP-NEXT: [[FLAGS:%.*]] = alloca i32, align 4 10364792564SMatt Arsenault// STRICTFP-NEXT: [[NDRANGE:%.*]] = alloca [[STRUCT_NDRANGE_T:%.*]], align 4 10464792564SMatt Arsenault// STRICTFP-NEXT: [[TMP:%.*]] = alloca [[STRUCT_NDRANGE_T]], align 4 10564792564SMatt Arsenault// STRICTFP-NEXT: [[BLOCK:%.*]] = alloca <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, align 4 10664792564SMatt Arsenault// STRICTFP-NEXT: store ptr addrspace(1) [[A]], ptr [[A_ADDR]], align 4 10764792564SMatt Arsenault// STRICTFP-NEXT: store ptr addrspace(1) [[B]], ptr [[B_ADDR]], align 4 10864792564SMatt Arsenault// STRICTFP-NEXT: store i32 [[I]], ptr [[I_ADDR]], align 4 10964792564SMatt Arsenault// STRICTFP-NEXT: store i32 0, ptr [[FLAGS]], align 4 110bcad161dSJoshua Cranmer// STRICTFP-NEXT: [[TMP0:%.*]] = load target("spirv.Queue"), ptr [[DEFAULT_QUEUE]], align 4 11164792564SMatt Arsenault// STRICTFP-NEXT: [[TMP1:%.*]] = load i32, ptr [[FLAGS]], align 4 11264792564SMatt Arsenault// STRICTFP-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP]], ptr align 4 [[NDRANGE]], i32 4, i1 false) #[[ATTR5:[0-9]+]] 11394473f4dSHari Limaye// STRICTFP-NEXT: [[BLOCK_SIZE:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr [[BLOCK]], i32 0, i32 0 11464792564SMatt Arsenault// STRICTFP-NEXT: store i32 24, ptr [[BLOCK_SIZE]], align 4 11594473f4dSHari Limaye// STRICTFP-NEXT: [[BLOCK_ALIGN:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr [[BLOCK]], i32 0, i32 1 11664792564SMatt Arsenault// STRICTFP-NEXT: store i32 4, ptr [[BLOCK_ALIGN]], align 4 11794473f4dSHari Limaye// STRICTFP-NEXT: [[BLOCK_INVOKE:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr [[BLOCK]], i32 0, i32 2 11864792564SMatt Arsenault// STRICTFP-NEXT: store ptr addrspace(4) addrspacecast (ptr @__device_side_enqueue_block_invoke to ptr addrspace(4)), ptr [[BLOCK_INVOKE]], align 4 11994473f4dSHari Limaye// STRICTFP-NEXT: [[BLOCK_CAPTURED:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr [[BLOCK]], i32 0, i32 3 12064792564SMatt Arsenault// STRICTFP-NEXT: [[TMP2:%.*]] = load ptr addrspace(1), ptr [[A_ADDR]], align 4 12164792564SMatt Arsenault// STRICTFP-NEXT: store ptr addrspace(1) [[TMP2]], ptr [[BLOCK_CAPTURED]], align 4 12294473f4dSHari Limaye// STRICTFP-NEXT: [[BLOCK_CAPTURED1:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr [[BLOCK]], i32 0, i32 4 12364792564SMatt Arsenault// STRICTFP-NEXT: [[TMP3:%.*]] = load i32, ptr [[I_ADDR]], align 4 12464792564SMatt Arsenault// STRICTFP-NEXT: store i32 [[TMP3]], ptr [[BLOCK_CAPTURED1]], align 4 12594473f4dSHari Limaye// STRICTFP-NEXT: [[BLOCK_CAPTURED2:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr [[BLOCK]], i32 0, i32 5 12664792564SMatt Arsenault// STRICTFP-NEXT: [[TMP4:%.*]] = load ptr addrspace(1), ptr [[B_ADDR]], align 4 12764792564SMatt Arsenault// STRICTFP-NEXT: store ptr addrspace(1) [[TMP4]], ptr [[BLOCK_CAPTURED2]], align 4 12864792564SMatt Arsenault// STRICTFP-NEXT: [[TMP5:%.*]] = addrspacecast ptr [[BLOCK]] to ptr addrspace(4) 129*4b50ec43SShilei Tian// STRICTFP-NEXT: [[TMP6:%.*]] = call spir_func i32 @__enqueue_kernel_basic(target("spirv.Queue") [[TMP0]], i32 [[TMP1]], ptr [[TMP]], ptr addrspace(4) addrspacecast (ptr @__device_side_enqueue_block_invoke_kernel to ptr addrspace(4)), ptr addrspace(4) [[TMP5]]) #[[ATTR5]] 13064792564SMatt Arsenault// STRICTFP-NEXT: ret void 13164792564SMatt Arsenault// 13264792564SMatt Arsenault// 13364792564SMatt Arsenault// STRICTFP: Function Attrs: convergent noinline nounwind optnone strictfp 13464792564SMatt Arsenault// STRICTFP-LABEL: define {{[^@]+}}@__device_side_enqueue_block_invoke 13564792564SMatt Arsenault// STRICTFP-SAME: (ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR:%.*]]) #[[ATTR2:[0-9]+]] { 13664792564SMatt Arsenault// STRICTFP-NEXT: entry: 13764792564SMatt Arsenault// STRICTFP-NEXT: [[DOTBLOCK_DESCRIPTOR_ADDR:%.*]] = alloca ptr addrspace(4), align 4 13864792564SMatt Arsenault// STRICTFP-NEXT: [[BLOCK_ADDR:%.*]] = alloca ptr addrspace(4), align 4 13964792564SMatt Arsenault// STRICTFP-NEXT: store ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR]], ptr [[DOTBLOCK_DESCRIPTOR_ADDR]], align 4 14064792564SMatt Arsenault// STRICTFP-NEXT: store ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR]], ptr [[BLOCK_ADDR]], align 4 14194473f4dSHari Limaye// STRICTFP-NEXT: [[BLOCK_CAPTURE_ADDR:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR]], i32 0, i32 5 14264792564SMatt Arsenault// STRICTFP-NEXT: [[TMP0:%.*]] = load ptr addrspace(1), ptr addrspace(4) [[BLOCK_CAPTURE_ADDR]], align 4 14394473f4dSHari Limaye// STRICTFP-NEXT: [[BLOCK_CAPTURE_ADDR1:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR]], i32 0, i32 4 14464792564SMatt Arsenault// STRICTFP-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(4) [[BLOCK_CAPTURE_ADDR1]], align 4 14564792564SMatt Arsenault// STRICTFP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[TMP0]], i32 [[TMP1]] 14664792564SMatt Arsenault// STRICTFP-NEXT: [[TMP2:%.*]] = load float, ptr addrspace(1) [[ARRAYIDX]], align 4 14764792564SMatt Arsenault// STRICTFP-NEXT: [[TMP3:%.*]] = call float @llvm.experimental.constrained.fmuladd.f32(float 4.000000e+00, float [[TMP2]], float 1.000000e+00, metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR5]] 14894473f4dSHari Limaye// STRICTFP-NEXT: [[BLOCK_CAPTURE_ADDR2:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR]], i32 0, i32 3 14964792564SMatt Arsenault// STRICTFP-NEXT: [[TMP4:%.*]] = load ptr addrspace(1), ptr addrspace(4) [[BLOCK_CAPTURE_ADDR2]], align 4 15094473f4dSHari Limaye// STRICTFP-NEXT: [[BLOCK_CAPTURE_ADDR3:%.*]] = getelementptr inbounds nuw <{ i32, i32, ptr addrspace(4), ptr addrspace(1), i32, ptr addrspace(1) }>, ptr addrspace(4) [[DOTBLOCK_DESCRIPTOR]], i32 0, i32 4 15164792564SMatt Arsenault// STRICTFP-NEXT: [[TMP5:%.*]] = load i32, ptr addrspace(4) [[BLOCK_CAPTURE_ADDR3]], align 4 15264792564SMatt Arsenault// STRICTFP-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[TMP4]], i32 [[TMP5]] 15364792564SMatt Arsenault// STRICTFP-NEXT: store float [[TMP3]], ptr addrspace(1) [[ARRAYIDX4]], align 4 15464792564SMatt Arsenault// STRICTFP-NEXT: ret void 15564792564SMatt Arsenault// 15664792564SMatt Arsenault// 15764792564SMatt Arsenault// STRICTFP: Function Attrs: convergent nounwind 15864792564SMatt Arsenault// STRICTFP-LABEL: define {{[^@]+}}@__device_side_enqueue_block_invoke_kernel 15964792564SMatt Arsenault// STRICTFP-SAME: (ptr addrspace(4) [[TMP0:%.*]]) #[[ATTR4:[0-9]+]] { 16064792564SMatt Arsenault// STRICTFP-NEXT: entry: 16164792564SMatt Arsenault// STRICTFP-NEXT: call spir_func void @__device_side_enqueue_block_invoke(ptr addrspace(4) [[TMP0]]) #[[ATTR5]] 16264792564SMatt Arsenault// STRICTFP-NEXT: ret void 16364792564SMatt Arsenault// 16464792564SMatt Arsenault//. 16575b79019SMatt Arsenault// SPIR32: attributes #[[ATTR0]] = { convergent noinline norecurse nounwind optnone "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "uniform-work-group-size"="true" } 16675b79019SMatt Arsenault// SPIR32: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } 16775b79019SMatt Arsenault// SPIR32: attributes #[[ATTR2]] = { convergent noinline nounwind optnone "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } 16875b79019SMatt Arsenault// SPIR32: attributes #[[ATTR3:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } 16975b79019SMatt Arsenault// SPIR32: attributes #[[ATTR4]] = { convergent nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } 17064792564SMatt Arsenault//. 17142d4c85cSMatt Arsenault// STRICTFP: attributes #[[ATTR0]] = { convergent noinline norecurse nounwind optnone strictfp "stack-protector-buffer-size"="8" "uniform-work-group-size"="false" } 17275b79019SMatt Arsenault// STRICTFP: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } 17375b79019SMatt Arsenault// STRICTFP: attributes #[[ATTR2]] = { convergent noinline nounwind optnone strictfp "stack-protector-buffer-size"="8" } 17491f886a4SKevin P. Neal// STRICTFP: attributes #[[ATTR3:[0-9]+]] = { nocallback nofree nosync nounwind strictfp willreturn memory(inaccessiblemem: readwrite) } 17575b79019SMatt Arsenault// STRICTFP: attributes #[[ATTR4]] = { convergent nounwind "stack-protector-buffer-size"="8" } 17675b79019SMatt Arsenault// STRICTFP: attributes #[[ATTR5]] = { strictfp } 17764792564SMatt Arsenault//. 17875b79019SMatt Arsenault// SPIR32: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4} 17975b79019SMatt Arsenault// SPIR32: [[META1:![0-9]+]] = !{i32 2, i32 0} 18094473f4dSHari Limaye// SPIR32: [[META2]] = !{i32 1, i32 1, i32 0} 18194473f4dSHari Limaye// SPIR32: [[META3]] = !{!"none", !"none", !"none"} 18294473f4dSHari Limaye// SPIR32: [[META4]] = !{!"float*", !"float*", !"int"} 18394473f4dSHari Limaye// SPIR32: [[META5]] = !{!"", !"", !""} 18464792564SMatt Arsenault//. 18575b79019SMatt Arsenault// STRICTFP: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4} 18675b79019SMatt Arsenault// STRICTFP: [[META1:![0-9]+]] = !{i32 2, i32 0} 18794473f4dSHari Limaye// STRICTFP: [[META2]] = !{i32 1, i32 1, i32 0} 18894473f4dSHari Limaye// STRICTFP: [[META3]] = !{!"none", !"none", !"none"} 18994473f4dSHari Limaye// STRICTFP: [[META4]] = !{!"float*", !"float*", !"int"} 19094473f4dSHari Limaye// STRICTFP: [[META5]] = !{!"", !"", !""} 19164792564SMatt Arsenault//. 192