From patchwork Wed May 4 13:45:01 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Kai Tietz X-Patchwork-Id: 94042 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 639D1B6FCA for ; Wed, 4 May 2011 23:45:23 +1000 (EST) Received: (qmail 24390 invoked by alias); 4 May 2011 13:45:19 -0000 Received: (qmail 24370 invoked by uid 22791); 4 May 2011 13:45:17 -0000 X-SWARE-Spam-Status: No, hits=-1.0 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RFC_ABUSE_POST, TW_FN X-Spam-Check-By: sourceware.org Received: from mail-qw0-f47.google.com (HELO mail-qw0-f47.google.com) (209.85.216.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 04 May 2011 13:45:02 +0000 Received: by qwh5 with SMTP id 5so803863qwh.20 for ; Wed, 04 May 2011 06:45:01 -0700 (PDT) MIME-Version: 1.0 Received: by 10.229.106.69 with SMTP id w5mr815761qco.41.1304516701511; Wed, 04 May 2011 06:45:01 -0700 (PDT) Received: by 10.229.230.132 with HTTP; Wed, 4 May 2011 06:45:01 -0700 (PDT) In-Reply-To: References: <20110413105432.GA5425@bart> <4DA5AC25.8030209@linux.vnet.ibm.com> <20110418081754.GA3385@bart> Date: Wed, 4 May 2011 15:45:01 +0200 Message-ID: Subject: Re: [PING] Fix PR46399 - missing mode promotion for libcall args From: Kai Tietz To: Richard Guenther Cc: Andreas Krebbel , Ian Lance Taylor , gcc-patches@gcc.gnu.org X-IsSubscribed: yes 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 2011/5/4 Richard Guenther : > On Mon, Apr 18, 2011 at 10:17 AM, Andreas Krebbel > wrote: >> Hi, >> >> the attached patch uses the existing promote_function_mode hook.  For >> a libcall neither TYPE nor FNTYPE is available so I had to change a >> few related function in order to deal with that. >> >> The patch also fixes the s390 DFP problems. >> >> Bye, >> >> -Andreas- >> >> >> 2011-04-18  Andreas Krebbel   >> >>        * calls.c (emit_library_call_value_1): Invoke >>        promote_function_mode hook on libcall arguments. >>        * explow.c (promote_function_mode, promote_mode): Handle TYPE >>        argument being NULL. >>        * targhooks.c (default_promote_function_mode): Lisewise. >>        * config/s390/s390.c (s390_promote_function_mode): Likewise. >>        * config/sparc/sparc.c (sparc_promote_function_mode): Likewise. >> >>        * doc/tm.texi: Document that TYPE argument might be NULL. >> >> >> Index: gcc/calls.c >> =================================================================== >> *** gcc/calls.c.orig >> --- gcc/calls.c >> *************** emit_library_call_value_1 (int retval, r >> *** 3484,3489 **** >> --- 3484,3490 ---- >>      { >>        rtx val = va_arg (p, rtx); >>        enum machine_mode mode = (enum machine_mode) va_arg (p, int); >> +       int unsigned_p = 0; >> >>        /* We cannot convert the arg value to the mode the library wants here; >>         must do it earlier where we know the signedness of the arg.  */ >> *************** emit_library_call_value_1 (int retval, r >> *** 3531,3539 **** >>          val = force_operand (XEXP (slot, 0), NULL_RTX); >>        } >> >> !       argvec[count].value = val; >>        argvec[count].mode = mode; >> ! >>        argvec[count].reg = targetm.calls.function_arg (&args_so_far, mode, >>                                                      NULL_TREE, true); >> >> --- 3532,3540 ---- >>          val = force_operand (XEXP (slot, 0), NULL_RTX); >>        } >> >> !       mode = promote_function_mode (NULL_TREE, mode, &unsigned_p, NULL_TREE, 0); >>        argvec[count].mode = mode; >> !       argvec[count].value = convert_modes (mode, GET_MODE (val), val, 0); >>        argvec[count].reg = targetm.calls.function_arg (&args_so_far, mode, >>                                                      NULL_TREE, true); >> >> Index: gcc/config/s390/s390.c >> =================================================================== >> *** gcc/config/s390/s390.c.orig >> --- gcc/config/s390/s390.c >> *************** s390_promote_function_mode (const_tree t >> *** 8742,8748 **** >>    if (INTEGRAL_MODE_P (mode) >>        && GET_MODE_SIZE (mode) < UNITS_PER_LONG) >>      { >> !       if (POINTER_TYPE_P (type)) >>        *punsignedp = POINTERS_EXTEND_UNSIGNED; >>        return Pmode; >>      } >> --- 8742,8748 ---- >>    if (INTEGRAL_MODE_P (mode) >>        && GET_MODE_SIZE (mode) < UNITS_PER_LONG) >>      { >> !       if (type != NULL_TREE && POINTER_TYPE_P (type)) >>        *punsignedp = POINTERS_EXTEND_UNSIGNED; >>        return Pmode; >>      } >> Index: gcc/explow.c >> =================================================================== >> *** gcc/explow.c.orig >> --- gcc/explow.c >> *************** enum machine_mode >> *** 771,776 **** >> --- 771,787 ---- >>  promote_function_mode (const_tree type, enum machine_mode mode, int *punsignedp, >>                       const_tree funtype, int for_return) >>  { >> +   /* Called without a type node for a libcall.  */ >> +   if (type == NULL_TREE) >> +     { >> +       if (INTEGRAL_MODE_P (mode)) >> +       return targetm.calls.promote_function_mode (NULL_TREE, mode, >> +                                                   punsignedp, funtype, >> +                                                   for_return); >> +       else >> +       return mode; >> +     } >> + >>    switch (TREE_CODE (type)) >>      { >>      case INTEGER_TYPE:   case ENUMERAL_TYPE:   case BOOLEAN_TYPE: >> *************** enum machine_mode >> *** 791,796 **** >> --- 802,813 ---- >>  promote_mode (const_tree type ATTRIBUTE_UNUSED, enum machine_mode mode, >>              int *punsignedp ATTRIBUTE_UNUSED) >>  { >> +   /* For libcalls this is invoked without TYPE from the backends >> +      TARGET_PROMOTE_FUNCTION_MODE hooks.  Don't do anything in that >> +      case.  */ >> +   if (type == NULL_TREE) >> +     return mode; >> + > > This broke bootstrap > > /space/rguenther/src/svn/trunk/gcc/explow.c: In function 'promote_mode': > /space/rguenther/src/svn/trunk/gcc/explow.c:815:3: error: ISO C90 > forbids mixed declarations and code [-Werror=edantic] > cc1: all warnings being treated as errors > > >>    /* FIXME: this is the same logic that was there until GCC 4.4, but we >>       probably want to test POINTERS_EXTEND_UNSIGNED even if PROMOTE_MODE >>       is not defined.  The affected targets are M32C, S390, SPARC.  */ >> Index: gcc/config/sparc/sparc.c >> =================================================================== >> *** gcc/config/sparc/sparc.c.orig >> --- gcc/config/sparc/sparc.c >> *************** init_cumulative_args (struct sparc_args >> *** 4965,4977 **** >>  /* Handle promotion of pointer and integer arguments.  */ >> >>  static enum machine_mode >> ! sparc_promote_function_mode (const_tree type ATTRIBUTE_UNUSED, >>                               enum machine_mode mode, >> !                              int *punsignedp ATTRIBUTE_UNUSED, >>                               const_tree fntype ATTRIBUTE_UNUSED, >>                               int for_return ATTRIBUTE_UNUSED) >>  { >> !   if (POINTER_TYPE_P (type)) >>      { >>        *punsignedp = POINTERS_EXTEND_UNSIGNED; >>        return Pmode; >> --- 4965,4977 ---- >>  /* Handle promotion of pointer and integer arguments.  */ >> >>  static enum machine_mode >> ! sparc_promote_function_mode (const_tree type, >>                               enum machine_mode mode, >> !                              int *punsignedp, >>                               const_tree fntype ATTRIBUTE_UNUSED, >>                               int for_return ATTRIBUTE_UNUSED) >>  { >> !   if (type != NULL_TREE && POINTER_TYPE_P (type)) >>      { >>        *punsignedp = POINTERS_EXTEND_UNSIGNED; >>        return Pmode; >> Index: gcc/doc/tm.texi.in >> =================================================================== >> *** gcc/doc/tm.texi.in.orig >> --- gcc/doc/tm.texi.in >> *************** which an incoming parameter is copied, o >> *** 952,957 **** >> --- 952,959 ---- >>  then the hook should return the same mode as @code{promote_mode}, though >>  the signedness may be different. >> >> + @var{type} can be omitted when promoting function arguments of libcalls. >> + >>  The default is to not promote arguments and return values.  You can >>  also define the hook to @code{default_promote_function_mode_always_promote} >>  if you would like to apply the same rules given by @code{PROMOTE_MODE}. >> Index: gcc/doc/tm.texi >> =================================================================== >> *** gcc/doc/tm.texi.orig >> --- gcc/doc/tm.texi >> *************** which an incoming parameter is copied, o >> *** 962,967 **** >> --- 962,969 ---- >>  then the hook should return the same mode as @code{promote_mode}, though >>  the signedness may be different. >> >> + @var{type} can be omitted when promoting function arguments of libcalls. >> + >>  The default is to not promote arguments and return values.  You can >>  also define the hook to @code{default_promote_function_mode_always_promote} >>  if you would like to apply the same rules given by @code{PROMOTE_MODE}. >> Index: gcc/targhooks.c >> =================================================================== >> *** gcc/targhooks.c.orig >> --- gcc/targhooks.c >> *************** default_promote_function_mode (const_tre >> *** 124,130 **** >>                               const_tree funtype ATTRIBUTE_UNUSED, >>                               int for_return ATTRIBUTE_UNUSED) >>  { >> !   if (for_return == 2) >>      return promote_mode (type, mode, punsignedp); >>    return mode; >>  } >> --- 124,130 ---- >>                               const_tree funtype ATTRIBUTE_UNUSED, >>                               int for_return ATTRIBUTE_UNUSED) >>  { >> !   if (type != NULL_TREE && for_return == 2) >>      return promote_mode (type, mode, punsignedp); >>    return mode; >>  } >> > Yes, following patch fix that: Ok for apply? Regards, Kai Index: explow.c =================================================================== --- explow.c (revision 173374) +++ explow.c (working copy) @@ -802,6 +802,10 @@ promote_mode (const_tree type ATTRIBUTE_UNUSED, enum machine_mode mode, int *punsignedp ATTRIBUTE_UNUSED) { +#ifdef PROMOTE_MODE + const enum tree_code code; + int unsignedp; +#endif /* For libcalls this is invoked without TYPE from the backends TARGET_PROMOTE_FUNCTION_MODE hooks. Don't do anything in that case. */ @@ -812,8 +816,8 @@ probably want to test POINTERS_EXTEND_UNSIGNED even if PROMOTE_MODE is not defined. The affected targets are M32C, S390, SPARC. */ #ifdef PROMOTE_MODE - const enum tree_code code = TREE_CODE (type); - int unsignedp = *punsignedp; + code = TREE_CODE (type); + unsignedp = *punsignedp; switch (code) {