Re: middle-end/10475: [3.2/3.3/3.4 regression] ICE in subreg_highpart_offset for code with long long

Arend Bayer <[email protected]>
Newsgroups gmane.comp.gcc.bugs,gmane.comp.gcc.prs
Message-ID <[email protected]>
http://gcc.gnu.org/PR10475

This happens when emit_store_flag() gets passed two long integers, the
2nd being 0 and the code being EQ or NE.

This call

/* If we are comparing a double-word integer with zero, we can convert
     the comparison into one involving a single word.  */
  if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD * 2
      && GET_MODE_CLASS (mode) == MODE_INT
      && op1 == const0_rtx
      && (GET_CODE (op0) != MEM || ! MEM_VOLATILE_P (op0)))
    {
      if (code == EQ || code == NE)
        {
          /* Do a logical OR of the two words and compare the result.  * */
          rtx op0h = gen_highpart (word_mode, op0);
          rtx op0l = gen_lowpart (word_mode, op0);

to gen_highpart silently assumes that GET_MODE (op0) == mode. But
if op0 is CONST_INT, it has VOIDmode, of course.

The patch (against HEAD on 2003-05-21) below makes the ICE go away, but of
course one might want to do s.th. more intelligent with a comparison of
two integer constants...

(And another solution would of course be to teach gen_highpart () to
handle integer constants.)

Arend


Index: gcc/expmed.c
===================================================================
RCS file: /cvsroot/gcc/gcc/gcc/expmed.c,v
retrieving revision 1.133
diff -u -p -r1.133 expmed.c
--- gcc/expmed.c	21 Apr 2003 21:32:00 -0000	1.133
+++ gcc/expmed.c	21 May 2003 14:17:20 -0000
@@ -4350,7 +4350,8 @@ emit_store_flag (target, code, op0, op1,
   if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD * 2
       && GET_MODE_CLASS (mode) == MODE_INT
       && op1 == const0_rtx
-      && (GET_CODE (op0) != MEM || ! MEM_VOLATILE_P (op0)))
+      && (GET_CODE (op0) != MEM || ! MEM_VOLATILE_P (op0))
+      && GET_CODE (op0) != CONST_INT)
     {
       if (code == EQ || code == NE)
 	{
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.