Commit e207e41f by Uros Bizjak Committed by Uros Bizjak

re PR target/47369 ([x32] internal compiler error: in extract_insn, at recog.c:2109)

	PR target/47369
	PR target/49853
	* config/i386/i386.c (ix86_expand_move): Call convert_to_mode
	if legitimize_tls_address returned operand in wrong mode. Allow
	SImode and DImode symbolic operand for PIC.  Call convert_to_mode
	if legitimize_pic_address returned operand in wrong mode.


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

From-SVN: r176798
parent 842eeb9b
2011-07-26 Uros Bizjak <ubizjak@gmail.com>
H.J. Lu <hongjiu.lu@intel.com>
PR target/47369
PR target/49853
* config/i386/i386.c (ix86_expand_move): Call convert_to_mode
if legitimize_tls_address returned operand in wrong mode. Allow
SImode and DImode symbolic operand for PIC. Call convert_to_mode
if legitimize_pic_address returned operand in wrong mode.
2011-07-26 Martin Jambor <mjambor@suse.cz> 2011-07-26 Martin Jambor <mjambor@suse.cz>
* tree-sra.c (tree_non_mode_aligned_mem_p): Strip conversions and * tree-sra.c (tree_non_mode_aligned_mem_p): Strip conversions and
......
...@@ -15028,11 +15028,14 @@ ix86_expand_move (enum machine_mode mode, rtx operands[]) ...@@ -15028,11 +15028,14 @@ ix86_expand_move (enum machine_mode mode, rtx operands[])
op0, 1, OPTAB_DIRECT); op0, 1, OPTAB_DIRECT);
if (tmp == op0) if (tmp == op0)
return; return;
if (GET_MODE (tmp) != mode)
op1 = convert_to_mode (mode, tmp, 1);
} }
} }
if ((flag_pic || MACHOPIC_INDIRECT) if ((flag_pic || MACHOPIC_INDIRECT)
&& mode == Pmode && symbolic_operand (op1, Pmode)) && (mode == SImode || mode == DImode)
&& symbolic_operand (op1, mode))
{ {
if (TARGET_MACHO && !TARGET_64BIT) if (TARGET_MACHO && !TARGET_64BIT)
{ {
...@@ -15073,13 +15076,15 @@ ix86_expand_move (enum machine_mode mode, rtx operands[]) ...@@ -15073,13 +15076,15 @@ ix86_expand_move (enum machine_mode mode, rtx operands[])
else else
{ {
if (MEM_P (op0)) if (MEM_P (op0))
op1 = force_reg (Pmode, op1); op1 = force_reg (mode, op1);
else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, Pmode)) else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, mode))
{ {
rtx reg = can_create_pseudo_p () ? NULL_RTX : op0; rtx reg = can_create_pseudo_p () ? NULL_RTX : op0;
op1 = legitimize_pic_address (op1, reg); op1 = legitimize_pic_address (op1, reg);
if (op0 == op1) if (op0 == op1)
return; return;
if (GET_MODE (op1) != mode)
op1 = convert_to_mode (mode, op1, 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