Commit 6a2d136b by Eric Botcazou Committed by Eric Botcazou

re PR rtl-optimization/14235 (ICE in verify_local_live_at start (flow.c:546))

	PR optimization/14235
	* expr.c (convert_move): Copy the source to a new pseudo
	when converting from a sub-word source to a larger-than-word
	register which conflicts with the source.

From-SVN: r78893
parent 3205a71e
2004-03-04 Eric Botcazou <ebotcazou@libertysurf.fr>
PR optimization/14235
* expr.c (convert_move): Copy the source to a new pseudo
when converting from a sub-word source to a larger-than-word
register which conflicts with the source.
2004-03-03 Zack Weinberg <zack@codesourcery.com>
PR 13728
......
......@@ -682,7 +682,11 @@ convert_move (rtx to, rtx from, int unsignedp)
!= CODE_FOR_nothing))
{
if (GET_CODE (to) == REG)
emit_insn (gen_rtx_CLOBBER (VOIDmode, to));
{
if (reg_overlap_mentioned_p (to, from))
from = force_reg (from_mode, from);
emit_insn (gen_rtx_CLOBBER (VOIDmode, to));
}
convert_move (gen_lowpart (word_mode, to), from, unsignedp);
emit_unop_insn (code, to,
gen_lowpart (word_mode, to), equiv_code);
......
2004-03-04 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.c-torture/compile/20040304-1.c: New test.
2004-03-03 Zack Weinberg <zack@codesourcery.com>
PR 13728
......
/* PR optimization/14235 */
/* Origin: <senor_fjord@yahoo.com> */
typedef signed char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef unsigned long long uint64_t;
static const uint64_t LOW_BYTE_MASK = 0x00000000000000ffULL;
static const uint64_t HIGH_BYTE_MASK = 0x000000000000ff00ULL;
static const uint64_t WORD_MASK = 0x000000000000ffffULL;
static const uint64_t DWORD_MASK = 0x00000000ffffffffULL;
extern uint64_t *srca_mask;
extern int *assert_thrown;
void foo()
{
uint64_t tempA = 0; /* actually a bunch of code to set A */
uint64_t tempB = 0; /* actually a bunch of code to set B */
/* cast A to right size */
tempA = (((*srca_mask == LOW_BYTE_MASK) ||
(*srca_mask == HIGH_BYTE_MASK)) ?
((int8_t)tempA) :
((*srca_mask == WORD_MASK) ?
((int16_t)tempA) :
((*srca_mask == DWORD_MASK) ?
((int32_t)tempA) :
tempA)));
/* cast B to right size */
tempB = (((*srca_mask == LOW_BYTE_MASK) ||
(*srca_mask == HIGH_BYTE_MASK)) ?
((int8_t)tempB) :
((*srca_mask == WORD_MASK) ?
((int16_t)tempB) :
((*srca_mask == DWORD_MASK) ?
((int32_t)tempB) :
tempB)));
if ((int) tempA > (int) tempB) {
*assert_thrown = 1;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment