aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2021-11-15 17:37:10 -0800
committerH.J. Lu <hjl.tools@gmail.com>2021-11-15 19:23:58 -0800
commit074ee8d9a91d7573c1e8774a22e4e08f923adb18 (patch)
tree488df1f360dcf7770fa4c792cdf75de61a061600 /gcc
parenta031aaa2ac9d4c74994df085a0d8c79bd55792c9 (diff)
downloadgcc-074ee8d9a91d7573c1e8774a22e4e08f923adb18.zip
gcc-074ee8d9a91d7573c1e8774a22e4e08f923adb18.tar.gz
gcc-074ee8d9a91d7573c1e8774a22e4e08f923adb18.tar.bz2
Add a missing return when transforming atomic bit test and operations
When failing to transform equivalent, but slighly different cases of atomic bit test and operations to their canonical forms, return immediately. gcc/ PR middle-end/103268 * tree-ssa-ccp.c (optimize_atomic_bit_test_and): Add a missing return. gcc/testsuite/ PR middle-end/103268 * gcc.dg/pr103268-1.c: New test. * gcc.dg/pr103268-2.c: Likewise.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/pr103268-1.c10
-rw-r--r--gcc/testsuite/gcc.dg/pr103268-2.c12
-rw-r--r--gcc/tree-ssa-ccp.c2
3 files changed, 24 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr103268-1.c b/gcc/testsuite/gcc.dg/pr103268-1.c
new file mode 100644
index 0000000..6d583d5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr103268-1.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+extern int si;
+long
+test_types (void)
+{
+ unsigned int u2 = __atomic_fetch_xor (&si, 0, 5);
+ return u2;
+}
diff --git a/gcc/testsuite/gcc.dg/pr103268-2.c b/gcc/testsuite/gcc.dg/pr103268-2.c
new file mode 100644
index 0000000..12283bb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr103268-2.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+extern long pscc_a_2_3;
+extern int pscc_a_1_4;
+
+void
+pscc (void)
+{
+ pscc_a_1_4 = __sync_fetch_and_and (&pscc_a_2_3, 1);
+}
+
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c
index 0666dc6..18d5772 100644
--- a/gcc/tree-ssa-ccp.c
+++ b/gcc/tree-ssa-ccp.c
@@ -3638,6 +3638,8 @@ optimize_atomic_bit_test_and (gimple_stmt_iterator *gsip,
use_stmt = use_nop_stmt;
}
}
+ else
+ return;
if (!bit)
{