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

Reply via email to