diff options
author | Hans-Peter Nilsson <hp@gcc.gnu.org> | 2012-08-17 00:18:35 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@gcc.gnu.org> | 2012-08-17 00:18:35 +0000 |
commit | 79cd6f1501b35eb2bb433110bde45a1a92b36962 (patch) | |
tree | 779aee0f31aa5d7ecc2981b2a9f84217c75b423c /gcc | |
parent | b897f4eacc0b23a45e12f34847b9428c443ca71d (diff) | |
download | gcc-79cd6f1501b35eb2bb433110bde45a1a92b36962.zip gcc-79cd6f1501b35eb2bb433110bde45a1a92b36962.tar.gz gcc-79cd6f1501b35eb2bb433110bde45a1a92b36962.tar.bz2 |
re PR middle-end/54261 (reverse sync/atomic operators when only sync_compare_and_swap_optab libfuncs implemented)
PR middle-end/54261
* optabs.c (expand_atomic_fetch_op): Save and restore code when
retrying after failed attempt.
From-SVN: r190463
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/optabs.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c index b2f873f..ebb2af5 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -7826,6 +7826,7 @@ expand_atomic_fetch_op (rtx target, rtx mem, rtx val, enum rtx_code code, { rtx libfunc; bool fixup = false; + enum rtx_code orig_code = code; libfunc = optab_libfunc (after ? optab.fetch_after : optab.fetch_before, mode); @@ -7849,6 +7850,9 @@ expand_atomic_fetch_op (rtx target, rtx mem, rtx val, enum rtx_code code, true, OPTAB_LIB_WIDEN); return result; } + + /* We need the original code for any further attempts. */ + code = orig_code; } /* If nothing else has succeeded, default to a compare and swap loop. */ |