Skip to content

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:

  1. Use % prefix instead of ssa_.
  2. Use @ prefix instead of intrinsic . Uniquifying variables get #.
  3. Use ^ prefix instead of block_. Use BB prefix instead of block_. Use b prefix.
  4. Use NxM instead of vecN M to describe the size of SSA values. Omit the first part if N==1. Put bits before num elements.
  5. Change intrinsic indexes to be inside brackets and add one extra space of clearance. Dropped.
  6. Also use brackets for properties of deref_cast. Using parenthesis for deref_cast properties.
  7. Merge block, preds and succs into a single line. Merge block and preds in a single line. Also merge succs when block is empty.
  8. Align instructions in a block along the = sign.
  9. Use 4 spaces for indentation.
  10. NEW: Use // comments, per Ian's suggestion.
  11. NEW: For non empty blocks, align // preds and // succs with the instructions.
  12. 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:
}
Edited by Caio Oliveira

Merge request reports

Loading