From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 74987 invoked by alias); 16 Mar 2015 14:39:48 -0000 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 Received: (qmail 74948 invoked by uid 48); 16 Mar 2015 14:39:43 -0000 From: "vries at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/65440] pass_lim misses support for predicated code motion Date: Mon, 16 Mar 2015 14:39:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: tree-optimization X-Bugzilla-Version: 5.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: enhancement X-Bugzilla-Who: vries at gcc dot gnu.org X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-SW-Source: 2015-03/txt/msg01598.txt.bz2 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65440 --- Comment #1 from vries at gcc dot gnu.org --- Concrete example ( based on example at https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/tree-ssa-loop-im.c;h=9aba79ba776944ec6fba8459354deabe8c126b75;hb=HEAD#l333) test.c: ... #include const char *something (void); size_t f (unsigned int n) { const char *s = something (); size_t sum = 0; size_t t; unsigned int i; for (i = 0; i < n; ++i) { if (s) t = strlen (s); else t = i * 2; sum += t; } return sum; } ... The resulting code with -O2 from the optimized dump is: ... f (unsigned int n) { unsigned int i; size_t t; size_t sum; const char * s; unsigned int _9; : s_6 = something (); if (n_7(D) != 0) goto ; else goto ; : # sum_13 = PHI <0(2)> # i_1 = PHI <0(2)> : # sum_14 = PHI # i_17 = PHI if (s_6 != 0B) goto ; else goto ; : t_8 = strlen (s_6); goto ; : _9 = i_17 * 2; t_10 = (size_t) _9; : # t_2 = PHI sum_11 = t_2 + sum_14; i_12 = i_17 + 1; if (n_7(D) != i_12) goto ; else goto ; : # sum_16 = PHI return sum_16; } ... [ The same code is generated with -O3 -fno-tree-vectorize -fno-unswitch-loops. -funswitch-loops manages to take the strlen out of the loop, but by generating two loops. ]