Bug 17036 - [4.0 Regression] ICE: (A >> N) & 1 ? (1 << N) : 0 where A of type unsigned int
Summary: [4.0 Regression] ICE: (A >> N) & 1 ? (1 << N) : 0 where A of type unsigned int
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 4.0.0
: P2 critical
Target Milestone: 4.0.0
Assignee: Not yet assigned to anyone
URL:
Keywords: ice-on-valid-code, monitored
Depends on:
Blocks:
 
Reported: 2004-08-15 16:55 UTC by Michael Bommarito II
Modified: 2004-10-30 21:12 UTC (History)
3 users (show)

See Also:
Host: i686-pc-linux-gnu
Target: i686-pc-linux-gnu
Build: i686-pc-linux-gnu
Known to work: 3.4.0
Known to fail: 4.0.0
Last reconfirmed: 2004-08-15 17:05:37


Attachments
Preprocessed bug example source (3.30 KB, application/x-bzip2)
2004-08-15 16:57 UTC, Michael Bommarito II
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Michael Bommarito II 2004-08-15 16:55:30 UTC
The error is easily reproducible outside of the conditions of the kernel code,
and, as I'm sure you'd appreciate, I have written an example that successfully
duplicates the exact ICE as below.  Attached is the significantly smaller
preprocessed example, compressed at 3k, in lieu of the 46k compressed kernel
driver :)  

System: i686-pc-linux-gnu (Fedora 2 release, kernel 2.6.7-1.494.2.2, athlon-xp
1800+)

GCC Version: 3.5.0 20040801 (experimental)

GCC ./configure Options: --enable-threads --with-cpu=athlon-xp
--with-arch=athlon-xp --enable-languages=c,c++

Command: 
[root@epithumadze linux-2.6.8]# make modules V=1
...
make -f scripts/Makefile.build obj=sound/synth/emux

gcc -Wp,-MD,sound/synth/emux/.emux_oss.o.d -nostdinc -iwithprefix include
-D__KERNEL__ -Iinclude  -Wall -Wstrict-prototypes -Wno-trigraphs
-fno-strict-aliasing -fno-common -pipe -msoft-float -mpreferred-stack-boundary=2
-fno-unit-at-a-time -march=athlon -mregparm=3 -Iinclude/asm-i386/mach-default
-O2 -fomit-frame-pointer -Wdeclaration-after-statement   -DMODULE
-DKBUILD_BASENAME=emux_oss -DKBUILD_MODNAME=snd_emux_synth -c -o
sound/synth/emux/emux_oss.o sound/synth/emux/emux_oss.c

Compiler Output:
sound/synth/emux/emux_oss.c: In function `emuspec_control':
sound/synth/emux/emux_oss.c:400: internal compiler error: tree check: expected
integer_cst, have var_decl in fold, at fold-const.c:8855
Comment 1 Michael Bommarito II 2004-08-15 16:57:25 UTC
Created attachment 6932 [details]
Preprocessed bug example source
Comment 2 Andrew Pinski 2004-08-15 17:05:37 UTC
Confirmed
: Search converges between 2004-06-20-trunk (#469) and 2004-06-22-trunk (#470).
Reduced to:
int main( int argc, char **arg )
{
 int R , N = 4;
 unsigned int A = 2;
 signed int B = 2;
 ((B >> N) & 1) ? 1 : 0;
 ((A >> N) & 1) ? 1 : 0;
 return 0;
}


Looks like someone forgets to check to make sure that the N is really a constant.
Comment 3 graham.stott 2004-08-15 18:05:14 UTC
Subject: Re:  [3.5 Regression] ICE: (A >> N) & 1 ? (1
 << N) : 0 where A of type unsigned int

pinskia at gcc dot gnu dot org wrote:
> ------- Additional Comments From pinskia at gcc dot gnu dot org  2004-08-15 17:05 -------
> Confirmed
> : Search converges between 2004-06-20-trunk (#469) and 2004-06-22-trunk (#470).
> Reduced to:
> int main( int argc, char **arg )
> {
>  int R , N = 4;
>  unsigned int A = 2;
>  signed int B = 2;
>  ((B >> N) & 1) ? 1 : 0;
>  ((A >> N) & 1) ? 1 : 0;
>  return 0;
> }
> 
> 
> Looks like someone forgets to check to make sure that the N is really a constant.
> 

This patch should fixit but I don't have time to do a full bootstrap and
regression test on the patch.

-------------------------------------------------------------------
Index: fold-const.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/fold-const.c,v
retrieving revision 1.435
diff -c -p -r1.435 fold-const.c
*** fold-const.c        12 Aug 2004 04:01:04 -0000      1.435
--- fold-const.c        15 Aug 2004 17:53:10 -0000
*************** fold (tree expr)
*** 8874,8879 ****
--- 8874,8880 ----
           tree tem = TREE_OPERAND (arg0, 0);
           STRIP_NOPS (tem);
           if (TREE_CODE (tem) == RSHIFT_EXPR
+             && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
                 && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
             return fold (build2 (BIT_AND_EXPR, type,
-------------------------------------------------------------------
Comment 4 Michael Bommarito II 2004-08-15 18:57:33 UTC
> This patch should fixit but I don't have time to do a full bootstrap and
> regression test on the patch.
> 
> -------------------------------------------------------------------
> Index: fold-const.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/fold-const.c,v
> retrieving revision 1.435
> diff -c -p -r1.435 fold-const.c
> *** fold-const.c        12 Aug 2004 04:01:04 -0000      1.435
> --- fold-const.c        15 Aug 2004 17:53:10 -0000
> *************** fold (tree expr)
> *** 8874,8879 ****
> --- 8874,8880 ----
>            tree tem = TREE_OPERAND (arg0, 0);
>            STRIP_NOPS (tem);
>            if (TREE_CODE (tem) == RSHIFT_EXPR
> +             && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
>                  && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
>                   TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
>              return fold (build2 (BIT_AND_EXPR, type,
> -------------------------------------------------------------------
> 

When patched against the 20040801 tree that I had initially generated the error
on, it successfully recompiled and properly generated the code.  Thanks to both
of you for the quick response time :)
Comment 5 paolo.bonzini@polimi.it 2004-08-16 07:19:33 UTC
Subject: Re:  [3.5 Regression] ICE: (A >> N) & 1 ? (1
 << N) : 0 where A of type unsigned int

>>This patch should fixit but I don't have time to do a full bootstrap and
>>regression test on the patch.

Starting a bootstrap and regression test now, will commit as obvious if 
it succeeds.  Thanks for investigating this.

Paolo

Comment 6 GCC Commits 2004-08-17 07:40:34 UTC
Subject: Bug 17036

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	bonzini@gcc.gnu.org	2004-08-17 07:40:23

Modified files:
	gcc            : ChangeLog fold-const.c 
	gcc/testsuite  : ChangeLog 
Added files:
	gcc/testsuite/gcc.dg: pr17036-1.c 

Log message:
	gcc/ChangeLog:
	2004-08-17  Paolo Bonzini  <bonzini@gnu.org>
	
	PR middle-end/17036
	* fold-const.c (fold): Check for integer operand when
	folding (A >> N) & 1 ? (1 << N) : 0.  Fix from Andrew
	Pinski  <pinskia@physics.uc.edu>.
	
	gcc/testsuite/ChangeLog:
	2004-08-17  Paolo Bonzini  <bonzini@gnu.org>
	
	* gcc.dg/pr17036-1.c: New test.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.4931&r2=2.4932
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fold-const.c.diff?cvsroot=gcc&r1=1.436&r2=1.437
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.4145&r2=1.4146
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/pr17036-1.c.diff?cvsroot=gcc&r1=NONE&r2=1.1

Comment 7 Andrew Pinski 2004-08-17 08:19:37 UTC
Fixed.