From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29780 invoked by alias); 6 Aug 2003 07:01:15 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 29765 invoked by uid 48); 6 Aug 2003 07:01:14 -0000 Date: Wed, 06 Aug 2003 07:01:00 -0000 From: "alga at rgai dot hu" To: gcc-bugs@gcc.gnu.org Message-ID: <20030806070108.11820.alga@rgai.hu> Reply-To: gcc-bugzilla@gcc.gnu.org Subject: [Bug optimization/11820] New: Unoptimized complementary conditional instructions X-Bugzilla-Reason: CC X-SW-Source: 2003-08/txt/msg00846.txt.bz2 List-Id: PLEASE REPLY TO gcc-bugzilla@gcc.gnu.org ONLY, *NOT* gcc-bugs@gcc.gnu.org. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11820 Summary: Unoptimized complementary conditional instructions Product: gcc Version: 3.4 Status: UNCONFIRMED Severity: minor Priority: P3 Component: optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: alga at rgai dot hu CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: arm-unknown-elf After CE3 and SCHED2 phases GCC does not optimize conditionally executed expressions. Sometimes the generated code contains two conditionally executed expressions that compute the same values in each complementary condition case (eg. in arm: "movle r3, #12" and "movgt r3, #12"). These instructions could be combined into one unconditional computation. The problem generally occurs when the source code contains the same instruction in both branches of an if-statement. --- c example --- // arm-elf-gcc -S -g0 -Os -o comp-cond.s comp-cond.c int a,c; void foo(int b) { if (c > 13) { a = 12; } else { a = 12; c = b + 3; } } --- arm code --- foo: ldr r1, .L4 ldr r3, [r1, #0] ldr r2, .L4+4 cmp r3, #13 add r0, r0, #3 movgt r3, #12 <- OLD movle r3, #12 <- OLD strgt r3, [r2, #0] <- OLD strle r3, [r2, #0] <- OLD strle r0, [r1, #0] mov pc, lr --- possible solution --- foo: ldr r1, .L4 ldr r3, [r1, #0] ldr r2, .L4+4 cmp r3, #13 add r0, r0, #3 mov r3, #12 <- NEW str r3, [r2, #0] <- NEW strle r0, [r1, #0] mov pc, lr