User account creation filtered due to spam.

Bug 26144 - with -O3 and pointer casts, gcc skips if
Summary: with -O3 and pointer casts, gcc skips if
Status: RESOLVED DUPLICATE of bug 21920
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 4.0.3
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-02-07 00:42 UTC by devin@dungeon2.cainetworks.com
Modified: 2006-02-09 01:02 UTC (History)
58 users (show)

See Also:
Host: i486-pc-linux-gnu
Target: i486-pc-linux-gnu
Build: i486-pc-linux-gnu
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description devin@dungeon2.cainetworks.com 2006-02-07 00:42:46 UTC
	When casting a pointer and checking for == NULL, the check is skipped
	when -O3 is enabled.  I found this problem while compiling bind with uClibc,
	but could reproduce the problem with the debian version of gcc and this simple
	test file.

Environment:
System: Linux dungeon2 2.6.11-1-k7-smp #1 SMP Mon Jun 20 22:34:51 MDT 2005 i686 GNU/Linux
Architecture: i686

	
host: i486-pc-linux-gnu
build: i486-pc-linux-gnu
target: i486-pc-linux-gnu
configured with: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --with-tune=i686 --enable-checking=release i486-linux-gnu

How-To-Repeat:
	Compile this file:

	#include <stdio.h>
	void foo(char **dee) {	*dee = ""; }
	int main(int argc, char *argv[])
	    {
	    struct blah *ptr = argv[1];
	    if(ptr == NULL)
		foo(&ptr);
	    printf("%p", ptr); // output: (nil) expected: 0xADDRESS
	    return 0;
	    }
Comment 1 Andrew Pinski 2006-02-07 00:53:16 UTC
I cannot reproduce this at all with 4.0.3 20051105.
Comment 2 Devin Bayer 2006-02-07 17:07:08 UTC
I could reproduce it with that dated build.  And it isn't just debian but also the buildroot gcc.  Here is the assembly produced from -O3.  Following that is the assembly from -O2.  What seems to happen is that with -O3 foo() is optimized out and in it's place .LC0 is stored on the stack.  Seems fine.  But then the original value of "ptr" is used for calling printf instead of the updated value from the stack.

        .file   "test.c"
        .section        .rodata.str1.1,"aMS",@progbits,1
.LC0:
        .string ""
        .text
        .p2align 4,,15
.globl foo
        .type   foo, @function
foo:
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %eax
        movl    $.LC0, (%eax)
        popl    %ebp
        ret
        .size   foo, .-foo
        .section        .rodata.str1.1
.LC1:
        .string "%p"
        .text
        .p2align 4,,15
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $24, %esp
        movl    12(%ebp), %eax
        andl    $-16, %esp
        subl    $16, %esp
        movl    4(%eax), %eax
        testl   %eax, %eax
        movl    %eax, -4(%ebp)
        je      .L8
        movl    %eax, 4(%esp)
        movl    $.LC1, (%esp)
        call    printf
        xorl    %eax, %eax
        leave
        ret
        .p2align 4,,7
.L8:
        movl    $.LC0, -4(%ebp)
        movl    %eax, 4(%esp)
        movl    $.LC1, (%esp)
        call    printf
        xorl    %eax, %eax
        leave
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.0.3 20060128 (prerelease) (Debian 4.0.2-8)"
        .section        .note.GNU-stack,"",@progbits

############## Correct Version #########################

	.file	"test.c"
	.section	.rodata.str1.1,"aMS",@progbits,1
.LC0:
	.string	""
	.text
	.p2align 4,,15
.globl foo
	.type	foo, @function
foo:
	pushl	%ebp
	movl	%esp, %ebp
	movl	8(%ebp), %eax
	movl	$.LC0, (%eax)
	popl	%ebp
	ret
	.size	foo, .-foo
	.section	.rodata.str1.1
.LC1:
	.string	"%p"
	.text
	.p2align 4,,15
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	movl	12(%ebp), %eax
	andl	$-16, %esp
	subl	$16, %esp
	movl	4(%eax), %eax
	testl	%eax, %eax
	movl	%eax, -4(%ebp)
	je	.L8
	movl	-4(%ebp), %eax
	movl	$.LC1, (%esp)
	movl	%eax, 4(%esp)
	call	printf
	xorl	%eax, %eax
	leave
	ret
	.p2align 4,,7
.L8:
	leal	-4(%ebp), %eax
	movl	%eax, (%esp)
	call	foo
	movl	-4(%ebp), %eax
	movl	$.LC1, (%esp)
	movl	%eax, 4(%esp)
	call	printf
	xorl	%eax, %eax
	leave
	ret
	.size	main, .-main
	.ident	"GCC: (GNU) 4.0.3 20060128 (prerelease) (Debian 4.0.2-8)"
	.section	.note.GNU-stack,"",@progbits
Comment 3 Andrew Pinski 2006-02-09 01:02:08 UTC
You are violating aliasing rules which is why this does not work at -O3.  Either access the variable ptr as  a "struct blah *" or use -fno-strict-aliasing.

*** This bug has been marked as a duplicate of 21920 ***