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 13:30, Jakub Jelinek wrote:
> On Mon, Oct 14, 2013 at 01:26:25PM +0200, Richard Biener wrote:
>>> 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?!
>>
>> Yes, via handle_..._attribute.
> 
> ??  If add_builtin_function last argument is non-NULL, it will call
> decl_attributes with that argument and thus should set up evertyhing.
> So, IMHO:
>   tree noreturn = tree_cons (get_identifier ("noreturn"), NULL, NULL);
>   tree returns_twice = tree_cons (get_identifier ("returns_twice"), NULL, NULL);
> and passing either of those to add_builtin_function should IMHO work just
> fine.

Yes that works - thanks. My first test was incomplete. I've tried with only "returns_twice" first
and while this prevents the tree level ccp optimization it is not sufficient to fix the testcase. On
rtl level the f = 88.0f assignment inside the transaction is still removed as dead code. This only
stops when making tabort "noreturn" but this of course is no real fix since an abort might occur
also without calling tabort explicitly.

Having FPRs live accross an abort together with the incomplete CFG modelling of transactions will
probably continue to cause all kinds of trouble until this is sorted out.

Thanks for your help!

Bye,

-Andreas-

---
 gcc/config/s390/s390.c |   13 +++!!!!!!!!!!
 1 file changed, 3 insertions(+), 10 modifications(!)

Index: gcc/config/s390/s390.c
===================================================================
*** gcc/config/s390/s390.c.orig
--- gcc/config/s390/s390.c
*************** static void
*** 9900,9905 ****
--- 9900,9908 ----
  s390_init_builtins (void)
  {
    tree ftype, uint64_type;
+   tree returns_twice_attr = tree_cons (get_identifier ("returns_twice"),
+ 				       NULL, NULL);
+   tree noreturn_attr = tree_cons (get_identifier ("noreturn"), NULL, NULL);

    /* void foo (void) */
    ftype = build_function_type_list (void_type_node, NULL_TREE);
*************** s390_init_builtins (void)
*** 9910,9926 ****
    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,
--- 9913,9929 ----
    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, noreturn_attr);
    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, returns_twice_attr);
    add_builtin_function ("__builtin_tbegin_nofloat", ftype,
  			S390_BUILTIN_TBEGIN_NOFLOAT,
! 			BUILT_IN_MD, NULL, returns_twice_attr);

    /* int foo (void *, int) */
    ftype = build_function_type_list (integer_type_node, ptr_type_node,
*************** s390_init_builtins (void)
*** 9928,9938 ****
    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);
--- 9931,9941 ----
    add_builtin_function ("__builtin_tbegin_retry", ftype,
  			S390_BUILTIN_TBEGIN_RETRY,
  			BUILT_IN_MD,
! 			NULL, returns_twice_attr);
    add_builtin_function ("__builtin_tbegin_retry_nofloat", ftype,
  			S390_BUILTIN_TBEGIN_RETRY_NOFLOAT,
  			BUILT_IN_MD,
! 			NULL, returns_twice_attr);

    /* 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]