diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-11-17 16:10:48 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-11-17 16:10:48 +0100 |
commit | d11be094c716885475a4a1562a967e4a127ecece (patch) | |
tree | 7abff9ebdb6092dccec9a861100cecddbbf1f9ed /gcc/tree-vect-patterns.c | |
parent | e14aba114fb0199d12b06934d9e9af8252cce1c2 (diff) | |
download | gcc-d11be094c716885475a4a1562a967e4a127ecece.zip gcc-d11be094c716885475a4a1562a967e4a127ecece.tar.gz gcc-d11be094c716885475a4a1562a967e4a127ecece.tar.bz2 |
re PR tree-optimization/87546 (Gcc miscompiles at -O3 on valid code)
PR tree-optimization/87546
* tree-vect-patterns.c (vect_look_through_possible_promotion): Add
min_precision variable, initially set it to orig_precision, only does
something if op_type's precision is <= min_precision and update
min_precision whenever calling set_op.
* gcc.dg/vect/O3-pr87546.c: New test.
From-SVN: r266237
Diffstat (limited to 'gcc/tree-vect-patterns.c')
-rw-r--r-- | gcc/tree-vect-patterns.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index 3053642..2b56d85 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -367,6 +367,7 @@ vect_look_through_possible_promotion (vec_info *vinfo, tree op, tree res = NULL_TREE; tree op_type = TREE_TYPE (op); unsigned int orig_precision = TYPE_PRECISION (op_type); + unsigned int min_precision = orig_precision; stmt_vec_info caster = NULL; while (TREE_CODE (op) == SSA_NAME && INTEGRAL_TYPE_P (op_type)) { @@ -385,7 +386,7 @@ vect_look_through_possible_promotion (vec_info *vinfo, tree op, This copes with cases such as the result of an arithmetic operation being truncated before being stored, and where that arithmetic operation has been recognized as an over-widened one. */ - if (TYPE_PRECISION (op_type) <= orig_precision) + if (TYPE_PRECISION (op_type) <= min_precision) { /* Use OP as the UNPROM described above if we haven't yet found a promotion, or if using the new input preserves the @@ -393,7 +394,10 @@ vect_look_through_possible_promotion (vec_info *vinfo, tree op, if (!res || TYPE_PRECISION (unprom->type) == orig_precision || TYPE_SIGN (unprom->type) == TYPE_SIGN (op_type)) - unprom->set_op (op, dt, caster); + { + unprom->set_op (op, dt, caster); + min_precision = TYPE_PRECISION (op_type); + } /* Stop if we've already seen a promotion and if this conversion does more than change the sign. */ else if (TYPE_PRECISION (op_type) |