aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2007-02-13 22:18:26 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2007-02-13 22:18:26 +0000
commit30d18db4847eb0995d65531e117c7fe75d1fc428 (patch)
tree7617ca582c6dc030410b09053bf05cad7cd5be52 /gcc
parent291f172e6263f25c3183b3d55bab244d6f261296 (diff)
downloadgcc-30d18db4847eb0995d65531e117c7fe75d1fc428.zip
gcc-30d18db4847eb0995d65531e117c7fe75d1fc428.tar.gz
gcc-30d18db4847eb0995d65531e117c7fe75d1fc428.tar.bz2
re PR middle-end/30751 (internal compiler error: in extract_insn, at recog.c:2108)
PR middle-end/30751 * lower-subreg.c (resolve_simple_move): Decompose subregs in addresses. From-SVN: r121894
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/lower-subreg.c19
2 files changed, 24 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a4bd60e..d504109 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-02-13 Ian Lance Taylor <iant@google.com>
+
+ PR middle-end/30751
+ * lower-subreg.c (resolve_simple_move): Decompose subregs in
+ addresses.
+
2007-02-13 Stuart Hastings <stuart@apple.com>
* gcc/config/i386/i386.md (fixuns_truncdfhi2): Require SSE2.
diff --git a/gcc/lower-subreg.c b/gcc/lower-subreg.c
index fbb506c5..908b10e 100644
--- a/gcc/lower-subreg.c
+++ b/gcc/lower-subreg.c
@@ -501,7 +501,7 @@ resolve_subreg_use (rtx *px, void *data)
that the note must be removed. */
if (!x)
{
- gcc_assert(!insn);
+ gcc_assert (!insn);
return 1;
}
@@ -711,6 +711,23 @@ resolve_simple_move (rtx set, rtx insn)
return insn;
}
+ /* It's possible for the code to use a subreg of a decomposed
+ register while forming an address. We need to handle that before
+ passing the address to emit_move_insn. We pass NULL_RTX as the
+ insn parameter to resolve_subreg_use because we can not validate
+ the insn yet. */
+ if (MEM_P (src) || MEM_P (dest))
+ {
+ int acg;
+
+ if (MEM_P (src))
+ for_each_rtx (&XEXP (src, 0), resolve_subreg_use, NULL_RTX);
+ if (MEM_P (dest))
+ for_each_rtx (&XEXP (dest, 0), resolve_subreg_use, NULL_RTX);
+ acg = apply_change_group ();
+ gcc_assert (acg);
+ }
+
/* If SRC is a register which we can't decompose, or has side
effects, we need to move via a temporary register. */