From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15329 invoked by alias); 29 May 2002 01:56:04 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 15295 invoked by uid 71); 29 May 2002 01:56:02 -0000 Resent-Date: 29 May 2002 01:56:02 -0000 Resent-Message-ID: <20020529015602.15293.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-To: nobody@gcc.gnu.org Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, ghazi@caip.rutgers.edu Received:(qmail 14400 invoked by uid 61); 29 May 2002 01:55:39 -0000 Message-Id:<20020529015538.14399.qmail@sources.redhat.com> Date: Tue, 28 May 2002 20:36:00 -0000 From: ghazi@caip.rutgers.edu Reply-To: ghazi@caip.rutgers.edu To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version:gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: optimization/6854: missed optimization with attribute const & pure X-SW-Source: 2002-05/txt/msg00935.txt.bz2 List-Id: >Number: 6854 >Category: optimization >Synopsis: missed optimization with attribute const & pure >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: pessimizes-code >Submitter-Id: net >Arrival-Date: Tue May 28 18:56:00 PDT 2002 >Closed-Date: >Last-Modified: >Originator: Kaveh Ghazi >Release: gcc version 3.2 20020527 (experimental) >Organization: >Environment: Probably all, but known to occur on at least: sparc-sun-solaris2.7 mips-sgi-irix6.2 and judging by the testresults: http://gcc.gnu.org/ml/gcc-testresults/2002-05/msg00989.html http://gcc.gnu.org/ml/gcc-testresults/2002-05/msg00980.html http://gcc.gnu.org/ml/gcc-testresults/2002-05/msg00967.html it also occurs on i686, ia64 and alpha. >Description: Using the current 3.2 trunk, gcc fails to optimize several sections in the testcase attached. It's also installed as: gcc.c-torture/execute/pure-1.c The testcase is designed to emit link errors when the optimizations fail to occur. When I compile it (e.g. with -O/-O2) I get: Undefined first referenced symbol in file link_error4 /var/tmp//cci2nHoc.o link_error5 /var/tmp//cci2nHoc.o link_error6 /var/tmp//cci2nHoc.o link_error7 /var/tmp//cci2nHoc.o As noted by the particular optimizing failures, this appears to relate to the inability of gcc to detect as pure or const a function which contain calls to other const/pure functions. NOTE: gcc-3.1.1-pre and 3.0.3 fail on 2, 4 and 6 so the appearance of link_error 5 & 7 represents a regression. While the disappearance of 2 is a (slight) improvement. See: http://gcc.gnu.org/ml/gcc-patches/2002-05/msg02137.html >How-To-Repeat: Compile the attached testcase with -O >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: text/plain; name="pure-1.c" Content-Disposition: inline; filename="pure-1.c" /* Origin: Kaveh Ghazi 2002-05-27. */ /* Use a different function for each test so the link failures indicate which one is broken. */ extern void link_error0 (void); extern void link_error1 (void); extern void link_error2 (void); extern void link_error3 (void); extern void link_error4 (void); extern void link_error5 (void); extern void link_error6 (void); extern void link_error7 (void); extern int i; extern int func0 (int) __attribute__ ((__pure__)); extern int func1 (int) __attribute__ ((__const__)); /* GCC should automatically detect attributes for these functions. Don't allow -O3 to inline them. */ #define ANI __attribute__ ((__noinline__)) static int ANI func2 (int a) { return i + a; } /* pure */ static int ANI func3 (int a) { return a * 3; } /* const */ static int ANI func4 (int a) { return func0(a) + a; } /* pure */ static int ANI func5 (int a) { return a + func1(a); } /* const */ static int ANI func6 (int a) { return func2(a) + a; } /* pure */ static int ANI func7 (int a) { return a + func3(a); } /* const */ int main () { int i[10], r; i[0] = 0; r = func0(0); if (i[0]) link_error0(); i[1] = 0; r = func1(0); if (i[1]) link_error1(); i[2] = 0; r = func2(0); if (i[2]) link_error2(); i[3] = 0; r = func3(0); if (i[3]) link_error3(); i[4] = 0; r = func4(0); if (i[4]) link_error4(); i[5] = 0; r = func5(0); if (i[5]) link_error5(); i[6] = 0; r = func6(0); if (i[6]) link_error6(); i[7] = 0; r = func7(0); if (i[7]) link_error7(); return r; } int func0 (int a) { return a - i; } /* pure */ int func1 (int a) { return a - a; } /* const */ int i = 2; #ifndef __OPTIMIZE__ /* Avoid link failures when not optimizing. */ void link_error0() {} void link_error1() {} void link_error2() {} void link_error3() {} void link_error4() {} void link_error5() {} void link_error6() {} void link_error7() {} #endif /* ! __OPTIMIZE__ */