re PR target/47369 ([x32] internal compiler error: in extract_insn, at recog.c:2109)
authorUros Bizjak <ubizjak@gmail.com>
Tue, 26 Jul 2011 18:03:54 +0000 (20:03 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 26 Jul 2011 18:03:54 +0000 (20:03 +0200)
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

gcc/ChangeLog
gcc/config/i386/i386.c

index bc2fd587c1b346488cde5214251c26aa9196416b..06e00746f8c8aa9b29c2e0672f30390243451a63 100644 (file)
@@ -1,3 +1,13 @@
+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>
 
        * tree-sra.c (tree_non_mode_aligned_mem_p): Strip conversions and
index 3668357e290d13a82cf79d6a2ae74c10a7912ac0..429cd6271cae9e0af5b050a41a7cd343aad6adbb 100644 (file)
@@ -15028,11 +15028,14 @@ ix86_expand_move (enum machine_mode mode, rtx operands[])
                                     op0, 1, OPTAB_DIRECT);
          if (tmp == op0)
            return;
+         if (GET_MODE (tmp) != mode)
+           op1 = convert_to_mode (mode, tmp, 1);
        }
     }
 
   if ((flag_pic || MACHOPIC_INDIRECT) 
-       && mode == Pmode && symbolic_operand (op1, Pmode))
+      && (mode == SImode || mode == DImode)
+      && symbolic_operand (op1, mode))
     {
       if (TARGET_MACHO && !TARGET_64BIT)
        {
@@ -15073,13 +15076,15 @@ ix86_expand_move (enum machine_mode mode, rtx operands[])
       else
        {
          if (MEM_P (op0))
-           op1 = force_reg (Pmode, op1);
-         else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, Pmode))
+           op1 = force_reg (mode, op1);
+         else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, mode))
            {
              rtx reg = can_create_pseudo_p () ? NULL_RTX : op0;
              op1 = legitimize_pic_address (op1, reg);
              if (op0 == op1)
                return;
+             if (GET_MODE (op1) != mode)
+               op1 = convert_to_mode (mode, op1, 1);
            }
        }
     }