module &module:1:0:$full:$large:$default; /* Tests for different variable scopes and address spaces. */ /* { dg-do compile } */ /* { dg-options "-fdump-tree-gimple -fdump-tree-original" } */ prog align(256) private_u32 &prog_private; private_u32 &mod_private; prog group_u32 &prog_group; group_u32 &mod_group; prog global_u32 &prog_global; global_u32 &mod_global; decl prog global_u32 &prog_global_host_def; prog readonly_u32 &prog_readonly; readonly_u32 &mod_readonly; prog function &subfunction(arg_u32 %return_value)(arg_u32 %arg) { private_u32 %func_private; group_u32 %func_group; align(256) global_u32 %func_global; readonly_u32 %func_readonly; ld_private_u32 $s200, [%func_private]; st_private_u32 $s200, [&prog_private]; /* { dg-final { scan-tree-dump "__group_base_addr \\\+ \\\(0 \\\+" "original" } } */ ld_group_u32 $s203, [%func_group]; /* { dg-final { scan-tree-dump "__group_base_addr \\\+ 0" "original" } } */ st_group_u32 $s203, [&prog_group]; ld_global_u32 $s204, [%func_global]; st_global_u32 $s204, [&prog_global]; ld_readonly_u32 $s205, [%func_readonly]; st_global_u32 $s205, [%func_global]; st_arg_u32 $s2, [%return_value]; ret; }; prog kernel &kernel(kernarg_u64 %input_ptr, kernarg_u64 %output_ptr) { private_u32 %kern_private; group_u32 %kern_group; global_u32 %kern_global; readonly_u32 %kern_readonly; ld_kernarg_u64 $d0, [%input_ptr]; ld_global_u32 $s0, [$d0]; ld_private_u32 $s2, [&prog_private]; st_private_u32 $s2, [%kern_private]; ld_private_u32 $s3, [&mod_private]; st_private_u32 $s3, [&prog_private]; ld_group_u32 $s4, [&prog_group]; st_group_u32 $s4, [%kern_group]; ld_group_u32 $s5, [&mod_group]; st_group_u32 $s5, [&prog_group]; ld_global_u32 $s6, [&prog_global]; st_global_u32 $s6, [%kern_global]; ld_global_u32 $s7, [&mod_global]; st_global_u32 $s7, [&prog_global]; ld_readonly_u32 $s8, [&prog_readonly]; st_global_u32 $s8, [%kern_global]; ld_readonly_u32 $s9, [&mod_readonly]; st_global_u32 $s9, [&prog_global]; ld_readonly_u32 $s10, [%kern_readonly]; st_global_u32 $s10, [%kern_global]; ld_readonly_u32 $s11, [%kern_readonly]; st_global_u32 $s11, [&prog_global_host_def]; { arg_u32 %arg; arg_u32 %return_value; st_arg_u32 $s1, [%arg]; call &subfunction(%return_value)(%arg); ld_arg_u32 $s1, [%return_value]; } ld_kernarg_u64 $d1, [%output_ptr]; st_global_u32 $s1, [$d0]; }; /* Private variable offsets assigned in the order of their appearance */ /* prog_private @0 (align 256) -> until 254 to ensure all WIs mod_private @256 have their chunks aligned func_private @260 kern_private @264 */ /* Group variable offsets assigned in the order of their appearance */ /* prog_group @0 (2) mod_group @4 (4) func_group @8 (1) kern_group @12 (3) */ /* The "mangling" of the global and readonly vars. */ /* { dg-final { scan-tree-dump "\[ \]*prog_global = s204;" "gimple" } } */ /* { dg-final { scan-tree-dump "\.module.mod_global;" "gimple" } } */ /* Host defined variables need indirect access as the address is known only at run time. */ /* { dg-final { scan-tree-dump "\\\*\\\__phsa.host_def.prog_global_host_def.\[0-9\]+_\[0-9\]+ = s11;" "gimple" } } */ /* { dg-final { scan-tree-dump "\.subfunction.func_global;" "gimple" } } */ /* { dg-final { scan-tree-dump "\.subfunction.func_readonly;" "gimple" } } */ /* { dg-final { scan-tree-dump "kernel.kern_global" "gimple" } } */ /* { dg-final { scan-tree-dump "kernel.kern_readonly" "gimple" } } */