From: rth Date: Sat, 12 Nov 2011 17:17:54 +0000 (+0000) Subject: * builtins.c (expand_builtin_compare_and_swap): If target is const0, X-Git-Tag: upstream/4.9.2~16189 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ba885f6a0dabd032e32cd85c8bb76d5ee35f3a04;p=platform%2Fupstream%2Flinaro-gcc.git * builtins.c (expand_builtin_compare_and_swap): If target is const0, don't pass the target to expand_atomic_compare_and_swap. (expand_builtin_atomic_compare_exchange): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181323 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4a9a5d3..3f72d60 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2011-11-12 Richard Henderson + * builtins.c (expand_builtin_compare_and_swap): If target is const0, + don't pass the target to expand_atomic_compare_and_swap. + (expand_builtin_atomic_compare_exchange): Likewise. + * config/sh/linux.h (TARGET_INIT_LIBFUNCS): New. * config/sh/sh.c (sh_init_sync_libfuncs): New. diff --git a/gcc/builtins.c b/gcc/builtins.c index 98dc636..9dc68cc 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -5144,7 +5144,6 @@ expand_builtin_sync_operation (enum machine_mode mode, tree exp, case BUILT_IN_SYNC_FETCH_AND_NAND_4: case BUILT_IN_SYNC_FETCH_AND_NAND_8: case BUILT_IN_SYNC_FETCH_AND_NAND_16: - if (warned_f_a_n) break; @@ -5158,7 +5157,6 @@ expand_builtin_sync_operation (enum machine_mode mode, tree exp, case BUILT_IN_SYNC_NAND_AND_FETCH_4: case BUILT_IN_SYNC_NAND_AND_FETCH_8: case BUILT_IN_SYNC_NAND_AND_FETCH_16: - if (warned_n_a_f) break; @@ -5190,16 +5188,24 @@ expand_builtin_compare_and_swap (enum machine_mode mode, tree exp, bool is_bool, rtx target) { rtx old_val, new_val, mem; + rtx *pbool, *poval; /* Expand the operands. */ mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode); old_val = expand_expr_force_mode (CALL_EXPR_ARG (exp, 1), mode); new_val = expand_expr_force_mode (CALL_EXPR_ARG (exp, 2), mode); - if (!expand_atomic_compare_and_swap ((is_bool ? &target : NULL), - (is_bool ? NULL : &target), - mem, old_val, new_val, false, - MEMMODEL_SEQ_CST, MEMMODEL_SEQ_CST)) + pbool = poval = NULL; + if (target != const0_rtx) + { + if (is_bool) + pbool = ⌖ + else + poval = ⌖ + } + if (!expand_atomic_compare_and_swap (pbool, poval, mem, old_val, new_val, + false, MEMMODEL_SEQ_CST, + MEMMODEL_SEQ_CST)) return NULL_RTX; return target; @@ -5338,8 +5344,9 @@ expand_builtin_atomic_compare_exchange (enum machine_mode mode, tree exp, oldval = copy_to_reg (gen_rtx_MEM (mode, expect)); - if (!expand_atomic_compare_and_swap (&target, &oldval, mem, oldval, - desired, is_weak, success, failure)) + if (!expand_atomic_compare_and_swap ((target == const0_rtx ? NULL : &target), + &oldval, mem, oldval, desired, + is_weak, success, failure)) return NULL_RTX; emit_move_insn (gen_rtx_MEM (mode, expect), oldval);