]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386: Fix register spill failure with concat RTX [PR111010]
authorUros Bizjak <ubizjak@gmail.com>
Wed, 23 Aug 2023 14:39:21 +0000 (16:39 +0200)
committerUros Bizjak <ubizjak@gmail.com>
Wed, 23 Aug 2023 14:41:53 +0000 (16:41 +0200)
Disable (=&r,m,m) alternative for 32-bit targets. The combination of two
memory operands (possibly with complex addressing mode), early clobbered
output, frame pointer and PIC registers uses too much registers on
a register constrained 32-bit target.

Also merge two similar patterns using DWIH mode iterator.

PR target/111010

gcc/ChangeLog:

* config/i386/i386.md (*concat<any_or_plus:mode><dwi>3_3):
Merge pattern from *concatditi3_3 and *concatsidi3_3 using
DWIH mode iterator.  Disable (=&r,m,m) alternative for
32-bit targets.
(*concat<any_or_plus:mode><dwi>3_3): Disable (=&r,m,m)
alternative for 32-bit targets.

gcc/config/i386/i386.md

index 108f4af8552cfe9f4b9f9610f336fc1714175abe..50794ed7bed704c57d300ab665c9467b606108b9 100644 (file)
   DONE;
 })
 
-(define_insn_and_split "*concatditi3_3"
-  [(set (match_operand:TI 0 "nonimmediate_operand" "=ro,r,r,&r,x")
-       (any_or_plus:TI
-         (ashift:TI
-           (zero_extend:TI
-             (match_operand:DI 1 "nonimmediate_operand" "r,m,r,m,x"))
+(define_insn_and_split "*concat<mode><dwi>3_3"
+  [(set (match_operand:<DWI> 0 "nonimmediate_operand" "=ro,r,r,&r,x")
+       (any_or_plus:<DWI>
+         (ashift:<DWI>
+           (zero_extend:<DWI>
+             (match_operand:DWIH 1 "nonimmediate_operand" "r,m,r,m,x"))
            (match_operand:QI 2 "const_int_operand"))
-         (zero_extend:TI
-           (match_operand:DI 3 "nonimmediate_operand" "r,r,m,m,0"))))]
-  "TARGET_64BIT
-   && INTVAL (operands[2]) == 64"
+         (zero_extend:<DWI>
+           (match_operand:DWIH 3 "nonimmediate_operand" "r,r,m,m,0"))))]
+  "INTVAL (operands[2]) == <MODE_SIZE> * BITS_PER_UNIT"
   "#"
   "&& reload_completed"
   [(const_int 0)]
       emit_insn (gen_vec_concatv2di (tmp, operands[3], operands[1]));
     }
   else
-    split_double_concat (TImode, operands[0], operands[3], operands[1]);
-  DONE;
-})
-
-(define_insn_and_split "*concatsidi3_3"
-  [(set (match_operand:DI 0 "nonimmediate_operand" "=ro,r,r,&r")
-       (any_or_plus:DI
-         (ashift:DI
-           (zero_extend:DI
-             (match_operand:SI 1 "nonimmediate_operand" "r,m,r,m"))
-           (match_operand:QI 2 "const_int_operand"))
-         (zero_extend:DI
-           (match_operand:SI 3 "nonimmediate_operand" "r,r,m,m"))))]
-  "!TARGET_64BIT
-   && INTVAL (operands[2]) == 32"
-  "#"
-  "&& reload_completed"
-  [(const_int 0)]
-{
-  split_double_concat (DImode, operands[0], operands[3], operands[1]);
+    split_double_concat (<DWI>mode, operands[0], operands[3], operands[1]);
   DONE;
-})
+}
+  [(set_attr "isa" "*,*,*,x64,x64")])
 
 (define_insn_and_split "*concat<mode><dwi>3_4"
   [(set (match_operand:<DWI> 0 "nonimmediate_operand" "=ro,r,r,&r")
 {
   split_double_concat (<DWI>mode, operands[0], operands[1], operands[2]);
   DONE;
-})
+}
+  [(set_attr "isa" "*,*,*,x64")])
 
 (define_insn_and_split "*concat<half><mode>3_5"
   [(set (match_operand:DWI 0 "nonimmediate_operand" "=r,o,o")