From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11680 invoked by alias); 21 Jan 2013 16:49:58 -0000 Received: (qmail 11664 invoked by uid 22791); 21 Jan 2013 16:49:56 -0000 X-SWARE-Spam-Status: No, hits=-5.4 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,TW_FN X-Spam-Check-By: sourceware.org Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 21 Jan 2013 16:49:48 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id BBBD8A50F4 for ; Mon, 21 Jan 2013 17:49:46 +0100 (CET) Date: Mon, 21 Jan 2013 16:49:00 -0000 From: Martin Jambor To: GCC Patches Subject: [PATCH, PR 56022] Correct order of calls to invoke_set_current_function_hook and aggregate_value_p Message-ID: <20130121164946.GB21943@virgil.suse> Mail-Followup-To: GCC Patches MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2013-01/txt/msg01061.txt.bz2 Hi, segfault reported as PR 56022 happens because cfun->returns_struct is erroneously set. This happens because aggregate_value_p (called from allocate_struct_function) relies on that invoke_set_current_function_hook has already been called. The patch below moves the call up bit, although not all the way to its original position because invoke_set_current_function_hook indirectly calls init_dummy_function_start which in turns calls push_struct_function which needs cfun->decl to be set up so that popping cfun can then restore current function decl. Checking that fndecl is not NULL twice is a bit ugly but I thought I'd keep the assignment to cfun->decl and DECL_STRUCT_FUNCTION (fndecl) together for the sake of consistency. Bootstrapped and tested on x86_64-linux without any issues. OK for trunk? Thanks, Martin 2013-01-21 Martin Jambor PR middle-end/56022 * function.c (allocate_struct_function): Call invoke_set_current_function_hook earlier. testsuite/ * gcc.target/i386/pr56022.c: New test. Index: src/gcc/function.c =================================================================== --- src.orig/gcc/function.c +++ src/gcc/function.c @@ -4479,7 +4479,6 @@ get_last_funcdef_no (void) void allocate_struct_function (tree fndecl, bool abstract_p) { - tree result; tree fntype = fndecl ? TREE_TYPE (fndecl) : NULL_TREE; cfun = ggc_alloc_cleared_function (); @@ -4498,8 +4497,13 @@ allocate_struct_function (tree fndecl, b DECL_STRUCT_FUNCTION (fndecl) = cfun; cfun->decl = fndecl; current_function_funcdef_no = get_next_funcdef_no (); + } + + invoke_set_current_function_hook (fndecl); - result = DECL_RESULT (fndecl); + if (fndecl != NULL_TREE) + { + tree result = DECL_RESULT (fndecl); if (!abstract_p && aggregate_value_p (result, fndecl)) { #ifdef PCC_STATIC_STRUCT_RETURN @@ -4518,8 +4522,6 @@ allocate_struct_function (tree fndecl, b but is this worth the hassle? */ cfun->can_throw_non_call_exceptions = flag_non_call_exceptions; } - - invoke_set_current_function_hook (fndecl); } /* This is like allocate_struct_function, but pushes a new cfun for FNDECL Index: src/gcc/testsuite/gcc.target/i386/pr56022.c =================================================================== --- /dev/null +++ src/gcc/testsuite/gcc.target/i386/pr56022.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-mavx" } */ + +typedef float __m256 __attribute__ ((__vector_size__ (32), __may_alias__)); +__attribute__((target("no-avx"))) static int currentImplementationSupported() +{} +__m256 foo0(__m256 a) {}