diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-07-12 10:58:56 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-07-12 10:58:56 +0200 |
commit | 1de3c940d8782eae7739a6c6f7327e99eee63cce (patch) | |
tree | a3491f88aab4b550e25d5c3270bfafe6131701df | |
parent | 712a93d637f8f49194b756d5ea8eb51d4de66608 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/gimple-fold.c | 20 |
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; |