This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Transaction fix: New target hook special_function_flags


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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]