aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-07-12 10:58:56 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-07-12 10:58:56 +0200
commit1de3c940d8782eae7739a6c6f7327e99eee63cce (patch)
treea3491f88aab4b550e25d5c3270bfafe6131701df /gcc
parent712a93d637f8f49194b756d5ea8eb51d4de66608 (diff)
downloadgcc-1de3c940d8782eae7739a6c6f7327e99eee63cce.zip
gcc-1de3c940d8782eae7739a6c6f7327e99eee63cce.tar.gz
gcc-1de3c940d8782eae7739a6c6f7327e99eee63cce.tar.bz2
re PR middle-end/71716 (gcc.dg/atomic/c11-atomic-exec-4.c is miscompiled with -march=corei7)
PR middle-end/71716 * gimple-fold.c (optimize_atomic_compare_exchange_p): Return false for SCALAR_FLOAT_TYPE_P type of expected var, or if TYPE_PRECISION is different from mode's bitsize. Small cleanup. From-SVN: r238239
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimple-fold.c20
2 files changed, 20 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3c9432a..58d5d87 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-07-12 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/71716
+ * gimple-fold.c (optimize_atomic_compare_exchange_p): Return false
+ for SCALAR_FLOAT_TYPE_P type of expected var, or if TYPE_PRECISION
+ is different from mode's bitsize. Small cleanup.
+
2016-07-12 Richard Biener <rguenther@suse.de>
PR rtl-optimization/68961
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 36c105f..cbfcc2f 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -2984,12 +2984,19 @@ optimize_atomic_compare_exchange_p (gimple *stmt)
tree expected = gimple_call_arg (stmt, 1);
if (TREE_CODE (expected) != ADDR_EXPR
- || !SSA_VAR_P (TREE_OPERAND (expected, 0))
- || !is_gimple_reg_type (TREE_TYPE (TREE_OPERAND (expected, 0)))
+ || !SSA_VAR_P (TREE_OPERAND (expected, 0)))
+ return false;
+
+ tree etype = TREE_TYPE (TREE_OPERAND (expected, 0));
+ if (!is_gimple_reg_type (etype)
|| !auto_var_in_fn_p (TREE_OPERAND (expected, 0), current_function_decl)
- || TREE_THIS_VOLATILE (TREE_TYPE (TREE_OPERAND (expected, 0)))
- || TREE_CODE (TREE_TYPE (TREE_OPERAND (expected, 0))) == VECTOR_TYPE
- || TREE_CODE (TREE_TYPE (TREE_OPERAND (expected, 0))) == COMPLEX_TYPE)
+ || TREE_THIS_VOLATILE (etype)
+ || VECTOR_TYPE_P (etype)
+ || TREE_CODE (etype) == COMPLEX_TYPE
+ /* Don't optimize floating point expected vars, VIEW_CONVERT_EXPRs
+ might not preserve all the bits. See PR71716. */
+ || SCALAR_FLOAT_TYPE_P (etype)
+ || TYPE_PRECISION (etype) != GET_MODE_BITSIZE (TYPE_MODE (etype)))
return false;
tree weak = gimple_call_arg (stmt, 3);
@@ -3005,8 +3012,7 @@ optimize_atomic_compare_exchange_p (gimple *stmt)
&& optab_handler (sync_compare_and_swap_optab, mode) == CODE_FOR_nothing)
return false;
- if (int_size_in_bytes (TREE_TYPE (TREE_OPERAND (expected, 0)))
- != GET_MODE_SIZE (mode))
+ if (int_size_in_bytes (etype) != GET_MODE_SIZE (mode))
return false;
return true;