From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28513 invoked by alias); 8 Oct 2011 10:25:21 -0000 Received: (qmail 28499 invoked by uid 22791); 8 Oct 2011 10:25:20 -0000 X-SWARE-Spam-Status: No, hits=-2.9 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from localhost (HELO gcc.gnu.org) (127.0.0.1) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 08 Oct 2011 10:25:05 +0000 From: "amker.cheng at gmail dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug rtl-optimization/50663] conditional propagation missed in cprop.c pass Date: Sat, 08 Oct 2011 10:25:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: rtl-optimization X-Bugzilla-Keywords: X-Bugzilla-Severity: enhancement X-Bugzilla-Who: amker.cheng at gmail dot com X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated Content-Type: text/plain; charset="UTF-8" MIME-Version: 1.0 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: 2011-10/txt/msg00573.txt.bz2 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50663 --- Comment #1 from amker.cheng 2011-10-08 10:25:04 UTC --- Here comes the cause: Though the cprop.c pass collected the implicit_set information, it is recorded as local info of basic block, and cprop only does global propagation. The result is such conditional const propagation opportunities is missed. The whole process in cprop pass is like: bb0 : if (x) then bb1 else bb2 end 1, implicit_set from the preceding bb0 is tagged as local in bb1; 2, in compute_local_properties, the implicit_set is recorded in avloc[bb1]; 3, in compute_cprop_available, the implicit_set is only recorded in avout[bb1], not in avin[bb1], which it should be; 4, in cprop_insn and find_avail_set, only info recorded in avin[bb1] is considered when try to do propagation for bb1; Well, I believe it is a small problem, since implicit_set is recorded in avout[bb1], The basic block bb1 is the only one get missed in propagation. I'm working on a patch and will send it for reviewing later.