From patchwork Sat Nov 13 07:58:27 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tobias Burnus X-Patchwork-Id: 71039 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id D576EB7102 for ; Sat, 13 Nov 2010 18:59:12 +1100 (EST) Received: (qmail 25796 invoked by alias); 13 Nov 2010 07:59:07 -0000 Received: (qmail 25783 invoked by uid 22791); 13 Nov 2010 07:59:06 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE X-Spam-Check-By: sourceware.org Received: from mx02.qsc.de (HELO mx02.qsc.de) (213.148.130.14) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 13 Nov 2010 07:58:30 +0000 Received: from [192.168.178.22] (port-92-204-76-125.dynamic.qsc.de [92.204.76.125]) by mx02.qsc.de (Postfix) with ESMTP id BC35A1E85E; Sat, 13 Nov 2010 08:58:27 +0100 (CET) Message-ID: <4CDE4523.7000605@net-b.de> Date: Sat, 13 Nov 2010 08:58:27 +0100 From: Tobias Burnus User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.12) Gecko/20101026 SUSE/3.1.6 Thunderbird/3.1.6 MIME-Version: 1.0 To: gcc patches , gfortran Subject: [Patch, Fortran] PR 45742 Fix VOLATILE handling Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org This patch fixes two problems: a) For volatile, a decl not only needs TREE_THIS_VOLATILE but also TREE_SIDE_EFFECTS - otherwise, the middle end does not always honour the volatile attribute. b) Decls of dummy arguments were not marked as volatile. Thanks to Thomas for the bugreport. Thanks to Andrew, Ian and Richard for helping to debug this. Build and regtested on x86-64-linux. OK for the trunk? Tobias 2010-11-13 Tobias Burnus PR fortran/45742 * trans-common.c (build_field): Add TREE_SIDE_EFFECTS for volatile. * trans-decl.c (gfc_finish_var_decl): Ditto. (create_function_arglist): Handle volatile dummy arguments. 2010-11-13 Tobias Burnus PR fortran/45742 * gfortran.dg/volatile12.f90: New. diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c index 486fbbb..1f59a69 100644 --- a/gcc/fortran/trans-common.c +++ b/gcc/fortran/trans-common.c @@ -321,8 +321,9 @@ build_field (segment_info *h, tree union_type, record_layout_info rli) if (h->sym->attr.volatile_) { tree new_type; TREE_THIS_VOLATILE (field) = 1; + TREE_SIDE_EFFECTS (field) = 1; new_type = build_qualified_type (TREE_TYPE (field), TYPE_QUAL_VOLATILE); TREE_TYPE (field) = new_type; } diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 3f068de..0441db7 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -554,8 +554,9 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym) if (sym->attr.volatile_) { TREE_THIS_VOLATILE (decl) = 1; + TREE_SIDE_EFFECTS (decl) = 1; new_type = build_qualified_type (TREE_TYPE (decl), TYPE_QUAL_VOLATILE); TREE_TYPE (decl) = new_type; } @@ -1943,12 +1944,21 @@ create_function_arglist (gfc_symbol * sym) if (f->sym->attr.proc_pointer) type = build_pointer_type (type); + if (f->sym->attr.volatile_) + type = build_qualified_type (type, TYPE_QUAL_VOLATILE); + /* Build the argument declaration. */ parm = build_decl (input_location, PARM_DECL, gfc_sym_identifier (f->sym), type); + if (f->sym->attr.volatile_) + { + TREE_THIS_VOLATILE (parm) = 1; + TREE_SIDE_EFFECTS (parm) = 1; + } + /* Fill in arg stuff. */ DECL_CONTEXT (parm) = fndecl; DECL_ARG_TYPE (parm) = TREE_VALUE (typelist); /* All implementation args are read-only. */ diff --git a/gcc/testsuite/gfortran.dg/volatile12.f90 b/gcc/testsuite/gfortran.dg/volatile12.f90 new file mode 100644 index 0000000..8de143d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/volatile12.f90 @@ -0,0 +1,16 @@ +! { dg-do compile } +! { dg-options "-fdump-tree-optimized -O3" } +! +! PR fortran/45742 +! + +subroutine sub(arg) + integer, volatile :: arg + if (arg /= arg) call I_dont_exist() +end + +! { dg-final { scan-tree-dump "integer.kind=.. . volatile arg" "optimized" } } +! { dg-final { scan-tree-dump-times " =.v. arg;" 2 "optimized" } } +! { dg-final { scan-tree-dump "i_dont_exist" "optimized" } } +! { dg-final { cleanup-tree-dump "original" } } +