diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2023-08-23 16:39:21 +0200 |
---|---|---|
committer | Uros Bizjak <ubizjak@gmail.com> | 2023-08-23 16:41:53 +0200 |
commit | 94a25d3dede035ce8318ae25388d658753c90a3b (patch) | |
tree | f58da26a710acb63a0f165429412382bc65a6b49 /gcc | |
parent | 18befd6f050e70f11ecca1dd58624f0ee3c68cc7 (diff) | |
download | gcc-94a25d3dede035ce8318ae25388d658753c90a3b.zip gcc-94a25d3dede035ce8318ae25388d658753c90a3b.tar.gz gcc-94a25d3dede035ce8318ae25388d658753c90a3b.tar.bz2 |
i386: Fix register spill failure with concat RTX [PR111010]
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/i386/i386.md | 46 |
1 files changed, 14 insertions, 32 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 108f4af..50794ed 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -12435,17 +12435,16 @@ 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)] @@ -12456,28 +12455,10 @@ 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") @@ -12495,7 +12476,8 @@ { 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") |