diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-12-11 10:19:41 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-12-11 10:19:41 +0100 |
commit | 20adc5b14897a3705f708982c4887db66d49835d (patch) | |
tree | 000f1cb2606177d6c2c6952a5cfbd3062075c818 /gcc/tree-ssa-copy.c | |
parent | f8cb36a94c67ec4723475e68df75f9571b4ed198 (diff) | |
download | gcc-20adc5b14897a3705f708982c4887db66d49835d.zip gcc-20adc5b14897a3705f708982c4887db66d49835d.tar.gz gcc-20adc5b14897a3705f708982c4887db66d49835d.tar.bz2 |
re PR tree-optimization/59417 (ICE in determine_value_range, at tree-ssa-loop-niter.c:176)
PR tree-optimization/59417
* tree-ssa-copy.c (fini_copy_prop): If copy_of[i].value is defined
in a different bb rhan var, only duplicate points-to info and
not alignment info and don't duplicate range info.
* tree-ssa-loop-niter.c (determine_value_range): Instead of
assertion failure handle inconsistencies in range info by only
using var's range info and not PHI result range infos.
* gcc.c-torture/compile/pr59417.c: New test.
From-SVN: r205884
Diffstat (limited to 'gcc/tree-ssa-copy.c')
-rw-r--r-- | gcc/tree-ssa-copy.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c index 3da262b..11daa5f 100644 --- a/gcc/tree-ssa-copy.c +++ b/gcc/tree-ssa-copy.c @@ -567,14 +567,28 @@ fini_copy_prop (void) if (copy_of[i].value != var && TREE_CODE (copy_of[i].value) == SSA_NAME) { + basic_block copy_of_bb + = gimple_bb (SSA_NAME_DEF_STMT (copy_of[i].value)); + basic_block var_bb = gimple_bb (SSA_NAME_DEF_STMT (var)); if (POINTER_TYPE_P (TREE_TYPE (var)) && SSA_NAME_PTR_INFO (var) && !SSA_NAME_PTR_INFO (copy_of[i].value)) - duplicate_ssa_name_ptr_info (copy_of[i].value, - SSA_NAME_PTR_INFO (var)); + { + duplicate_ssa_name_ptr_info (copy_of[i].value, + SSA_NAME_PTR_INFO (var)); + /* Points-to information is cfg insensitive, + but alignment info might be cfg sensitive, if it + e.g. is derived from VRP derived non-zero bits. + So, do not copy alignment info if the two SSA_NAMEs + aren't defined in the same basic block. */ + if (var_bb != copy_of_bb) + mark_ptr_info_alignment_unknown + (SSA_NAME_PTR_INFO (copy_of[i].value)); + } else if (!POINTER_TYPE_P (TREE_TYPE (var)) && SSA_NAME_RANGE_INFO (var) - && !SSA_NAME_RANGE_INFO (copy_of[i].value)) + && !SSA_NAME_RANGE_INFO (copy_of[i].value) + && var_bb == copy_of_bb) duplicate_ssa_name_range_info (copy_of[i].value, SSA_NAME_RANGE_TYPE (var), SSA_NAME_RANGE_INFO (var)); |