On Fri, Feb 08, 2019 at 10:18:03AM +0100, Christophe Lyon wrote:
> I'm afaid this patch causes several regressions. Maybe they have
> already been fixed post-commit (I have several validations for later
> commits still running)?

The following patch fixes the single ICE I've tried to reproduce.
While iwmmxt.md movdi pattern uses =m, r and =r, m constraints, both
arm.md and vfp.md movdi patterns use =m, q and =q, m constraints and thus
allow also ip register.  The following patch is an attempt to do the same
thing, just in the same patterns through arch_enabled attribute.

Completely untested.

2019-02-08  Jakub Jelinek  <ja...@redhat.com>

        PR bootstrap/88714
        * config/arm/ldrdstrd.md (*arm_ldrd, *arm_strd): Add alternative with
        q constraint instead of r, enable it only if not TARGET_REALLY_IWMMXT.

--- gcc/config/arm/ldrdstrd.md.jj       2019-02-07 17:33:38.841669141 +0100
+++ gcc/config/arm/ldrdstrd.md  2019-02-08 10:42:56.515325579 +0100
@@ -157,10 +157,10 @@ (define_peephole2 ; swap the destination
 ;; We use gen_operands_ldrd_strd() with a modify argument as false so that the
 ;; operands are not changed.
 (define_insn "*arm_ldrd"
-  [(parallel [(set (match_operand:SI 0 "s_register_operand" "=r")
-                  (match_operand:SI 2 "memory_operand" "m"))
-             (set (match_operand:SI 1 "s_register_operand" "=r")
-                  (match_operand:SI 3 "memory_operand" "m"))])]
+  [(parallel [(set (match_operand:SI 0 "s_register_operand" "=q,r")
+                  (match_operand:SI 2 "memory_operand" "m,m"))
+             (set (match_operand:SI 1 "s_register_operand" "=q,r")
+                  (match_operand:SI 3 "memory_operand" "m,m"))])]
   "TARGET_LDRD && TARGET_ARM && reload_completed
   && valid_operands_ldrd_strd (operands, true)"
   {
@@ -173,14 +173,17 @@ (define_insn "*arm_ldrd"
        (symbol_ref "arm_count_ldrdstrd_insns (operands, true) * 4"))
    (set (attr "ce_count") (symbol_ref "get_attr_length (insn) / 4"))
    (set_attr "type" "load_8")
-   (set_attr "predicable" "yes")]
-)
+   (set_attr "predicable" "yes")
+   (set (attr "arch_enabled")
+       (if_then_else (and (match_test "TARGET_REALLY_IWMMXT")
+                          (eq_attr "alternative" "0"))
+                     (const_string "no") (const_string "yes")))])
 
 (define_insn "*arm_strd"
-  [(parallel [(set (match_operand:SI 2 "memory_operand" "=m")
-                  (match_operand:SI 0 "s_register_operand" "r"))
-             (set (match_operand:SI 3 "memory_operand" "=m")
-                  (match_operand:SI 1 "s_register_operand" "r"))])]
+  [(parallel [(set (match_operand:SI 2 "memory_operand" "=m,m")
+                  (match_operand:SI 0 "s_register_operand" "q,r"))
+             (set (match_operand:SI 3 "memory_operand" "=m,m")
+                  (match_operand:SI 1 "s_register_operand" "q,r"))])]
   "TARGET_LDRD && TARGET_ARM && reload_completed
   && valid_operands_ldrd_strd (operands, false)"
   {
@@ -193,5 +196,8 @@ (define_insn "*arm_strd"
        (symbol_ref "arm_count_ldrdstrd_insns (operands, false) * 4"))
    (set (attr "ce_count") (symbol_ref "get_attr_length (insn) / 4"))
    (set_attr "type" "store_8")
-   (set_attr "predicable" "yes")]
-)
+   (set_attr "predicable" "yes")
+   (set (attr "arch_enabled")
+       (if_then_else (and (match_test "TARGET_REALLY_IWMMXT")
+                          (eq_attr "alternative" "0"))
+                     (const_string "no") (const_string "yes")))])

        Jakub

Reply via email to