]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
amdgcn: align TImode registers
authorAndrew Stubbs <ams@codesourcery.com>
Thu, 10 Sep 2020 09:10:32 +0000 (10:10 +0100)
committerAndrew Stubbs <ams@codesourcery.com>
Fri, 11 Sep 2020 13:29:35 +0000 (14:29 +0100)
This prevents execution failures caused by partially overlapping input and
output registers.  This is the same solution already used for DImode.

gcc/ChangeLog:

* config/gcn/gcn.c (gcn_hard_regno_mode_ok): Align TImode registers.
* config/gcn/gcn.md: Assert that TImode registers do not early clobber.

(cherry picked from commit 8ae0de5621120b16295fe6b73ca044d4c576af6d)

gcc/config/gcn/gcn.c
gcc/config/gcn/gcn.md

index 39eb8fd283f383c2a4b36f31c3b5a54682443e41..c7c057f73cce1ee3e9367e4951408ea1be7d8cf8 100644 (file)
@@ -468,7 +468,8 @@ gcn_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
     return (vgpr_1reg_mode_p (mode)
            || (!((regno - FIRST_VGPR_REG) & 1) && vgpr_2reg_mode_p (mode))
            /* TImode is used by DImode compare_and_swap.  */
-           || mode == TImode);
+           || (mode == TImode
+               && !((regno - FIRST_VGPR_REG) & 3)));
   return false;
 }
 
index 8cfb3a85d2561f3b1eb527277ab675bf39009377..d72d2cd157a6bc3d063bffc05fd6b7714e9b8d4d 100644 (file)
    (set (match_dup 4) (match_dup 5))
    (set (match_dup 6) (match_dup 7))]
   {
+    gcc_assert (rtx_equal_p (operands[0], operands[1])
+               || !reg_overlap_mentioned_p (operands[0], operands[1]));
     operands[6] = gcn_operand_part (TImode, operands[0], 3);
     operands[7] = gcn_operand_part (TImode, operands[1], 3);
     operands[4] = gcn_operand_part (TImode, operands[0], 2);