aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@gcc.gnu.org>2012-08-17 00:18:35 +0000
committerHans-Peter Nilsson <hp@gcc.gnu.org>2012-08-17 00:18:35 +0000
commit79cd6f1501b35eb2bb433110bde45a1a92b36962 (patch)
tree779aee0f31aa5d7ecc2981b2a9f84217c75b423c
parentb897f4eacc0b23a45e12f34847b9428c443ca71d (diff)
downloadgcc-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
-rw-r--r--gcc/optabs.c4
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. */