<div dir="ltr">We have unit tests for that pass.  Maybe you could write one which exercises the issue?  It'd help in debugging.<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, May 9, 2019 at 8:12 PM Dave Airlie <<a href="mailto:airlied@gmail.com">airlied@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I've got a bunch of cases where copy prop vars is getting things wrong<br>
around casts, it finds a store to an vec2 but ends up with the<br>
writemask staying at 0x3 but the item being store being a single<br>
64-bit.<br>
<br>
Debug is attached below.<br>
<br>
Dave.<br>
<br>
nir_lower_memcpy_deref<br>
shader: MESA_SHADER_KERNEL<br>
local-size: 0, 0, 0 (variable)<br>
shared-size: 1<br>
inputs: 16<br>
outputs: 0<br>
uniforms: 0<br>
shared: 0<br>
decl_var shader_in INTERP_MODE_NONE uint64_t @0 (0.x, 0, 0)<br>
decl_var shader_in INTERP_MODE_NONE uint64_t @1 (1.x, 8, 0)<br>
decl_function __wrapped_vload2_private (0 params)<br>
<br>
impl __wrapped_vload2_private {<br>
    decl_var  INTERP_MODE_NONE uint[3] @2<br>
    block block_0:<br>
    /* preds: */<br>
    vec1 64 ssa_0 = deref_var &@0 (shader_in uint64_t)<br>
    vec1 64 ssa_1 = intrinsic load_deref (ssa_0) (0) /* access=0 */<br>
    vec1 64 ssa_2 = deref_var &@1 (shader_in uint64_t)<br>
    vec1 64 ssa_3 = intrinsic load_deref (ssa_2) (0) /* access=0 */<br>
    vec1 64 ssa_4 = load_const (0x               0 /* 0.000000 */)<br>
    vec1 64 ssa_5 = load_const (0x               0 /* 0.000000 */)<br>
    vec1 64 ssa_6 = deref_cast (uint *)ssa_1 (global uint)<br>
    vec1 64 ssa_7 = deref_cast (uvec2 *)ssa_3 (global uvec2)<br>
    vec1 32 ssa_8 = intrinsic load_deref (ssa_6) (0) /* access=0 */<br>
    vec1 64 ssa_9 = deref_var &@2 (function_temp uint[3])<br>
    vec1 64 ssa_10 = deref_cast (uint[3] *)ssa_9 (function_temp uint[3])<br>
    vec1 64 ssa_11 = load_const (0x               0 /* 0.000000 */)<br>
    vec1 64 ssa_13 = load_const (0x               0 /* 0.000000 */)<br>
    vec1 64 ssa_14 = deref_array &(*ssa_9)[0] (function_temp uint) /* &@2[0] */<br>
    intrinsic store_deref (ssa_14, ssa_8) (1, 0) /* wrmask=x */ /* access=0 */<br>
    vec1 64 ssa_15 = deref_cast (uint *)ssa_1 (global uint)<br>
    vec1 64 ssa_16 = load_const (0x               1 /* 0.000000 */)<br>
    vec1 64 ssa_17 = deref_ptr_as_array &(*ssa_15)[1] (global uint) /*<br>
&(*(uint *)ssa_1)[1] */<br>
    vec1 32 ssa_18 = intrinsic load_deref (ssa_17) (0) /* access=0 */<br>
    vec1 64 ssa_19 = deref_var &@2 (function_temp uint[3])<br>
    vec1 64 ssa_20 = deref_cast (uint[3] *)ssa_19 (function_temp uint[3])<br>
    vec1 64 ssa_21 = load_const (0x               0 /* 0.000000 */)<br>
    vec1 64 ssa_23 = load_const (0x               1 /* 0.000000 */)<br>
    vec1 64 ssa_24 = deref_array &(*ssa_19)[1] (function_temp uint) /* &@2[1] */<br>
    intrinsic store_deref (ssa_24, ssa_18) (1, 0) /* wrmask=x */ /* access=0 */<br>
    vec1 64 ssa_25 = deref_cast (uint *)ssa_1 (global uint)<br>
    vec1 64 ssa_26 = load_const (0x               2 /* 0.000000 */)<br>
    vec1 64 ssa_27 = deref_ptr_as_array &(*ssa_25)[2] (global uint) /*<br>
&(*(uint *)ssa_1)[2] */<br>
    vec1 32 ssa_28 = intrinsic load_deref (ssa_27) (0) /* access=0 */<br>
    vec1 64 ssa_29 = deref_var &@2 (function_temp uint[3])<br>
    vec1 64 ssa_30 = deref_cast (uint[3] *)ssa_29 (function_temp uint[3])<br>
    vec1 64 ssa_31 = load_const (0x               0 /* 0.000000 */)<br>
    vec1 64 ssa_33 = load_const (0x               2 /* 0.000000 */)<br>
    vec1 64 ssa_34 = deref_array &(*ssa_29)[2] (function_temp uint) /* &@2[2] */<br>
    intrinsic store_deref (ssa_34, ssa_28) (1, 0) /* wrmask=x */ /* access=0 */<br>
    vec1 64 ssa_35 = deref_cast (uvec2 *)ssa_14 (function_temp uvec2)<br>
    vec2 32 ssa_37 = intrinsic load_deref (ssa_35) (0) /* access=0 */<br>
    intrinsic store_deref (ssa_7, ssa_37) (3, 0) /* wrmask=xy */ /* access=0 */<br>
    vec1 64 ssa_38 = deref_cast (uvec2 *)ssa_24 (function_temp uvec2)<br>
    vec2 32 ssa_40 = intrinsic load_deref (ssa_38) (0) /* access=0 */<br>
    vec1 64 ssa_41 = deref_cast (uvec2 *)ssa_3 (global uvec2)<br>
    vec1 64 ssa_42 = load_const (0x               1 /* 0.000000 */)<br>
    vec1 64 ssa_43 = deref_ptr_as_array &(*ssa_41)[1] (global uvec2)<br>
/* &(*(uvec2 *)ssa_3)[1] */<br>
    intrinsic store_deref (ssa_43, ssa_40) (3, 0) /* wrmask=xy */ /* access=0 */<br>
    /* succs: block_1 */<br>
    block block_1:<br>
}<br>
<br>
nir_opt_copy_prop_vars<br>
## nir_copy_prop_vars_impl for __wrapped_vload2_private<br>
# block0<br>
<br>
  vec1 64 ssa_0 = deref_var &unnamed (shader_in uint64_t)<br>
  vec1 64 ssa_1 = intrinsic load_deref (ssa_0) (0) /* access=0 */<br>
    uint64_t unnamed:     ssa_1<br>
<br>
  vec1 64 ssa_2 = deref_var &unnamed (shader_in uint64_t)<br>
  vec1 64 ssa_3 = intrinsic load_deref (ssa_2) (0) /* access=0 */<br>
    uint64_t unnamed:     ssa_1<br>
    uint64_t unnamed:     ssa_3<br>
<br>
  vec1 64 ssa_6 = deref_cast (uint *)ssa_1 (global uint)<br>
  vec1 64 ssa_7 = deref_cast (uvec2 *)ssa_3 (global uvec2)<br>
  vec1 32 ssa_8 = intrinsic load_deref (ssa_6) (0) /* access=0 */<br>
    uint64_t unnamed:     ssa_1<br>
    uint64_t unnamed:     ssa_3<br>
    uint (uint *)ssa_1:     ssa_8<br>
<br>
  vec1 64 ssa_9 = deref_var &unnamed (function_temp uint[3])<br>
  vec1 64 ssa_10 = deref_cast (uint[3] *)ssa_9 (function_temp uint[3])<br>
  vec1 64 ssa_14 = deref_array &(*ssa_9)[0] (function_temp uint) /*<br>
&unnamed[0] */<br>
  intrinsic store_deref (ssa_14, ssa_8) (1, 0) /* wrmask=x */ /* access=0 */<br>
    uint64_t unnamed:     ssa_1<br>
    uint64_t unnamed:     ssa_3<br>
    uint (uint *)ssa_1:     ssa_8<br>
    uint unnamed[0]:     ssa_8<br>
<br>
  vec1 64 ssa_15 = deref_cast (uint *)ssa_1 (global uint)<br>
  vec1 64 ssa_17 = deref_ptr_as_array &(*ssa_15)[1] (global uint) /*<br>
&(*(uint *)ssa_1)[1] */<br>
  vec1 32 ssa_18 = intrinsic load_deref (ssa_17) (0) /* access=0 */<br>
    uint64_t unnamed:     ssa_1<br>
    uint64_t unnamed:     ssa_3<br>
    uint (uint *)ssa_1:     ssa_8<br>
    uint unnamed[0]:     ssa_8<br>
    uint (*(uint *)ssa_1)[1]:     ssa_18<br>
<br>
  vec1 64 ssa_19 = deref_var &unnamed (function_temp uint[3])<br>
  vec1 64 ssa_20 = deref_cast (uint[3] *)ssa_19 (function_temp uint[3])<br>
  vec1 64 ssa_24 = deref_array &(*ssa_19)[1] (function_temp uint) /*<br>
&unnamed[1] */<br>
  intrinsic store_deref (ssa_24, ssa_18) (1, 0) /* wrmask=x */ /* access=0 */<br>
    uint64_t unnamed:     ssa_1<br>
    uint64_t unnamed:     ssa_3<br>
    uint (uint *)ssa_1:     ssa_8<br>
    uint unnamed[0]:     ssa_8<br>
    uint (*(uint *)ssa_1)[1]:     ssa_18<br>
    uint unnamed[1]:     ssa_18<br>
<br>
  vec1 64 ssa_25 = deref_cast (uint *)ssa_1 (global uint)<br>
  vec1 64 ssa_27 = deref_ptr_as_array &(*ssa_25)[2] (global uint) /*<br>
&(*(uint *)ssa_1)[2] */<br>
  vec1 32 ssa_28 = intrinsic load_deref (ssa_27) (0) /* access=0 */<br>
    uint64_t unnamed:     ssa_1<br>
    uint64_t unnamed:     ssa_3<br>
    uint (uint *)ssa_1:     ssa_8<br>
    uint unnamed[0]:     ssa_8<br>
    uint (*(uint *)ssa_1)[1]:     ssa_18<br>
    uint unnamed[1]:     ssa_18<br>
    uint (*(uint *)ssa_1)[2]:     ssa_28<br>
<br>
  vec1 64 ssa_29 = deref_var &unnamed (function_temp uint[3])<br>
  vec1 64 ssa_30 = deref_cast (uint[3] *)ssa_29 (function_temp uint[3])<br>
  vec1 64 ssa_34 = deref_array &(*ssa_29)[2] (function_temp uint) /*<br>
&unnamed[2] */<br>
  intrinsic store_deref (ssa_34, ssa_28) (1, 0) /* wrmask=x */ /* access=0 */<br>
    uint64_t unnamed:     ssa_1<br>
    uint64_t unnamed:     ssa_3<br>
    uint (uint *)ssa_1:     ssa_8<br>
    uint unnamed[0]:     ssa_8<br>
    uint (*(uint *)ssa_1)[1]:     ssa_18<br>
    uint unnamed[1]:     ssa_18<br>
    uint (*(uint *)ssa_1)[2]:     ssa_28<br>
    uint unnamed[2]:     ssa_28<br>
<br>
  vec1 64 ssa_35 = deref_cast (uvec2 *)ssa_14 (function_temp uvec2)<br>
  vec2 32 ssa_37 = intrinsic load_deref (ssa_35) (0) /* access=0 */<br>
    uint64_t unnamed:     ssa_1<br>
    uint64_t unnamed:     ssa_3<br>
    uint (uint *)ssa_1:     ssa_8<br>
    uint unnamed[0]:     ssa_8<br>
    uint (*(uint *)ssa_1)[1]:     ssa_18<br>
    uint unnamed[1]:     ssa_18<br>
    uint (*(uint *)ssa_1)[2]:     ssa_28<br>
    uint unnamed[2]:     ssa_28<br>
    uvec2 (uvec2 *)ssa_14:     ssa_8[0] _<br>
<br>
  intrinsic store_deref (ssa_7, ssa_8) (3, 0) /* wrmask=xy */ /* access=0 */<br>
    uint64_t unnamed:     ssa_1<br>
    uint64_t unnamed:     ssa_3<br>
    uvec2 (uvec2 *)ssa_14:     ssa_8[0] _<br>
    uint unnamed[0]:     ssa_8<br>
    uint unnamed[2]:     ssa_28<br>
    uint unnamed[1]:     ssa_18<br>
    uvec2 (uvec2 *)ssa_3:     ssa_8<br>
<br>
  vec1 64 ssa_38 = deref_cast (uvec2 *)ssa_24 (function_temp uvec2)<br>
  vec2 32 ssa_40 = intrinsic load_deref (ssa_38) (0) /* access=0 */<br>
    uint64_t unnamed:     ssa_1<br>
    uint64_t unnamed:     ssa_3<br>
    uvec2 (uvec2 *)ssa_14:     ssa_8[0] _<br>
    uint unnamed[0]:     ssa_8<br>
    uint unnamed[2]:     ssa_28<br>
    uint unnamed[1]:     ssa_18<br>
    uvec2 (uvec2 *)ssa_3:     ssa_8<br>
    uvec2 (uvec2 *)ssa_24:     ssa_18[0] _<br>
<br>
  vec1 64 ssa_41 = deref_cast (uvec2 *)ssa_3 (global uvec2)<br>
  vec1 64 ssa_43 = deref_ptr_as_array &(*ssa_41)[1] (global uvec2) /*<br>
&(*(uvec2 *)ssa_3)[1] */<br>
  intrinsic store_deref (ssa_43, ssa_18) (3, 0) /* wrmask=xy */ /* access=0 */<br>
    uint64_t unnamed:     ssa_1<br>
    uint64_t unnamed:     ssa_3<br>
    uvec2 (uvec2 *)ssa_14:     ssa_8[0] _<br>
    uint unnamed[0]:     ssa_8<br>
    uint unnamed[2]:     ssa_28<br>
    uint unnamed[1]:     ssa_18<br>
    uvec2 (uvec2 *)ssa_24:     ssa_18[0] _<br>
    uvec2 (*(uvec2 *)ssa_3)[1]:     ssa_18<br>
<br>
shader: MESA_SHADER_KERNEL<br>
local-size: 0, 0, 0 (variable)<br>
shared-size: 1<br>
inputs: 16<br>
outputs: 0<br>
uniforms: 0<br>
shared: 0<br>
decl_var shader_in INTERP_MODE_NONE uint64_t @0 (0.x, 0, 0)<br>
decl_var shader_in INTERP_MODE_NONE uint64_t @1 (1.x, 8, 0)<br>
decl_function __wrapped_vload2_private (0 params)<br>
<br>
impl __wrapped_vload2_private {<br>
    decl_var  INTERP_MODE_NONE uint[3] @2<br>
    block block_0:<br>
    /* preds: */<br>
    vec1 64 ssa_0 = deref_var &@0 (shader_in uint64_t)<br>
    vec1 64 ssa_1 = intrinsic load_deref (ssa_0) (0) /* access=0 */<br>
    vec1 64 ssa_2 = deref_var &@1 (shader_in uint64_t)<br>
    vec1 64 ssa_3 = intrinsic load_deref (ssa_2) (0) /* access=0 */<br>
    vec1 64 ssa_4 = load_const (0x               0 /* 0.000000 */)<br>
    vec1 64 ssa_5 = load_const (0x               0 /* 0.000000 */)<br>
    vec1 64 ssa_6 = deref_cast (uint *)ssa_1 (global uint)<br>
    vec1 64 ssa_7 = deref_cast (uvec2 *)ssa_3 (global uvec2)<br>
    vec1 32 ssa_8 = intrinsic load_deref (ssa_6) (0) /* access=0 */<br>
    vec1 64 ssa_9 = deref_var &@2 (function_temp uint[3])<br>
    vec1 64 ssa_10 = deref_cast (uint[3] *)ssa_9 (function_temp uint[3])<br>
    vec1 64 ssa_11 = load_const (0x               0 /* 0.000000 */)<br>
    vec1 64 ssa_13 = load_const (0x               0 /* 0.000000 */)<br>
    vec1 64 ssa_14 = deref_array &(*ssa_9)[0] (function_temp uint) /* &@2[0] */<br>
    intrinsic store_deref (ssa_14, ssa_8) (1, 0) /* wrmask=x */ /* access=0 */<br>
    vec1 64 ssa_15 = deref_cast (uint *)ssa_1 (global uint)<br>
    vec1 64 ssa_16 = load_const (0x               1 /* 0.000000 */)<br>
    vec1 64 ssa_17 = deref_ptr_as_array &(*ssa_15)[1] (global uint) /*<br>
&(*(uint *)ssa_1)[1] */<br>
    vec1 32 ssa_18 = intrinsic load_deref (ssa_17) (0) /* access=0 */<br>
    vec1 64 ssa_19 = deref_var &@2 (function_temp uint[3])<br>
    vec1 64 ssa_20 = deref_cast (uint[3] *)ssa_19 (function_temp uint[3])<br>
    vec1 64 ssa_21 = load_const (0x               0 /* 0.000000 */)<br>
    vec1 64 ssa_23 = load_const (0x               1 /* 0.000000 */)<br>
    vec1 64 ssa_24 = deref_array &(*ssa_19)[1] (function_temp uint) /* &@2[1] */<br>
    intrinsic store_deref (ssa_24, ssa_18) (1, 0) /* wrmask=x */ /* access=0 */<br>
    vec1 64 ssa_25 = deref_cast (uint *)ssa_1 (global uint)<br>
    vec1 64 ssa_26 = load_const (0x               2 /* 0.000000 */)<br>
    vec1 64 ssa_27 = deref_ptr_as_array &(*ssa_25)[2] (global uint) /*<br>
&(*(uint *)ssa_1)[2] */<br>
    vec1 32 ssa_28 = intrinsic load_deref (ssa_27) (0) /* access=0 */<br>
    vec1 64 ssa_29 = deref_var &@2 (function_temp uint[3])<br>
    vec1 64 ssa_30 = deref_cast (uint[3] *)ssa_29 (function_temp uint[3])<br>
    vec1 64 ssa_31 = load_const (0x               0 /* 0.000000 */)<br>
    vec1 64 ssa_33 = load_const (0x               2 /* 0.000000 */)<br>
    vec1 64 ssa_34 = deref_array &(*ssa_29)[2] (function_temp uint) /* &@2[2] */<br>
    intrinsic store_deref (ssa_34, ssa_28) (1, 0) /* wrmask=x */ /* access=0 */<br>
    vec1 64 ssa_35 = deref_cast (uvec2 *)ssa_14 (function_temp uvec2)<br>
    intrinsic store_deref (ssa_7, ssa_8) (3, 0) /* wrmask=xy */ /* access=0 */<br>
    vec1 64 ssa_38 = deref_cast (uvec2 *)ssa_24 (function_temp uvec2)<br>
    vec1 64 ssa_41 = deref_cast (uvec2 *)ssa_3 (global uvec2)<br>
    vec1 64 ssa_42 = load_const (0x               1 /* 0.000000 */)<br>
    vec1 64 ssa_43 = deref_ptr_as_array &(*ssa_41)[1] (global uvec2)<br>
/* &(*(uvec2 *)ssa_3)[1] */<br>
    intrinsic store_deref (ssa_43, ssa_18) (3, 0) /* wrmask=xy */ /* access=0 */<br>
    /* succs: block_1 */<br>
    block block_1:<br>
}<br>
</blockquote></div>