r600/sfn: Fix copy-prop with array access
authorGert Wollny <gert.wollny@collabora.com>
Tue, 7 Mar 2023 16:53:08 +0000 (17:53 +0100)
committerMarge Bot <emma+marge@anholt.net>
Fri, 28 Apr 2023 13:13:55 +0000 (13:13 +0000)
We will have to check whether there is access to an array between the
instructions involved with the copy prop, so for now do not allow it.

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21347>

src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp
src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp

index a265914..6d6dd93 100644 (file)
@@ -417,6 +417,9 @@ AluInstr::can_propagate_dest() const
    if (!src_reg->has_flag(Register::ssa))
       return false;
 
+   if (!m_dest->has_flag(Register::ssa))
+      return false;
+
    if (src_reg->pin() == pin_chan)
       return m_dest->pin() == pin_none || m_dest->pin() == pin_free ||
              ((m_dest->pin() == pin_chan || m_dest->pin() == pin_group) &&
@@ -472,10 +475,10 @@ bool AluInstr::can_replace_source(PRegister old_src, PVirtualValue new_src)
    if (!check_readport_validation(old_src, new_src))
       return false;
 
-   /* If the old source is an array element, we assume that there
+   /* If the old or new source is an array element, we assume that there
     * might have been an (untracked) indirect access, so don't replace
     * this source */
-   if (old_src->pin() == pin_array)
+   if (old_src->pin() == pin_array || new_src->pin() == pin_array)
       return false;
 
    auto [addr, dummy, index] = indirect_addr();
index aa43985..a32e0be 100644 (file)
@@ -1912,27 +1912,27 @@ ELSE
      ALU MOV A2[S37.x].x : I[0] {W}
      ALU MOV A2[S37.x].y : L[0x3dcccccd] {WL}
 ENDIF
+ALU MOV S1025.x@group{s} : A2[0].x {W}
+ALU MOV S1025.y@group{s} : A2[0].y {WL}
+ALU MOV S1025.z@group{s} : A2[1].x {W}
+ALU MOV S1025.w@group{s} : A2[1].y {WL}
+ALU MOV S1027.x@group{s} : A2[2].x {W}
+ALU MOV S1027.y@group{s} : A2[2].y {WL}
+ALU MOV S1027.z@group{s} : A2[3].x {W}
+ALU MOV S1027.w@group{s} : A2[3].y {WL}
+ALU MOV S1029.x@group{s} : A2[0].z {W}
+ALU MOV S1029.y@group{s} : A2[0].w {WL}
+ALU MOV S1029.z@group{s} : A2[1].z {W}
+ALU MOV S1029.w@group{s} : A2[1].w {WL}
+ALU MOV S1031.x@group{s} : A2[2].z {W}
+ALU MOV S1031.y@group{s} : A2[2].w {WL}
+ALU MOV S1031.z@group{s} : A2[3].z {W}
+ALU MOV S1031.w@group{s} : A2[3].w {WL}
 EXPORT_DONE POS 0 S19.xyzw
-ALU MOV S46.x@group : A2[0].x {W}
-ALU MOV S46.y@group : A2[0].y {W}
-ALU MOV S46.z@group : A2[1].x {W}
-ALU MOV S46.w@group : A2[1].y {WL}
-EXPORT PARAM 0 S46.xyzw
-ALU MOV S47.x@group : A2[2].x {W}
-ALU MOV S47.y@group : A2[2].y {W}
-ALU MOV S47.z@group : A2[3].x {W}
-ALU MOV S47.w@group : A2[3].y {WL}
-EXPORT PARAM 1 S47.xyzw
-ALU MOV S48.x@group : A2[0].z {W}
-ALU MOV S48.y@group : A2[0].w {W}
-ALU MOV S48.z@group : A2[1].z {W}
-ALU MOV S48.w@group : A2[1].w {WL}
-EXPORT PARAM 2 S48.xyzw
-ALU MOV S49.x@group : A2[2].z {W}
-ALU MOV S49.y@group : A2[2].w {W}
-ALU MOV S49.z@group : A2[3].z {W}
-ALU MOV S49.w@group : A2[3].w {WL}
-EXPORT_DONE PARAM 3 S49.xyzw
+EXPORT PARAM 0 S1025.xyzw
+EXPORT PARAM 1 S1027.xyzw
+EXPORT PARAM 2 S1029.xyzw
+EXPORT_DONE PARAM 3 S1031.xyzw
 )";
 
 const char *shader_with_dest_array_opt_scheduled =
@@ -2021,38 +2021,38 @@ ELSE
     ALU MOV A2[AR].y : L[0x3dcccccd] {WL}
   ALU_GROUP_END
 ENDIF
-ALU_GROUP_BEGIN
-  ALU MOV S46.x@group : A2[0].x {W}
-  ALU MOV S46.y@group : A2[0].y {W}
-  ALU MOV S46.z@group : A2[1].x {W}
-  ALU MOV S46.w@group : A2[1].y {W}
-  ALU MOV S47.x@group : A2[2].x {WL}
-ALU_GROUP_END
-ALU_GROUP_BEGIN
-  ALU MOV S48.x@group : A2[0].z {W}
-  ALU MOV S47.y@group : A2[2].y {W}
-  ALU MOV S47.z@group : A2[3].x {W}
-  ALU MOV S47.w@group : A2[3].y {W}
-  ALU MOV S48.y@group : A2[0].w {WL}
-ALU_GROUP_END
-ALU_GROUP_BEGIN
-  ALU MOV S49.x@group : A2[2].z {W}
-  ALU MOV S49.y@group : A2[2].w {W}
-  ALU MOV S48.z@group : A2[1].z {W}
-  ALU MOV S48.w@group : A2[1].w {W}
-  ALU MOV S49.z@group : A2[3].z {WL}
-ALU_GROUP_END
-ALU_GROUP_BEGIN
-  ALU MOV S49.w@group : A2[3].w {WL}
+  ALU_GROUP_BEGIN
+    ALU MOV S1025.x@chgr : A2[0].x {W}
+    ALU MOV S1025.y@chgr : A2[0].y {W}
+    ALU MOV S1025.z@chgr : A2[1].x {W}
+    ALU MOV S1025.w@chgr : A2[1].y {W}
+    ALU MOV S1027.x@group : A2[2].x {WL}
+ ALU_GROUP_END
+ ALU_GROUP_BEGIN
+   ALU MOV S1029.x@chgr : A2[0].z {W}
+   ALU MOV S1027.y@chgr : A2[2].y {W}
+   ALU MOV S1027.z@chgr : A2[3].x {W}
+   ALU MOV S1027.w@chgr : A2[3].y {W}
+   ALU MOV S1029.y@group : A2[0].w {WL}
+ ALU_GROUP_END
+ ALU_GROUP_BEGIN
+  ALU MOV S1031.x@chgr : A2[2].z {W}
+  ALU MOV S1031.y@chgr : A2[2].w {W}
+  ALU MOV S1029.z@chgr : A2[1].z {W}
+  ALU MOV S1029.w@chgr : A2[1].w {W}
+  ALU MOV S1031.z@group : A2[3].z {WL}
+ ALU_GROUP_END
+ ALU_GROUP_BEGIN
+   ALU MOV S1031.w@chgr : A2[3].w {WL}
 ALU_GROUP_END
 BLOCK_END
 BLOCK_START
 EXPORT_DONE POS 0 S19.xyzw
-EXPORT PARAM 0 S46.xyzw
-EXPORT PARAM 1 S47.xyzw
-EXPORT PARAM 2 S48.xyzw
-EXPORT_DONE PARAM 3 S49.xyzw
-BLOCK_END
+EXPORT PARAM 0 S1025.xyzw
+EXPORT PARAM 1 S1027.xyzw
+EXPORT PARAM 2 S1029.xyzw
+EXPORT_DONE PARAM 3 S1031.xyzw
+BLOCK END\n
 )";
 
 const char *shader_with_dest_array2 =