From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13786 invoked by alias); 20 Dec 2006 14:35:50 -0000 Received: (qmail 13760 invoked by uid 48); 20 Dec 2006 14:35:40 -0000 Date: Wed, 20 Dec 2006 14:35:00 -0000 Subject: [Bug c/30267] New: missed optimization due to bad range propagation without -fwrapv X-Bugzilla-Reason: CC Message-ID: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "bruno at clisp dot org" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2006-12/txt/msg01657.txt.bz2 This program shows that some range propagation became worse between gcc 4.0.2 and gcc 4.1.1. =========================== foo.c ======================== int notneg (int x) { return (~ -x) >= (-2147483647-1); } int negnot (int x) { return (- ~x) <= 2147483647; } ========================================================== # With gcc 4.0.2 on i686-pc-linux-gnu the code is fully optimized: $ gcc -O2 -fomit-frame-pointer -S foo.c && cat foo.s .file "foo.c" .text .p2align 4,,15 .globl notneg .type notneg, @function notneg: movl $1, %eax ret .size notneg, .-notneg .p2align 4,,15 .globl negnot .type negnot, @function negnot: movl $1, %eax ret .size negnot, .-negnot .ident "GCC: (GNU) 4.0.2" .section .note.GNU-stack,"",@progbits # With gcc 4.1.1 on i686-pc-linux-gnu the code is fully optimized with -fwrapv # but not without -fwrapv: $ gcc -O2 -fomit-frame-pointer -S foo.c && cat foo.s .file "foo.c" .text .p2align 4,,15 .globl notneg .type notneg, @function notneg: xorl %eax, %eax cmpl $-2147483648, 4(%esp) setne %al ret .size notneg, .-notneg .p2align 4,,15 .globl negnot .type negnot, @function negnot: xorl %eax, %eax cmpl $2147483647, 4(%esp) setne %al ret .size negnot, .-negnot .ident "GCC: (GNU) 4.1.1" .section .note.GNU-stack,"",@progbits $ gcc -O2 -fomit-frame-pointer -fwrapv -S foo.c && cat foo.s .file "foo.c" .text .p2align 4,,15 .globl notneg .type notneg, @function notneg: movl $1, %eax ret .size notneg, .-notneg .p2align 4,,15 .globl negnot .type negnot, @function negnot: movl $1, %eax ret .size negnot, .-negnot .ident "GCC: (GNU) 4.1.1" .section .note.GNU-stack,"",@progbits So somehow this seems to be linked to flag_wrapv. But regardless which value is the result after signed overflow, any int >= INT_MIN and any int <= INT_MAX should evaluate to 1 unconditionally. -- Summary: missed optimization due to bad range propagation without -fwrapv Product: gcc Version: 4.1.1 Status: UNCONFIRMED Severity: minor Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: bruno at clisp dot org GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30267