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