re PR target/58853 (ICE in expand_set_or_movmem_prologue_epilogue_by_misaligned_moves)

PR target/58853
	* config/i386/x86-tune.def
	(X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES): Rename from
	TARGET_MISALIGNED_MOVE_STRING_PROLOGUES.
	* config/i386/i386.h
	(TARGET_MISALIGNED_MOVE_STRING_PRO_EPILOGUES): Rename from
	TARGET_MISALIGNED_MOVE_STRING_PROLOGUES_EPILOGUES.  Update for renamed
	X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES.
	* config/i386/i386.c (ix86_expand_set_or_movmem): Use
	TARGET_MISALIGNED_MOVE_STRING_PRO_EPILOGUES to calculate
	misaligned_prologue_used.  Check that
	desired_aling <= epilogue_size_needed.

testsuite/ChangeLog:

	PR target/58853
	* gcc.target/i386/pr58853.c: New test.


Co-Authored-By: H.J. Lu <hongjiu.lu@intel.com>

From-SVN: r204685
This commit is contained in:
Uros Bizjak 2013-11-11 21:02:19 +01:00 committed by Uros Bizjak
parent eb47f18904
commit 5783ad0ea7
6 changed files with 48 additions and 16 deletions

View File

@ -1,3 +1,19 @@
2013-11-11 Uros Bizjak <ubizjak@gmail.com>
H.J. Lu <hongjiu.lu@intel.com>
PR target/58853
* config/i386/x86-tune.def
(X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES): Rename from
TARGET_MISALIGNED_MOVE_STRING_PROLOGUES.
* config/i386/i386.h
(TARGET_MISALIGNED_MOVE_STRING_PRO_EPILOGUES): Rename from
TARGET_MISALIGNED_MOVE_STRING_PROLOGUES_EPILOGUES. Update for renamed
X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES.
* config/i386/i386.c (ix86_expand_set_or_movmem): Use
TARGET_MISALIGNED_MOVE_STRING_PRO_EPILOGUES to calculate
misaligned_prologue_used. Check that
desired_aling <= epilogue_size_needed.
2013-11-11 Cong Hou <congh@google.com> 2013-11-11 Cong Hou <congh@google.com>
PR tree-optimization/59050 PR tree-optimization/59050

View File

@ -23761,13 +23761,15 @@ ix86_expand_set_or_movmem (rtx dst, rtx src, rtx count_exp, rtx val_exp,
} }
gcc_assert (desired_align >= 1 && align >= 1); gcc_assert (desired_align >= 1 && align >= 1);
/* Misaligned move sequences handles both prologues and epilogues at once. /* Misaligned move sequences handle both prologue and epilogue at once.
Default code generation results in smaller code for large alignments and Default code generation results in a smaller code for large alignments
also avoids redundant job when sizes are known precisely. */ and also avoids redundant job when sizes are known precisely. */
misaligned_prologue_used = (TARGET_MISALIGNED_MOVE_STRING_PROLOGUES misaligned_prologue_used
&& MAX (desired_align, epilogue_size_needed) <= 32 = (TARGET_MISALIGNED_MOVE_STRING_PRO_EPILOGUES
&& ((desired_align > align && !align_bytes) && MAX (desired_align, epilogue_size_needed) <= 32
|| (!count && epilogue_size_needed > 1))); && desired_align <= epilogue_size_needed
&& ((desired_align > align && !align_bytes)
|| (!count && epilogue_size_needed > 1)));
/* Do the cheap promotion to allow better CSE across the /* Do the cheap promotion to allow better CSE across the
main loop and epilogue (ie one load of the big constant in the main loop and epilogue (ie one load of the big constant in the

View File

@ -353,8 +353,8 @@ extern unsigned char ix86_tune_features[X86_TUNE_LAST];
#define TARGET_PROMOTE_QImode ix86_tune_features[X86_TUNE_PROMOTE_QIMODE] #define TARGET_PROMOTE_QImode ix86_tune_features[X86_TUNE_PROMOTE_QIMODE]
#define TARGET_FAST_PREFIX ix86_tune_features[X86_TUNE_FAST_PREFIX] #define TARGET_FAST_PREFIX ix86_tune_features[X86_TUNE_FAST_PREFIX]
#define TARGET_SINGLE_STRINGOP ix86_tune_features[X86_TUNE_SINGLE_STRINGOP] #define TARGET_SINGLE_STRINGOP ix86_tune_features[X86_TUNE_SINGLE_STRINGOP]
#define TARGET_MISALIGNED_MOVE_STRING_PROLOGUES_EPILOGUES \ #define TARGET_MISALIGNED_MOVE_STRING_PRO_EPILOGUES \
ix86_tune_features[TARGET_MISALIGNED_MOVE_STRING_PROLOGUES] ix86_tune_features[X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES]
#define TARGET_QIMODE_MATH ix86_tune_features[X86_TUNE_QIMODE_MATH] #define TARGET_QIMODE_MATH ix86_tune_features[X86_TUNE_QIMODE_MATH]
#define TARGET_HIMODE_MATH ix86_tune_features[X86_TUNE_HIMODE_MATH] #define TARGET_HIMODE_MATH ix86_tune_features[X86_TUNE_HIMODE_MATH]
#define TARGET_PROMOTE_QI_REGS ix86_tune_features[X86_TUNE_PROMOTE_QI_REGS] #define TARGET_PROMOTE_QI_REGS ix86_tune_features[X86_TUNE_PROMOTE_QI_REGS]

View File

@ -257,13 +257,13 @@ DEF_TUNE (X86_TUNE_AVOID_MEM_OPND_FOR_CMOVE, "avoid_mem_opnd_for_cmove",
as MOVS and STOS (without a REP prefix) to move/set sequences of bytes. */ as MOVS and STOS (without a REP prefix) to move/set sequences of bytes. */
DEF_TUNE (X86_TUNE_SINGLE_STRINGOP, "single_stringop", m_386 | m_P4_NOCONA) DEF_TUNE (X86_TUNE_SINGLE_STRINGOP, "single_stringop", m_386 | m_P4_NOCONA)
/* TARGET_MISALIGNED_MOVE_STRING_PROLOGUES: Enable generation of compace /* X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES: Enable generation of
prologues and epilogues by issuing a misaligned moves. This require compact prologues and epilogues by issuing a misaligned moves. This
target to handle misaligned moves and partial memory stalls resonably requires target to handle misaligned moves and partial memory stalls
well. reasonably well.
FIXME: This actualy may be a win on more targets than listed here. */ FIXME: This may actualy be a win on more targets than listed here. */
DEF_TUNE (TARGET_MISALIGNED_MOVE_STRING_PROLOGUES, DEF_TUNE (X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES,
"misaligned_move_string_prologues", "misaligned_move_string_pro_epilogues",
m_386 | m_486 | m_CORE_ALL | m_AMD_MULTIPLE | m_GENERIC) m_386 | m_486 | m_CORE_ALL | m_AMD_MULTIPLE | m_GENERIC)
/* X86_TUNE_USE_SAHF: Controls use of SAHF. */ /* X86_TUNE_USE_SAHF: Controls use of SAHF. */

View File

@ -1,3 +1,8 @@
2013-11-11 Uros Bizjak <ubizjak@gmail.com>
PR target/58853
* gcc.target/i386/pr58853.c: New test.
2013-11-11 Joern Rennecke <joern.rennecke@embecosm.com> 2013-11-11 Joern Rennecke <joern.rennecke@embecosm.com>
* gcc.dg/tree-ssa/forwprop-28.c: Adjust for ARC * gcc.dg/tree-ssa/forwprop-28.c: Adjust for ARC

View File

@ -0,0 +1,9 @@
/* { dg-do compile } */
/* { dg-options "-minline-all-stringops" } */
/* { dg-additional-options "-mtune=pentiumpro" { target { ia32 } } } */
void
my_memcpy (char *dest, const char *src, int n)
{
__builtin_memcpy (dest, src, n);
}