nir/print: Rework NIR output
This is the implementation of the proposal in #9153 (closed) taking into account feedback from the replies. Here's where we stand with updates in bold:
- Use
%
prefix instead ofssa_
. - Use
@
prefix instead ofintrinsic
. Uniquifying variables get#
. -
Use^
prefix instead ofblock_
.UseUseBB
prefix instead ofblock_
.b
prefix. - Use
NxM
instead ofvecN M
to describe the size of SSA values. Omit the first part if N==1. Put bits before num elements. -
Change intrinsic indexes to be inside brackets and add one extra space of clearance.Dropped. -
Also use brackets for properties of deref_cast.Using parenthesis for deref_cast properties. -
Merge block, preds and succs into a single line.Merge block and preds in a single line. Also merge succs when block is empty. - Align instructions in a block along the
=
sign. - Use 4 spaces for indentation.
-
NEW: Use
//
comments, per Ian's suggestion. -
NEW: For non empty blocks, align
// preds
and// succs
with the instructions. - NEW: Put con/div annotations first.
See also: !23562 (merged) that improves and makes NIR_DEBUG=print_consts
the new default.
Comparison of output from crucible func.compute.derivative.group-quads-multiple-subgroups
.
Before
impl main {
decl_var INTERP_MODE_NONE uint index
decl_var INTERP_MODE_NONE uvec3 size
decl_var INTERP_MODE_NONE uvec3 id
decl_var INTERP_MODE_NONE bool phi
decl_var INTERP_MODE_NONE bool phi@0
block block_0:
/* preds: */
vec1 32 ssa_106 = load_const (0x00000001 = 0.000000)
vec3 32 ssa_16 = load_const (0x00000008, 0x00000006, 0x00000005) = (0.000000, 0.000000, 0.000000)
vec1 32 ssa_0 = deref_var &gl_LocalInvocationIndex (system uint)
vec1 32 ssa_1 = intrinsic load_deref (ssa_0) (access=0)
vec1 32 ssa_2 = deref_var &index (function_temp uint)
intrinsic store_deref (ssa_2, ssa_1) (wrmask=x, access=0)
vec1 32 ssa_3 = deref_var &index (function_temp uint)
vec1 32 ssa_4 = intrinsic load_deref (ssa_3) (access=0)
vec1 32 ssa_5 = deref_var &index (function_temp uint)
vec1 32 ssa_6 = intrinsic load_deref (ssa_5) (access=0)
vec1 32 ssa_7 = u2f32 ssa_6
vec1 32 ssa_8 = fddy_fine ssa_7
vec1 32 ssa_9 = f2u32 ssa_8
vec1 32 ssa_10 = load_const (0x00000000 = 0.000000)
vec4 32 ssa_11 = intrinsic vulkan_resource_index (ssa_10) (desc_set=0, binding=0, desc_type=SSBO)
vec4 32 ssa_12 = intrinsic load_vulkan_descriptor (ssa_11) (desc_type=SSBO)
vec4 32 ssa_13 = deref_cast (Storage *)ssa_12 (ssbo Storage) /* ptr_stride=0, align_mul=4, align_offset=0 */
vec4 32 ssa_14 = deref_struct &ssa_13->dy (ssbo uint[]) /* &((Storage *)ssa_12)->dy */
vec4 32 ssa_15 = deref_array &(*ssa_14)[ssa_4] (ssbo uint) /* &((Storage *)ssa_12)->dy[ssa_4] */
intrinsic store_deref (ssa_15, ssa_9) (wrmask=x, access=0)
vec1 32 ssa_17 = deref_var &size (function_temp uvec3)
intrinsic store_deref (ssa_17, ssa_16) (wrmask=xyz, access=0)
vec1 32 ssa_18 = deref_var &gl_LocalInvocationID (system uvec3)
vec3 32 ssa_19 = intrinsic load_deref (ssa_18) (access=0)
vec1 32 ssa_20 = deref_var &id (function_temp uvec3)
intrinsic store_deref (ssa_20, ssa_19) (wrmask=xyz, access=0)
vec1 32 ssa_21 = deref_var &id (function_temp uvec3)
vec3 32 ssa_24 = intrinsic load_deref (ssa_21) (access=0)
vec1 32 ssa_26 = deref_var &index (function_temp uint)
vec1 32 ssa_27 = intrinsic load_deref (ssa_26) (access=0)
vec1 32 ssa_28 = deref_var &size (function_temp uvec3)
vec3 32 ssa_31 = intrinsic load_deref (ssa_28) (access=0)
vec1 32 ssa_33 = umod ssa_27, ssa_31.x
vec1 1 ssa_34 = ine ssa_24.x, ssa_33
vec1 1 ssa_35 = inot ssa_34
vec1 32 ssa_114 = deref_var &phi (function_temp bool)
intrinsic store_deref (ssa_114, ssa_34) (wrmask=x, access=0)
/* succs: block_1 block_2 */
if ssa_35 {
block block_1:
/* preds: block_0 */
vec1 32 ssa_36 = deref_var &id (function_temp uvec3)
vec3 32 ssa_39 = intrinsic load_deref (ssa_36) (access=0)
vec1 32 ssa_41 = deref_var &index (function_temp uint)
vec1 32 ssa_42 = intrinsic load_deref (ssa_41) (access=0)
vec1 32 ssa_43 = deref_var &size (function_temp uvec3)
vec3 32 ssa_46 = intrinsic load_deref (ssa_43) (access=0)
vec1 32 ssa_48 = udiv ssa_42, ssa_46.x
vec1 32 ssa_49 = deref_var &size (function_temp uvec3)
vec3 32 ssa_52 = intrinsic load_deref (ssa_49) (access=0)
vec1 32 ssa_54 = umod ssa_48, ssa_52.y
vec1 1 ssa_55 = ine ssa_39.y, ssa_54
vec1 32 ssa_115 = deref_var &phi (function_temp bool)
intrinsic store_deref (ssa_115, ssa_55) (wrmask=x, access=0)
/* succs: block_3 */
} else {
block block_2:
/* preds: block_0 */
/* succs: block_3 */
}
block block_3:
/* preds: block_1 block_2 */
vec1 32 ssa_56 = deref_var &phi (function_temp bool)
vec1 1 ssa_57 = intrinsic load_deref (ssa_56) (access=0)
vec1 1 ssa_58 = inot ssa_57
vec1 32 ssa_116 = deref_var &phi@0 (function_temp bool)
intrinsic store_deref (ssa_116, ssa_57) (wrmask=x, access=0)
/* succs: block_4 block_5 */
if ssa_58 {
block block_4:
/* preds: block_3 */
vec1 32 ssa_59 = deref_var &id (function_temp uvec3)
vec3 32 ssa_62 = intrinsic load_deref (ssa_59) (access=0)
vec1 32 ssa_64 = deref_var &index (function_temp uint)
vec1 32 ssa_65 = intrinsic load_deref (ssa_64) (access=0)
vec1 32 ssa_66 = deref_var &size (function_temp uvec3)
vec3 32 ssa_69 = intrinsic load_deref (ssa_66) (access=0)
vec1 32 ssa_71 = deref_var &size (function_temp uvec3)
vec3 32 ssa_74 = intrinsic load_deref (ssa_71) (access=0)
vec1 32 ssa_76 = imul ssa_69.x, ssa_74.y
vec1 32 ssa_77 = udiv ssa_65, ssa_76
vec1 32 ssa_78 = deref_var &size (function_temp uvec3)
vec3 32 ssa_81 = intrinsic load_deref (ssa_78) (access=0)
vec1 32 ssa_83 = umod ssa_77, ssa_81.z
vec1 1 ssa_84 = ine ssa_62.z, ssa_83
vec1 32 ssa_117 = deref_var &phi@0 (function_temp bool)
intrinsic store_deref (ssa_117, ssa_84) (wrmask=x, access=0)
/* succs: block_6 */
} else {
block block_5:
/* preds: block_3 */
/* succs: block_6 */
}
block block_6:
/* preds: block_4 block_5 */
vec1 32 ssa_85 = deref_var &phi@0 (function_temp bool)
vec1 1 ssa_86 = intrinsic load_deref (ssa_85) (access=0)
/* succs: block_7 block_8 */
if ssa_86 {
block block_7:
/* preds: block_6 */
vec1 32 ssa_87 = deref_var &index (function_temp uint)
vec1 32 ssa_88 = intrinsic load_deref (ssa_87) (access=0)
vec1 32 ssa_89 = deref_var &size (function_temp uvec3)
vec3 32 ssa_92 = intrinsic load_deref (ssa_89) (access=0)
vec1 32 ssa_94 = deref_var &size (function_temp uvec3)
vec3 32 ssa_97 = intrinsic load_deref (ssa_94) (access=0)
vec1 32 ssa_99 = imul ssa_92.x, ssa_97.y
vec1 32 ssa_100 = deref_var &size (function_temp uvec3)
vec3 32 ssa_103 = intrinsic load_deref (ssa_100) (access=0)
vec1 32 ssa_105 = imul ssa_99, ssa_103.z
vec1 32 ssa_107 = iadd ssa_105, ssa_106
vec1 32 ssa_108 = load_const (0x00000000 = 0.000000)
vec4 32 ssa_109 = intrinsic vulkan_resource_index (ssa_108) (desc_set=0, binding=0, desc_type=SSBO)
vec4 32 ssa_110 = intrinsic load_vulkan_descriptor (ssa_109) (desc_type=SSBO)
vec4 32 ssa_111 = deref_cast (Storage *)ssa_110 (ssbo Storage) /* ptr_stride=0, align_mul=4, align_offset=0 */
vec4 32 ssa_112 = deref_struct &ssa_111->dy (ssbo uint[]) /* &((Storage *)ssa_110)->dy */
vec4 32 ssa_113 = deref_array &(*ssa_112)[ssa_88] (ssbo uint) /* &((Storage *)ssa_110)->dy[ssa_88] */
intrinsic store_deref (ssa_113, ssa_107) (wrmask=x, access=0)
/* succs: block_9 */
} else {
block block_8:
/* preds: block_6 */
/* succs: block_9 */
}
block block_9:
/* preds: block_7 block_8 */
/* succs: block_10 */
block block_10:
}
After
impl main {
decl_var INTERP_MODE_NONE uint index
decl_var INTERP_MODE_NONE uvec3 size
decl_var INTERP_MODE_NONE uvec3 id
decl_var INTERP_MODE_NONE bool phi
decl_var INTERP_MODE_NONE bool phi#0
block BB0:
// preds:
32 %106 = load_const (0x00000001 = 0.000000)
3x32 %16 = load_const (0x00000008, 0x00000006, 0x00000005) = (0.000000, 0.000000, 0.000000)
32 %0 = deref_var &gl_LocalInvocationIndex (system uint)
32 %1 = @load_deref (%0) {access=0}
32 %2 = deref_var &index (function_temp uint)
@store_deref (%2, %1) {wrmask=x, access=0}
32 %3 = deref_var &index (function_temp uint)
32 %4 = @load_deref (%3) {access=0}
32 %5 = deref_var &index (function_temp uint)
32 %6 = @load_deref (%5) {access=0}
32 %7 = u2f32 %6
32 %8 = fddy_fine %7
32 %9 = f2u32 %8
32 %10 = load_const (0x00000000 = 0.000000)
4x32 %11 = @vulkan_resource_index (%10) {desc_set=0, binding=0, desc_type=SSBO}
4x32 %12 = @load_vulkan_descriptor (%11) {desc_type=SSBO}
4x32 %13 = deref_cast (Storage *)%12 (ssbo Storage) {ptr_stride=0, align_mul=4, align_offset=0}
4x32 %14 = deref_struct &%13->dy (ssbo uint[]) // &((Storage *)%12)->dy
4x32 %15 = deref_array &(*%14)[%4] (ssbo uint) // &((Storage *)%12)->dy[%4]
@store_deref (%15, %9) {wrmask=x, access=0}
32 %17 = deref_var &size (function_temp uvec3)
@store_deref (%17, %16) {wrmask=xyz, access=0}
32 %18 = deref_var &gl_LocalInvocationID (system uvec3)
3x32 %19 = @load_deref (%18) {access=0}
32 %20 = deref_var &id (function_temp uvec3)
@store_deref (%20, %19) {wrmask=xyz, access=0}
32 %21 = deref_var &id (function_temp uvec3)
3x32 %24 = @load_deref (%21) {access=0}
32 %26 = deref_var &index (function_temp uint)
32 %27 = @load_deref (%26) {access=0}
32 %28 = deref_var &size (function_temp uvec3)
3x32 %31 = @load_deref (%28) {access=0}
32 %33 = umod %27, %31.x
1 %34 = ine %24.x, %33
1 %35 = inot %34
32 %114 = deref_var &phi (function_temp bool)
@store_deref (%114, %34) {wrmask=x, access=0}
// succs: BB1 BB2
if %35 {
block BB1:
// preds: BB0
32 %36 = deref_var &id (function_temp uvec3)
3x32 %39 = @load_deref (%36) {access=0}
32 %41 = deref_var &index (function_temp uint)
32 %42 = @load_deref (%41) {access=0}
32 %43 = deref_var &size (function_temp uvec3)
3x32 %46 = @load_deref (%43) {access=0}
32 %48 = udiv %42, %46.x
32 %49 = deref_var &size (function_temp uvec3)
3x32 %52 = @load_deref (%49) {access=0}
32 %54 = umod %48, %52.y
1 %55 = ine %39.y, %54
32 %115 = deref_var &phi (function_temp bool)
@store_deref (%115, %55) {wrmask=x, access=0}
// succs: BB3
} else {
block BB2:
// preds: BB0
// succs: BB3
}
block BB3:
// preds: BB1 BB2
32 %56 = deref_var &phi (function_temp bool)
1 %57 = @load_deref (%56) {access=0}
1 %58 = inot %57
32 %116 = deref_var &phi#0 (function_temp bool)
@store_deref (%116, %57) {wrmask=x, access=0}
// succs: BB4 BB5
if %58 {
block BB4:
// preds: BB3
32 %59 = deref_var &id (function_temp uvec3)
3x32 %62 = @load_deref (%59) {access=0}
32 %64 = deref_var &index (function_temp uint)
32 %65 = @load_deref (%64) {access=0}
32 %66 = deref_var &size (function_temp uvec3)
3x32 %69 = @load_deref (%66) {access=0}
32 %71 = deref_var &size (function_temp uvec3)
3x32 %74 = @load_deref (%71) {access=0}
32 %76 = imul %69.x, %74.y
32 %77 = udiv %65, %76
32 %78 = deref_var &size (function_temp uvec3)
3x32 %81 = @load_deref (%78) {access=0}
32 %83 = umod %77, %81.z
1 %84 = ine %62.z, %83
32 %117 = deref_var &phi#0 (function_temp bool)
@store_deref (%117, %84) {wrmask=x, access=0}
// succs: BB6
} else {
block BB5:
// preds: BB3
// succs: BB6
}
block BB6:
// preds: BB4 BB5
32 %85 = deref_var &phi#0 (function_temp bool)
1 %86 = @load_deref (%85) {access=0}
// succs: BB7 BB8
if %86 {
block BB7:
// preds: BB6
32 %87 = deref_var &index (function_temp uint)
32 %88 = @load_deref (%87) {access=0}
32 %89 = deref_var &size (function_temp uvec3)
3x32 %92 = @load_deref (%89) {access=0}
32 %94 = deref_var &size (function_temp uvec3)
3x32 %97 = @load_deref (%94) {access=0}
32 %99 = imul %92.x, %97.y
32 %100 = deref_var &size (function_temp uvec3)
3x32 %103 = @load_deref (%100) {access=0}
32 %105 = imul %99, %103.z
32 %107 = iadd %105, %106
32 %108 = load_const (0x00000000 = 0.000000)
4x32 %109 = @vulkan_resource_index (%108) {desc_set=0, binding=0, desc_type=SSBO}
4x32 %110 = @load_vulkan_descriptor (%109) {desc_type=SSBO}
4x32 %111 = deref_cast (Storage *)%110 (ssbo Storage) {ptr_stride=0, align_mul=4, align_offset=0}
4x32 %112 = deref_struct &%111->dy (ssbo uint[]) // &((Storage *)%110)->dy
4x32 %113 = deref_array &(*%112)[%88] (ssbo uint) // &((Storage *)%110)->dy[%88]
@store_deref (%113, %107) {wrmask=x, access=0}
// succs: BB9
} else {
block BB8:
// preds: BB6
// succs: BB9
}
block BB9:
// preds: BB7 BB8
// succs: BB10
block BB10:
}
After + drop-brackets + empty-block-oneline + preds-with-block-name
impl main {
decl_var INTERP_MODE_NONE uint index
decl_var INTERP_MODE_NONE uvec3 size
decl_var INTERP_MODE_NONE uvec3 id
decl_var INTERP_MODE_NONE bool phi
decl_var INTERP_MODE_NONE bool phi#0
block BB0: // preds:
32 %106 = load_const (0x00000001 = 0.000000)
3x32 %16 = load_const (0x00000008, 0x00000006, 0x00000005) = (0.000000, 0.000000, 0.000000)
32 %0 = deref_var &gl_LocalInvocationIndex (system uint)
32 %1 = @load_deref (%0) (access=0)
32 %2 = deref_var &index (function_temp uint)
@store_deref (%2, %1) (wrmask=x, access=0)
32 %3 = deref_var &index (function_temp uint)
32 %4 = @load_deref (%3) (access=0)
32 %5 = deref_var &index (function_temp uint)
32 %6 = @load_deref (%5) (access=0)
32 %7 = u2f32 %6
32 %8 = fddy_fine %7
32 %9 = f2u32 %8
32 %10 = load_const (0x00000000 = 0.000000)
4x32 %11 = @vulkan_resource_index (%10) (desc_set=0, binding=0, desc_type=SSBO)
4x32 %12 = @load_vulkan_descriptor (%11) (desc_type=SSBO)
4x32 %13 = deref_cast (Storage *)%12 (ssbo Storage) (ptr_stride=0, align_mul=4, align_offset=0)
4x32 %14 = deref_struct &%13->dy (ssbo uint[]) // &((Storage *)%12)->dy
4x32 %15 = deref_array &(*%14)[%4] (ssbo uint) // &((Storage *)%12)->dy[%4]
@store_deref (%15, %9) (wrmask=x, access=0)
32 %17 = deref_var &size (function_temp uvec3)
@store_deref (%17, %16) (wrmask=xyz, access=0)
32 %18 = deref_var &gl_LocalInvocationID (system uvec3)
3x32 %19 = @load_deref (%18) (access=0)
32 %20 = deref_var &id (function_temp uvec3)
@store_deref (%20, %19) (wrmask=xyz, access=0)
32 %21 = deref_var &id (function_temp uvec3)
3x32 %24 = @load_deref (%21) (access=0)
32 %26 = deref_var &index (function_temp uint)
32 %27 = @load_deref (%26) (access=0)
32 %28 = deref_var &size (function_temp uvec3)
3x32 %31 = @load_deref (%28) (access=0)
32 %33 = umod %27, %31.x
1 %34 = ine %24.x, %33
1 %35 = inot %34
32 %114 = deref_var &phi (function_temp bool)
@store_deref (%114, %34) (wrmask=x, access=0)
// succs: BB1 BB2
if %35 {
block BB1: // preds: BB0
32 %36 = deref_var &id (function_temp uvec3)
3x32 %39 = @load_deref (%36) (access=0)
32 %41 = deref_var &index (function_temp uint)
32 %42 = @load_deref (%41) (access=0)
32 %43 = deref_var &size (function_temp uvec3)
3x32 %46 = @load_deref (%43) (access=0)
32 %48 = udiv %42, %46.x
32 %49 = deref_var &size (function_temp uvec3)
3x32 %52 = @load_deref (%49) (access=0)
32 %54 = umod %48, %52.y
1 %55 = ine %39.y, %54
32 %115 = deref_var &phi (function_temp bool)
@store_deref (%115, %55) (wrmask=x, access=0)
// succs: BB3
} else {
block BB2: // preds: BB0, succs: BB3
}
block BB3: // preds: BB1 BB2
32 %56 = deref_var &phi (function_temp bool)
1 %57 = @load_deref (%56) (access=0)
1 %58 = inot %57
32 %116 = deref_var &phi#0 (function_temp bool)
@store_deref (%116, %57) (wrmask=x, access=0)
// succs: BB4 BB5
if %58 {
block BB4: // preds: BB3
32 %59 = deref_var &id (function_temp uvec3)
3x32 %62 = @load_deref (%59) (access=0)
32 %64 = deref_var &index (function_temp uint)
32 %65 = @load_deref (%64) (access=0)
32 %66 = deref_var &size (function_temp uvec3)
3x32 %69 = @load_deref (%66) (access=0)
32 %71 = deref_var &size (function_temp uvec3)
3x32 %74 = @load_deref (%71) (access=0)
32 %76 = imul %69.x, %74.y
32 %77 = udiv %65, %76
32 %78 = deref_var &size (function_temp uvec3)
3x32 %81 = @load_deref (%78) (access=0)
32 %83 = umod %77, %81.z
1 %84 = ine %62.z, %83
32 %117 = deref_var &phi#0 (function_temp bool)
@store_deref (%117, %84) (wrmask=x, access=0)
// succs: BB6
} else {
block BB5: // preds: BB3, succs: BB6
}
block BB6: // preds: BB4 BB5
32 %85 = deref_var &phi#0 (function_temp bool)
1 %86 = @load_deref (%85) (access=0)
// succs: BB7 BB8
if %86 {
block BB7: // preds: BB6
32 %87 = deref_var &index (function_temp uint)
32 %88 = @load_deref (%87) (access=0)
32 %89 = deref_var &size (function_temp uvec3)
3x32 %92 = @load_deref (%89) (access=0)
32 %94 = deref_var &size (function_temp uvec3)
3x32 %97 = @load_deref (%94) (access=0)
32 %99 = imul %92.x, %97.y
32 %100 = deref_var &size (function_temp uvec3)
3x32 %103 = @load_deref (%100) (access=0)
32 %105 = imul %99, %103.z
32 %107 = iadd %105, %106
32 %108 = load_const (0x00000000 = 0.000000)
4x32 %109 = @vulkan_resource_index (%108) (desc_set=0, binding=0, desc_type=SSBO)
4x32 %110 = @load_vulkan_descriptor (%109) (desc_type=SSBO)
4x32 %111 = deref_cast (Storage *)%110 (ssbo Storage) (ptr_stride=0, align_mul=4, align_offset=0)
4x32 %112 = deref_struct &%111->dy (ssbo uint[]) // &((Storage *)%110)->dy
4x32 %113 = deref_array &(*%112)[%88] (ssbo uint) // &((Storage *)%110)->dy[%88]
@store_deref (%113, %107) (wrmask=x, access=0)
// succs: BB9
} else {
block BB8: // preds: BB6, succs: BB9
}
block BB9: // preds: BB7 BB8, succs: BB10
block BB10:
}
**LATEST**: All the above + blocks with `b` + align preds/succs + flip and realign ssa sizes
impl main {
decl_var INTERP_MODE_NONE uint index
decl_var INTERP_MODE_NONE uvec3 size
decl_var INTERP_MODE_NONE uvec3 id
decl_var INTERP_MODE_NONE bool phi
decl_var INTERP_MODE_NONE bool phi#0
block b0: // preds:
32 %106 = load_const (0x00000001 = 0.000000)
32x3 %16 = load_const (0x00000008, 0x00000006, 0x00000005) = (0.000000, 0.000000, 0.000000)
32 %0 = deref_var &gl_LocalInvocationIndex (system uint)
32 %1 = @load_deref (%0) (access=0)
32 %2 = deref_var &index (function_temp uint)
@store_deref (%2, %1) (wrmask=x, access=0)
32 %3 = deref_var &index (function_temp uint)
32 %4 = @load_deref (%3) (access=0)
32 %5 = deref_var &index (function_temp uint)
32 %6 = @load_deref (%5) (access=0)
32 %7 = u2f32 %6
32 %8 = fddy_fine %7
32 %9 = f2u32 %8
32 %10 = load_const (0x00000000 = 0.000000)
32x4 %11 = @vulkan_resource_index (%10) (desc_set=0, binding=0, desc_type=SSBO)
32x4 %12 = @load_vulkan_descriptor (%11) (desc_type=SSBO)
32x4 %13 = deref_cast (Storage *)%12 (ssbo Storage) (ptr_stride=0, align_mul=4, align_offset=0)
32x4 %14 = deref_struct &%13->dy (ssbo uint[]) // &((Storage *)%12)->dy
32x4 %15 = deref_array &(*%14)[%4] (ssbo uint) // &((Storage *)%12)->dy[%4]
@store_deref (%15, %9) (wrmask=x, access=0)
32 %17 = deref_var &size (function_temp uvec3)
@store_deref (%17, %16) (wrmask=xyz, access=0)
32 %18 = deref_var &gl_LocalInvocationID (system uvec3)
32x3 %19 = @load_deref (%18) (access=0)
32 %20 = deref_var &id (function_temp uvec3)
@store_deref (%20, %19) (wrmask=xyz, access=0)
32 %21 = deref_var &id (function_temp uvec3)
32x3 %24 = @load_deref (%21) (access=0)
32 %26 = deref_var &index (function_temp uint)
32 %27 = @load_deref (%26) (access=0)
32 %28 = deref_var &size (function_temp uvec3)
32x3 %31 = @load_deref (%28) (access=0)
32 %33 = umod %27, %31.x
1 %34 = ine %24.x, %33
1 %35 = inot %34
32 %114 = deref_var &phi (function_temp bool)
@store_deref (%114, %34) (wrmask=x, access=0)
// succs: b1 b2
if %35 {
block b1: // preds: b0
32 %36 = deref_var &id (function_temp uvec3)
32x3 %39 = @load_deref (%36) (access=0)
32 %41 = deref_var &index (function_temp uint)
32 %42 = @load_deref (%41) (access=0)
32 %43 = deref_var &size (function_temp uvec3)
32x3 %46 = @load_deref (%43) (access=0)
32 %48 = udiv %42, %46.x
32 %49 = deref_var &size (function_temp uvec3)
32x3 %52 = @load_deref (%49) (access=0)
32 %54 = umod %48, %52.y
1 %55 = ine %39.y, %54
32 %115 = deref_var &phi (function_temp bool)
@store_deref (%115, %55) (wrmask=x, access=0)
// succs: b3
} else {
block b2: // preds: b0, succs: b3
}
block b3: // preds: b1 b2
32 %56 = deref_var &phi (function_temp bool)
1 %57 = @load_deref (%56) (access=0)
1 %58 = inot %57
32 %116 = deref_var &phi#0 (function_temp bool)
@store_deref (%116, %57) (wrmask=x, access=0)
// succs: b4 b5
if %58 {
block b4: // preds: b3
32 %59 = deref_var &id (function_temp uvec3)
32x3 %62 = @load_deref (%59) (access=0)
32 %64 = deref_var &index (function_temp uint)
32 %65 = @load_deref (%64) (access=0)
32 %66 = deref_var &size (function_temp uvec3)
32x3 %69 = @load_deref (%66) (access=0)
32 %71 = deref_var &size (function_temp uvec3)
32x3 %74 = @load_deref (%71) (access=0)
32 %76 = imul %69.x, %74.y
32 %77 = udiv %65, %76
32 %78 = deref_var &size (function_temp uvec3)
32x3 %81 = @load_deref (%78) (access=0)
32 %83 = umod %77, %81.z
1 %84 = ine %62.z, %83
32 %117 = deref_var &phi#0 (function_temp bool)
@store_deref (%117, %84) (wrmask=x, access=0)
// succs: b6
} else {
block b5: // preds: b3, succs: b6
}
block b6: // preds: b4 b5
32 %85 = deref_var &phi#0 (function_temp bool)
1 %86 = @load_deref (%85) (access=0)
// succs: b7 b8
if %86 {
block b7: // preds: b6
32 %87 = deref_var &index (function_temp uint)
32 %88 = @load_deref (%87) (access=0)
32 %89 = deref_var &size (function_temp uvec3)
32x3 %92 = @load_deref (%89) (access=0)
32 %94 = deref_var &size (function_temp uvec3)
32x3 %97 = @load_deref (%94) (access=0)
32 %99 = imul %92.x, %97.y
32 %100 = deref_var &size (function_temp uvec3)
32x3 %103 = @load_deref (%100) (access=0)
32 %105 = imul %99, %103.z
32 %107 = iadd %105, %106
32 %108 = load_const (0x00000000 = 0.000000)
32x4 %109 = @vulkan_resource_index (%108) (desc_set=0, binding=0, desc_type=SSBO)
32x4 %110 = @load_vulkan_descriptor (%109) (desc_type=SSBO)
32x4 %111 = deref_cast (Storage *)%110 (ssbo Storage) (ptr_stride=0, align_mul=4, align_offset=0)
32x4 %112 = deref_struct &%111->dy (ssbo uint[]) // &((Storage *)%110)->dy
32x4 %113 = deref_array &(*%112)[%88] (ssbo uint) // &((Storage *)%110)->dy[%88]
@store_deref (%113, %107) (wrmask=x, access=0)
// succs: b9
} else {
block b8: // preds: b6, succs: b9
}
block b9: // preds: b7 b8, succs: b10
block b10:
}