This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Transaction fix: New target hook special_function_flags
- From: Andreas Krebbel <krebbel at linux dot vnet dot ibm dot com>
- To: Jakub Jelinek <jakub at redhat dot com>, Richard Biener <richard dot guenther at gmail dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 14 Oct 2013 13:21:34 +0200
- Subject: Re: [PATCH] Transaction fix: New target hook special_function_flags
- Authentication-results: sourceware.org; auth=none
- References: <20131011170244 dot GA7694 at bart> <CAFiYyc2DHS_S9nBCDCgCaFXWK=MUrJCqvsLA9838CO0SCM+Psw at mail dot gmail dot com> <20131014101452 dot GI30970 at tucnak dot zalov dot cz>
On 14/10/13 12:14, Jakub Jelinek wrote:
> On Mon, Oct 14, 2013 at 12:07:00PM +0200, Richard Biener wrote:
>>> htm-nofloat-2.c fails with that patch. The returns-twice flag on
>>> tbegin prevents several optimizations on the cfg and basically
>>> disables the TX optimization in s390_optimize_nonescaping_tx that way.
>>> I'll try to address this with a follow-on patch.
>>>
>>> Ok for mainline and 4.8?
>>
>> I don't see what's special about s390 so that the attributes are only
>> required there. In fact they look valid generally, so no need for the
>> new target hook.
>
> Well, the builtins are machine specific. But, why don't you just
> add the attributes to the builtins when you register them in the backend?
> You are calling add_builtin_function with NULL_TREE attrs, just pass
> the right attribute list and there won't be a need for an extra target hook.
I somehow couldn't get it working with the add_builtin_function parameter. Perhaps because these
attrs are supposed to be translated into the respective tree flags (DECL_IS_RETURNS_TWICE) at that
point already?!
But the following seems to work fine:
---
gcc/config/s390/s390.c | 39 +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1 file changed, 1 insertion(+), 38 modifications(!)
Index: gcc/config/s390/s390.c
===================================================================
*** gcc/config/s390/s390.c.orig
--- gcc/config/s390/s390.c
*************** static void
*** 9900,9905 ****
--- 9900,9906 ----
s390_init_builtins (void)
{
tree ftype, uint64_type;
+ tree decl;
/* void foo (void) */
ftype = build_function_type_list (void_type_node, NULL_TREE);
*************** s390_init_builtins (void)
*** 9909,9938 ****
/* void foo (int) */
ftype = build_function_type_list (void_type_node, integer_type_node,
NULL_TREE);
! add_builtin_function ("__builtin_tabort", ftype,
! S390_BUILTIN_TABORT, BUILT_IN_MD, NULL, NULL_TREE);
add_builtin_function ("__builtin_tx_assist", ftype,
S390_BUILTIN_TX_ASSIST, BUILT_IN_MD, NULL, NULL_TREE);
/* int foo (void *) */
ftype = build_function_type_list (integer_type_node, ptr_type_node, NULL_TREE);
! add_builtin_function ("__builtin_tbegin", ftype, S390_BUILTIN_TBEGIN,
! BUILT_IN_MD, NULL, NULL_TREE);
! add_builtin_function ("__builtin_tbegin_nofloat", ftype,
! S390_BUILTIN_TBEGIN_NOFLOAT,
! BUILT_IN_MD, NULL, NULL_TREE);
/* int foo (void *, int) */
ftype = build_function_type_list (integer_type_node, ptr_type_node,
integer_type_node, NULL_TREE);
! add_builtin_function ("__builtin_tbegin_retry", ftype,
! S390_BUILTIN_TBEGIN_RETRY,
! BUILT_IN_MD,
! NULL, NULL_TREE);
! add_builtin_function ("__builtin_tbegin_retry_nofloat", ftype,
! S390_BUILTIN_TBEGIN_RETRY_NOFLOAT,
! BUILT_IN_MD,
! NULL, NULL_TREE);
/* int foo (void) */
ftype = build_function_type_list (integer_type_node, NULL_TREE);
--- 9910,9947 ----
/* void foo (int) */
ftype = build_function_type_list (void_type_node, integer_type_node,
NULL_TREE);
! decl = add_builtin_function ("__builtin_tabort", ftype,
! S390_BUILTIN_TABORT, BUILT_IN_MD, NULL, NULL_TREE);
! set_call_expr_flags (decl, ECF_NORETURN);
!
add_builtin_function ("__builtin_tx_assist", ftype,
S390_BUILTIN_TX_ASSIST, BUILT_IN_MD, NULL, NULL_TREE);
/* int foo (void *) */
ftype = build_function_type_list (integer_type_node, ptr_type_node, NULL_TREE);
! decl = add_builtin_function ("__builtin_tbegin", ftype, S390_BUILTIN_TBEGIN,
! BUILT_IN_MD, NULL, NULL_TREE);
! set_call_expr_flags (decl, ECF_RETURNS_TWICE);
!
! decl = add_builtin_function ("__builtin_tbegin_nofloat", ftype,
! S390_BUILTIN_TBEGIN_NOFLOAT,
! BUILT_IN_MD, NULL, NULL_TREE);
! set_call_expr_flags (decl, ECF_RETURNS_TWICE);
/* int foo (void *, int) */
ftype = build_function_type_list (integer_type_node, ptr_type_node,
integer_type_node, NULL_TREE);
! decl = add_builtin_function ("__builtin_tbegin_retry", ftype,
! S390_BUILTIN_TBEGIN_RETRY,
! BUILT_IN_MD,
! NULL, NULL_TREE);
! set_call_expr_flags (decl, ECF_RETURNS_TWICE);
!
! decl = add_builtin_function ("__builtin_tbegin_retry_nofloat", ftype,
! S390_BUILTIN_TBEGIN_RETRY_NOFLOAT,
! BUILT_IN_MD,
! NULL, NULL_TREE);
! set_call_expr_flags (decl, ECF_RETURNS_TWICE);
/* int foo (void) */
ftype = build_function_type_list (integer_type_node, NULL_TREE);