aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames E Wilson <wilson@tuliptree.org>2003-06-13 22:13:07 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2003-06-13 22:13:07 +0000
commit54c2fc721cbe654695433d7419cb9b74f3a13642 (patch)
tree2f6993a5122c450524b49fbe107c8f433c414d67
parent7e7de68b893876ebc06e378fcd3a7090fddd0865 (diff)
downloadgcc-54c2fc721cbe654695433d7419cb9b74f3a13642.zip
gcc-54c2fc721cbe654695433d7419cb9b74f3a13642.tar.gz
gcc-54c2fc721cbe654695433d7419cb9b74f3a13642.tar.bz2
re PR bootstrap/10983 ([SPARC64] ICE in verify_wide_reg, at flow.c:551, while compiling libjava)
PR bootstrap/10983 * combine.c (make_extraction): Use gen_lowpart_for_combine when extracting from a REG and not in the destination of a SET. Co-Authored-By: Eric Botcazou <ebotcazou@libertysurf.fr> From-SVN: r67916
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/combine.c49
2 files changed, 34 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c526f71..9a54246 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2003-06-13 Jim Wilson <wilson@tuliptree.org>
+ Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ PR bootstrap/10983
+ * combine.c (make_extraction): Use gen_lowpart_for_combine
+ when extracting from a REG and not in the destination of a SET.
+
2003-06-13 Doug Evans <dje@sebabeach.org>
* tsystem.h (abort): Declare in inhibit_libc case to remove build
diff --git a/gcc/combine.c b/gcc/combine.c
index 3e2f089..1638576 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -6139,30 +6139,35 @@ make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos,
}
else if (GET_CODE (inner) == REG)
{
- /* We can't call gen_lowpart_for_combine here since we always want
- a SUBREG and it would sometimes return a new hard register. */
if (tmode != inner_mode)
{
- HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
-
- if (WORDS_BIG_ENDIAN
- && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
- final_word = ((GET_MODE_SIZE (inner_mode)
- - GET_MODE_SIZE (tmode))
- / UNITS_PER_WORD) - final_word;
-
- final_word *= UNITS_PER_WORD;
- if (BYTES_BIG_ENDIAN &&
- GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode))
- final_word += (GET_MODE_SIZE (inner_mode)
- - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
-
- /* Avoid creating invalid subregs, for example when
- simplifying (x>>32)&255. */
- if (final_word >= GET_MODE_SIZE (inner_mode))
- return NULL_RTX;
-
- new = gen_rtx_SUBREG (tmode, inner, final_word);
+ if (in_dest)
+ {
+ /* We can't call gen_lowpart_for_combine here since we always want
+ a SUBREG and it would sometimes return a new hard register. */
+ HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
+
+ if (WORDS_BIG_ENDIAN
+ && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
+ final_word = ((GET_MODE_SIZE (inner_mode)
+ - GET_MODE_SIZE (tmode))
+ / UNITS_PER_WORD) - final_word;
+
+ final_word *= UNITS_PER_WORD;
+ if (BYTES_BIG_ENDIAN &&
+ GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode))
+ final_word += (GET_MODE_SIZE (inner_mode)
+ - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
+
+ /* Avoid creating invalid subregs, for example when
+ simplifying (x>>32)&255. */
+ if (final_word >= GET_MODE_SIZE (inner_mode))
+ return NULL_RTX;
+
+ new = gen_rtx_SUBREG (tmode, inner, final_word);
+ }
+ else
+ new = gen_lowpart_for_combine (tmode, inner);
}
else
new = inner;