This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: C PATCH for c/65345 (file-scope _Atomic expansion with floats)
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: Marek Polacek <polacek at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org, Joseph Myers <joseph at codesourcery dot com>, clm at codesourcery dot com, matthew dot fortune at imgtec dot com, dje dot gcc at gmail dot com, Richard Henderson <rth at redhat dot com>, Uros Bizjak <ubizjak at gmail dot com>, davem at redhat dot com, uweigand at de dot ibm dot com, Andreas dot Krebbel at de dot ibm dot com, richard dot earnshaw at arm dot com, ramana dot radhakrishnan at arm dot com, nickc at redhat dot com, olegendo at gcc dot gnu dot org, kkojima at gcc dot gnu dot org, marcus dot shawcroft at arm dot com
- Date: Tue, 06 Oct 2015 11:12:15 +0200
- Subject: Re: C PATCH for c/65345 (file-scope _Atomic expansion with floats)
- Authentication-results: sourceware.org; auth=none
- References: <20151001144941 dot GT6184 at redhat dot com>
> Joseph reminded me that I had forgotten about this patch. As mentioned
> here <https://gcc.gnu.org/ml/gcc-patches/2015-04/msg01792.html>, I'm
> removing the XFAILs in the tests so people are likely to see new FAILs.
>
> I think the following targets will need similar fix as the one below:
> * MIPS
> * rs6000
> * alpha
> * sparc
> * s390
> * arm
> * sh
> * aarch64
>
> I'm CCing the respective maintainers. You might want to XFAIL those tests.
Thanks, here are the SPARC bits with an explanation for the other maintainers:
create_tmp_var_raw must be used instead of create_tmp_var because the hook can
be invoked outside of a function context; likewise for TREE_ADDRESSABLE vs
mark_addressable; TARGET_EXPR is needed for variables that are addressable
(because their address is taken) to force proper gimplification.
Tested on SPARC/Solaris, applied on the mainline.
PR c/65345
* config/sparc/sparc.c (sparc_atomic_assign_expand_fenv): Adjust to
use create_tmp_var_raw rather than create_tmp_var.
--
Eric Botcazou
Index: config/sparc/sparc.c
===================================================================
--- config/sparc/sparc.c (revision 228512)
+++ config/sparc/sparc.c (working copy)
@@ -12540,20 +12540,23 @@ sparc_atomic_assign_expand_fenv (tree *h
__builtin_load_fsr (&tmp1_var); */
- tree fenv_var = create_tmp_var (unsigned_type_node);
- mark_addressable (fenv_var);
+ tree fenv_var = create_tmp_var_raw (unsigned_type_node);
+ TREE_ADDRESSABLE (fenv_var) = 1;
tree fenv_addr = build_fold_addr_expr (fenv_var);
tree stfsr = sparc_builtins[SPARC_BUILTIN_STFSR];
- tree hold_stfsr = build_call_expr (stfsr, 1, fenv_addr);
+ tree hold_stfsr
+ = build4 (TARGET_EXPR, unsigned_type_node, fenv_var,
+ build_call_expr (stfsr, 1, fenv_addr), NULL_TREE, NULL_TREE);
- tree tmp1_var = create_tmp_var (unsigned_type_node);
- mark_addressable (tmp1_var);
+ tree tmp1_var = create_tmp_var_raw (unsigned_type_node);
+ TREE_ADDRESSABLE (tmp1_var) = 1;
tree masked_fenv_var
= build2 (BIT_AND_EXPR, unsigned_type_node, fenv_var,
build_int_cst (unsigned_type_node,
~(accrued_exception_mask | trap_enable_mask)));
tree hold_mask
- = build2 (MODIFY_EXPR, void_type_node, tmp1_var, masked_fenv_var);
+ = build4 (TARGET_EXPR, unsigned_type_node, tmp1_var, masked_fenv_var,
+ NULL_TREE, NULL_TREE);
tree tmp1_addr = build_fold_addr_expr (tmp1_var);
tree ldfsr = sparc_builtins[SPARC_BUILTIN_LDFSR];
@@ -12578,10 +12581,12 @@ sparc_atomic_assign_expand_fenv (tree *h
tmp2_var >>= 5;
__atomic_feraiseexcept ((int) tmp2_var); */
- tree tmp2_var = create_tmp_var (unsigned_type_node);
- mark_addressable (tmp2_var);
- tree tmp3_addr = build_fold_addr_expr (tmp2_var);
- tree update_stfsr = build_call_expr (stfsr, 1, tmp3_addr);
+ tree tmp2_var = create_tmp_var_raw (unsigned_type_node);
+ TREE_ADDRESSABLE (tmp2_var) = 1;
+ tree tmp2_addr = build_fold_addr_expr (tmp2_var);
+ tree update_stfsr
+ = build4 (TARGET_EXPR, unsigned_type_node, tmp2_var,
+ build_call_expr (stfsr, 1, tmp2_addr), NULL_TREE, NULL_TREE);
tree update_ldfsr = build_call_expr (ldfsr, 1, fenv_addr);