diff options
author | Ian Lance Taylor <iant@google.com> | 2007-02-13 22:18:26 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2007-02-13 22:18:26 +0000 |
commit | 30d18db4847eb0995d65531e117c7fe75d1fc428 (patch) | |
tree | 7617ca582c6dc030410b09053bf05cad7cd5be52 | |
parent | 291f172e6263f25c3183b3d55bab244d6f261296 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/lower-subreg.c | 19 |
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. */ |