Skip to content
  • Lionel Landwerlin's avatar
    nir/lower_non_uniform: safely iterate over blocks · 366811be
    Lionel Landwerlin authored
    
    
    This fixes a problem where the same instruction gets replaced twice.
    This was happening when the replaced instruction would be at the end
    of a block.
    
    Replacement of :
    
       if ssa_8 {
                    ....
          intrinsic bindless_image_store (ssa_44, ssa_16, ssa_0, ssa_15) (5, 0, 34836, 32) /* image_dim=Buf */ /* image_array=false */ /* format=34836 */ /* access=32 */
       }
    
    Would be :
    
       if ssa_8 {
          loop {
             vec1 32 ssa_47 = intrinsic read_first_invocation (ssa_44) ()
             vec1 1 ssa_48 = ieq ssa_47, ssa_44
             if ssa_48 {
                loop {
                   vec1 32 ssa_49 = intrinsic read_first_invocation (ssa_44) ()
                   vec1 1 ssa_50 = ieq ssa_49, ssa_44
                   if ssa_50 {
                      intrinsic bindless_image_store (ssa_44, ssa_16, ssa_0, ssa_15) (5, 0, 34836, 32) /* image_dim=Buf */ /* image_array=false */ /* format=34836 */ /* access=32 */
                      break
                   } else {
            ....
       }
    
    Signed-off-by: default avatarLionel Landwerlin <lionel.g.landwerlin@intel.com>
    Fixes: 3bd54576
    
     ("nir: Add a lowering pass for non-uniform resource access")
    Reviewed-by: default avatarJason Ekstrand <jason@jlekstrand.net>
    366811be