re PR target/49920 (unable to find a register to spill in class ‘DIREG’)
PR target/49920 * config/i386/i386.md (strset): Do not expand strset_singleop when %eax or $edi are fixed. (*strsetdi_rex_1): Disable when %eax or %edi are fixed. (*strsetsi_1): Ditto. (*strsethi_1): Ditto. (*strsetqi_1): Ditto. (*rep_stosdi_rex64): Disable when %eax, %ecx or %edi are fixed. (*rep_stossi): Ditto. (*rep_stosqi): Ditto. (cmpstrnsi): Also fail when %ecx is fixed. (*cmpstrnqi_nz_1): Disable when %ecx, %esi or %edi are fixed. (*cmpstrnqi_1): Ditto. (*strlenqi_1): Ditto. (*strmovdi_rex_1): Disable when %esi or %edi are fixed. (*strmovsi_1): Ditto. (*strmovhi_1): Ditto. (*strmovqi_1): Ditto. (*rep_movdi_rex64): Disable when %ecx, %esi or %edi are fixed. (*rep_movsi): Ditto. (*rep_movqi): Ditto. testsuite/ChangeLog: PR target/49920 * gcc.target/i386/pr49920.c: New test. From-SVN: r176979
This commit is contained in:
parent
ba4a11ba52
commit
deb1f6171d
|
@ -1,3 +1,27 @@
|
||||||
|
2011-07-31 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
PR target/49920
|
||||||
|
* config/i386/i386.md (strset): Do not expand strset_singleop
|
||||||
|
when %eax or $edi are fixed.
|
||||||
|
(*strsetdi_rex_1): Disable when %eax or %edi are fixed.
|
||||||
|
(*strsetsi_1): Ditto.
|
||||||
|
(*strsethi_1): Ditto.
|
||||||
|
(*strsetqi_1): Ditto.
|
||||||
|
(*rep_stosdi_rex64): Disable when %eax, %ecx or %edi are fixed.
|
||||||
|
(*rep_stossi): Ditto.
|
||||||
|
(*rep_stosqi): Ditto.
|
||||||
|
(cmpstrnsi): Also fail when %ecx is fixed.
|
||||||
|
(*cmpstrnqi_nz_1): Disable when %ecx, %esi or %edi are fixed.
|
||||||
|
(*cmpstrnqi_1): Ditto.
|
||||||
|
(*strlenqi_1): Ditto.
|
||||||
|
(*strmovdi_rex_1): Disable when %esi or %edi are fixed.
|
||||||
|
(*strmovsi_1): Ditto.
|
||||||
|
(*strmovhi_1): Ditto.
|
||||||
|
(*strmovqi_1): Ditto.
|
||||||
|
(*rep_movdi_rex64): Disable when %ecx, %esi or %edi are fixed.
|
||||||
|
(*rep_movsi): Ditto.
|
||||||
|
(*rep_movqi): Ditto.
|
||||||
|
|
||||||
2011-07-31 Mikael Pettersson <mikpe@it.uu.se>
|
2011-07-31 Mikael Pettersson <mikpe@it.uu.se>
|
||||||
|
|
||||||
PR target/47908
|
PR target/47908
|
||||||
|
@ -40,8 +64,7 @@
|
||||||
Use scaninvent instead of /proc/cpuinfo if __sgi__.
|
Use scaninvent instead of /proc/cpuinfo if __sgi__.
|
||||||
* config.host: Also use driver-native.o, mips/x-native on
|
* config.host: Also use driver-native.o, mips/x-native on
|
||||||
mips-sgi-irix*.
|
mips-sgi-irix*.
|
||||||
* config/mips/iris6.h [__mips__] (host_detect_local_cpu):
|
* config/mips/iris6.h [__mips__] (host_detect_local_cpu): Declare.
|
||||||
Declare.
|
|
||||||
(EXTRA_SPEC_FUNCTIONS, MARCH_MTUNE_NATIVE_SPECS): Define.
|
(EXTRA_SPEC_FUNCTIONS, MARCH_MTUNE_NATIVE_SPECS): Define.
|
||||||
(DRIVER_SELF_SPECS): Add MARCH_MTUNE_NATIVE_SPECS.
|
(DRIVER_SELF_SPECS): Add MARCH_MTUNE_NATIVE_SPECS.
|
||||||
|
|
||||||
|
|
|
@ -15421,7 +15421,8 @@
|
||||||
(set (match_operand:DI 1 "register_operand" "=S")
|
(set (match_operand:DI 1 "register_operand" "=S")
|
||||||
(plus:DI (match_dup 3)
|
(plus:DI (match_dup 3)
|
||||||
(const_int 8)))]
|
(const_int 8)))]
|
||||||
"TARGET_64BIT"
|
"TARGET_64BIT
|
||||||
|
&& !(fixed_regs[SI_REG] || fixed_regs[DI_REG])"
|
||||||
"movsq"
|
"movsq"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "memory" "both")
|
(set_attr "memory" "both")
|
||||||
|
@ -15436,7 +15437,7 @@
|
||||||
(set (match_operand:P 1 "register_operand" "=S")
|
(set (match_operand:P 1 "register_operand" "=S")
|
||||||
(plus:P (match_dup 3)
|
(plus:P (match_dup 3)
|
||||||
(const_int 4)))]
|
(const_int 4)))]
|
||||||
""
|
"!(fixed_regs[SI_REG] || fixed_regs[DI_REG])"
|
||||||
"movs{l|d}"
|
"movs{l|d}"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "memory" "both")
|
(set_attr "memory" "both")
|
||||||
|
@ -15451,7 +15452,7 @@
|
||||||
(set (match_operand:P 1 "register_operand" "=S")
|
(set (match_operand:P 1 "register_operand" "=S")
|
||||||
(plus:P (match_dup 3)
|
(plus:P (match_dup 3)
|
||||||
(const_int 2)))]
|
(const_int 2)))]
|
||||||
""
|
"!(fixed_regs[SI_REG] || fixed_regs[DI_REG])"
|
||||||
"movsw"
|
"movsw"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "memory" "both")
|
(set_attr "memory" "both")
|
||||||
|
@ -15466,7 +15467,7 @@
|
||||||
(set (match_operand:P 1 "register_operand" "=S")
|
(set (match_operand:P 1 "register_operand" "=S")
|
||||||
(plus:P (match_dup 3)
|
(plus:P (match_dup 3)
|
||||||
(const_int 1)))]
|
(const_int 1)))]
|
||||||
""
|
"!(fixed_regs[SI_REG] || fixed_regs[DI_REG])"
|
||||||
"movsb"
|
"movsb"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "memory" "both")
|
(set_attr "memory" "both")
|
||||||
|
@ -15501,7 +15502,8 @@
|
||||||
(set (mem:BLK (match_dup 3))
|
(set (mem:BLK (match_dup 3))
|
||||||
(mem:BLK (match_dup 4)))
|
(mem:BLK (match_dup 4)))
|
||||||
(use (match_dup 5))]
|
(use (match_dup 5))]
|
||||||
"TARGET_64BIT"
|
"TARGET_64BIT
|
||||||
|
&& !(fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG])"
|
||||||
"rep{%;} movsq"
|
"rep{%;} movsq"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "prefix_rep" "1")
|
(set_attr "prefix_rep" "1")
|
||||||
|
@ -15520,7 +15522,7 @@
|
||||||
(set (mem:BLK (match_dup 3))
|
(set (mem:BLK (match_dup 3))
|
||||||
(mem:BLK (match_dup 4)))
|
(mem:BLK (match_dup 4)))
|
||||||
(use (match_dup 5))]
|
(use (match_dup 5))]
|
||||||
""
|
"!(fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG])"
|
||||||
"rep{%;} movs{l|d}"
|
"rep{%;} movs{l|d}"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "prefix_rep" "1")
|
(set_attr "prefix_rep" "1")
|
||||||
|
@ -15537,7 +15539,7 @@
|
||||||
(set (mem:BLK (match_dup 3))
|
(set (mem:BLK (match_dup 3))
|
||||||
(mem:BLK (match_dup 4)))
|
(mem:BLK (match_dup 4)))
|
||||||
(use (match_dup 5))]
|
(use (match_dup 5))]
|
||||||
""
|
"!(fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG])"
|
||||||
"rep{%;} movsb"
|
"rep{%;} movsb"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "prefix_rep" "1")
|
(set_attr "prefix_rep" "1")
|
||||||
|
@ -15580,7 +15582,9 @@
|
||||||
operands[3] = gen_rtx_PLUS (Pmode, operands[0],
|
operands[3] = gen_rtx_PLUS (Pmode, operands[0],
|
||||||
GEN_INT (GET_MODE_SIZE (GET_MODE
|
GEN_INT (GET_MODE_SIZE (GET_MODE
|
||||||
(operands[2]))));
|
(operands[2]))));
|
||||||
if (TARGET_SINGLE_STRINGOP || optimize_insn_for_size_p ())
|
/* Can't use this if the user has appropriated eax or edi. */
|
||||||
|
if ((TARGET_SINGLE_STRINGOP || optimize_insn_for_size_p ())
|
||||||
|
&& !(fixed_regs[AX_REG] || fixed_regs[DI_REG]))
|
||||||
{
|
{
|
||||||
emit_insn (gen_strset_singleop (operands[0], operands[1], operands[2],
|
emit_insn (gen_strset_singleop (operands[0], operands[1], operands[2],
|
||||||
operands[3]));
|
operands[3]));
|
||||||
|
@ -15602,7 +15606,8 @@
|
||||||
(set (match_operand:DI 0 "register_operand" "=D")
|
(set (match_operand:DI 0 "register_operand" "=D")
|
||||||
(plus:DI (match_dup 1)
|
(plus:DI (match_dup 1)
|
||||||
(const_int 8)))]
|
(const_int 8)))]
|
||||||
"TARGET_64BIT"
|
"TARGET_64BIT
|
||||||
|
&& !(fixed_regs[AX_REG] || fixed_regs[DI_REG])"
|
||||||
"stosq"
|
"stosq"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "memory" "store")
|
(set_attr "memory" "store")
|
||||||
|
@ -15614,7 +15619,7 @@
|
||||||
(set (match_operand:P 0 "register_operand" "=D")
|
(set (match_operand:P 0 "register_operand" "=D")
|
||||||
(plus:P (match_dup 1)
|
(plus:P (match_dup 1)
|
||||||
(const_int 4)))]
|
(const_int 4)))]
|
||||||
""
|
"!(fixed_regs[AX_REG] || fixed_regs[DI_REG])"
|
||||||
"stos{l|d}"
|
"stos{l|d}"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "memory" "store")
|
(set_attr "memory" "store")
|
||||||
|
@ -15626,7 +15631,7 @@
|
||||||
(set (match_operand:P 0 "register_operand" "=D")
|
(set (match_operand:P 0 "register_operand" "=D")
|
||||||
(plus:P (match_dup 1)
|
(plus:P (match_dup 1)
|
||||||
(const_int 2)))]
|
(const_int 2)))]
|
||||||
""
|
"!(fixed_regs[AX_REG] || fixed_regs[DI_REG])"
|
||||||
"stosw"
|
"stosw"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "memory" "store")
|
(set_attr "memory" "store")
|
||||||
|
@ -15638,7 +15643,7 @@
|
||||||
(set (match_operand:P 0 "register_operand" "=D")
|
(set (match_operand:P 0 "register_operand" "=D")
|
||||||
(plus:P (match_dup 1)
|
(plus:P (match_dup 1)
|
||||||
(const_int 1)))]
|
(const_int 1)))]
|
||||||
""
|
"!(fixed_regs[AX_REG] || fixed_regs[DI_REG])"
|
||||||
"stosb"
|
"stosb"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "memory" "store")
|
(set_attr "memory" "store")
|
||||||
|
@ -15669,7 +15674,8 @@
|
||||||
(const_int 0))
|
(const_int 0))
|
||||||
(use (match_operand:DI 2 "register_operand" "a"))
|
(use (match_operand:DI 2 "register_operand" "a"))
|
||||||
(use (match_dup 4))]
|
(use (match_dup 4))]
|
||||||
"TARGET_64BIT"
|
"TARGET_64BIT
|
||||||
|
&& !(fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])"
|
||||||
"rep{%;} stosq"
|
"rep{%;} stosq"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "prefix_rep" "1")
|
(set_attr "prefix_rep" "1")
|
||||||
|
@ -15686,7 +15692,7 @@
|
||||||
(const_int 0))
|
(const_int 0))
|
||||||
(use (match_operand:SI 2 "register_operand" "a"))
|
(use (match_operand:SI 2 "register_operand" "a"))
|
||||||
(use (match_dup 4))]
|
(use (match_dup 4))]
|
||||||
""
|
"!(fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])"
|
||||||
"rep{%;} stos{l|d}"
|
"rep{%;} stos{l|d}"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "prefix_rep" "1")
|
(set_attr "prefix_rep" "1")
|
||||||
|
@ -15702,7 +15708,7 @@
|
||||||
(const_int 0))
|
(const_int 0))
|
||||||
(use (match_operand:QI 2 "register_operand" "a"))
|
(use (match_operand:QI 2 "register_operand" "a"))
|
||||||
(use (match_dup 4))]
|
(use (match_dup 4))]
|
||||||
""
|
"!(fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])"
|
||||||
"rep{%;} stosb"
|
"rep{%;} stosb"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "prefix_rep" "1")
|
(set_attr "prefix_rep" "1")
|
||||||
|
@ -15727,8 +15733,8 @@
|
||||||
if (optimize_insn_for_size_p () && !TARGET_INLINE_ALL_STRINGOPS)
|
if (optimize_insn_for_size_p () && !TARGET_INLINE_ALL_STRINGOPS)
|
||||||
FAIL;
|
FAIL;
|
||||||
|
|
||||||
/* Can't use this if the user has appropriated esi or edi. */
|
/* Can't use this if the user has appropriated ecx, esi or edi. */
|
||||||
if (fixed_regs[SI_REG] || fixed_regs[DI_REG])
|
if (fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG])
|
||||||
FAIL;
|
FAIL;
|
||||||
|
|
||||||
out = operands[0];
|
out = operands[0];
|
||||||
|
@ -15823,7 +15829,7 @@
|
||||||
(clobber (match_operand:P 0 "register_operand" "=S"))
|
(clobber (match_operand:P 0 "register_operand" "=S"))
|
||||||
(clobber (match_operand:P 1 "register_operand" "=D"))
|
(clobber (match_operand:P 1 "register_operand" "=D"))
|
||||||
(clobber (match_operand:P 2 "register_operand" "=c"))]
|
(clobber (match_operand:P 2 "register_operand" "=c"))]
|
||||||
""
|
"!(fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG])"
|
||||||
"repz{%;} cmpsb"
|
"repz{%;} cmpsb"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "mode" "QI")
|
(set_attr "mode" "QI")
|
||||||
|
@ -15863,7 +15869,7 @@
|
||||||
(clobber (match_operand:P 0 "register_operand" "=S"))
|
(clobber (match_operand:P 0 "register_operand" "=S"))
|
||||||
(clobber (match_operand:P 1 "register_operand" "=D"))
|
(clobber (match_operand:P 1 "register_operand" "=D"))
|
||||||
(clobber (match_operand:P 2 "register_operand" "=c"))]
|
(clobber (match_operand:P 2 "register_operand" "=c"))]
|
||||||
""
|
"!(fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG])"
|
||||||
"repz{%;} cmpsb"
|
"repz{%;} cmpsb"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "mode" "QI")
|
(set_attr "mode" "QI")
|
||||||
|
@ -15904,7 +15910,7 @@
|
||||||
(match_operand:P 4 "register_operand" "0")] UNSPEC_SCAS))
|
(match_operand:P 4 "register_operand" "0")] UNSPEC_SCAS))
|
||||||
(clobber (match_operand:P 1 "register_operand" "=D"))
|
(clobber (match_operand:P 1 "register_operand" "=D"))
|
||||||
(clobber (reg:CC FLAGS_REG))]
|
(clobber (reg:CC FLAGS_REG))]
|
||||||
""
|
"!(fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])"
|
||||||
"repnz{%;} scasb"
|
"repnz{%;} scasb"
|
||||||
[(set_attr "type" "str")
|
[(set_attr "type" "str")
|
||||||
(set_attr "mode" "QI")
|
(set_attr "mode" "QI")
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2011-07-31 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
PR target/49920
|
||||||
|
* gcc.target/i386/pr49920.c: New test.
|
||||||
|
|
||||||
2011-07-31 Uros Bizjak <ubizjak@gmail.com>
|
2011-07-31 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
* gcc.dg/tree-ssa/20050314-1.c: Dump and cleanup lim1 pass only.
|
* gcc.dg/tree-ssa/20050314-1.c: Dump and cleanup lim1 pass only.
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O2" } */
|
||||||
|
/* { dg-require-effective-target ia32 } */
|
||||||
|
|
||||||
|
typedef __SIZE_TYPE__ size_t;
|
||||||
|
extern void *malloc (size_t);
|
||||||
|
|
||||||
|
register unsigned int MR_mr0 asm ("esi");
|
||||||
|
register unsigned int MR_mr1 asm ("edi");
|
||||||
|
|
||||||
|
void ml_backend__ml_closure_gen_module11 (void)
|
||||||
|
{
|
||||||
|
unsigned int MR_tempr1, MR_tempr2, MR_tempr3;
|
||||||
|
|
||||||
|
MR_tempr1 = (unsigned int)((char *) malloc (sizeof (unsigned int)) + 4);
|
||||||
|
MR_tempr3 = ((unsigned int *) MR_mr0)[0];
|
||||||
|
|
||||||
|
((unsigned int *) (MR_tempr1 - 4))[0] = MR_tempr3;
|
||||||
|
|
||||||
|
MR_tempr2 = (unsigned int)((char *) malloc (2 * sizeof (unsigned int)));
|
||||||
|
|
||||||
|
((unsigned int *) MR_tempr2)[1] = MR_tempr1;
|
||||||
|
}
|
Loading…
Reference in New Issue