diff options
author | Bernd Schmidt <bernds@redhat.com> | 2016-01-21 18:10:03 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2016-01-21 18:10:03 +0000 |
commit | 9776e6920dec9aa23adbdd7f0c264804c7fe6fdf (patch) | |
tree | 66b303926820db0d7a4362846c12773014ef8d1e /gcc/rtlanal.c | |
parent | a71c0334f783c44a146b5003a09847571e71f366 (diff) | |
download | gcc-9776e6920dec9aa23adbdd7f0c264804c7fe6fdf.zip gcc-9776e6920dec9aa23adbdd7f0c264804c7fe6fdf.tar.gz gcc-9776e6920dec9aa23adbdd7f0c264804c7fe6fdf.tar.bz2 |
Fix PR66178, ICE due to misexpansion of constant expressions involving labels.
PR middle-end/66178
* expr.c (expand_expr_real_2) [PLUS_EXPR, MINUS_EXPR]: Don't
drop EXPAND_INITIALIZER.
* rtl.h (contains_symbolic_reference_p): Declare.
* rtlanal.c (contains_symbolic_reference_p): New function.
* simplify-rtx.c (simplify_binary_operation_1): Don't turn
a subtraction into a NOT if symbolic constants are involved.
testsuite/
PR middle-end/66178
gcc.dg/torture/pr66178.c: New test.
From-SVN: r232689
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r-- | gcc/rtlanal.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 0e0d097..71dfd33 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -6243,6 +6243,19 @@ contains_symbol_ref_p (const_rtx x) return false; } +/* Return true if RTL X contains a SYMBOL_REF or LABEL_REF. */ + +bool +contains_symbolic_reference_p (const_rtx x) +{ + subrtx_iterator::array_type array; + FOR_EACH_SUBRTX (iter, array, x, ALL) + if (SYMBOL_REF_P (*iter) || GET_CODE (*iter) == LABEL_REF) + return true; + + return false; +} + /* Return true if X contains a thread-local symbol. */ bool |