On Mon, Oct 14, 2013 at 2:20 PM, Andreas Krebbel
<[email protected]> wrote:
> 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.
Yeah, similar to the setjmp/longjmp mess I've fixed on GIMPLE (but that
is still broken on the RTL level).
Richard.
> 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);
>