Commit d11be094 by Jakub Jelinek Committed by Jakub Jelinek

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
parent e14aba11
2018-11-17 Jakub Jelinek <jakub@redhat.com>
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.
2018-11-16 Jan Hubicka <hubicka@ucw.cz> 2018-11-16 Jan Hubicka <hubicka@ucw.cz>
PR ipa/87957 PR ipa/87957
2018-11-17 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/87546
* gcc.dg/vect/O3-pr87546.c: New test.
2018-11-17 Jozef Lawrynowicz <jozef.l@mittosystems.com> 2018-11-17 Jozef Lawrynowicz <jozef.l@mittosystems.com>
PR middle-end/87854 PR middle-end/87854
......
#include "tree-vect.h"
int a;
long b, f;
signed char c, g;
short int d = 219;
int e[64];
__attribute__((noipa)) void
foo (void)
{
asm volatile ("" : : "g" (&a), "g" (&d) : "memory");
for (c = 0; c < 64; c++)
{
g = d < 0 ? d : d >> a;
f = g + b;
e[c] = f;
}
if (e[1] != (signed char) d)
__builtin_abort ();
}
int
main ()
{
check_vect ();
foo ();
return 0;
}
...@@ -367,6 +367,7 @@ vect_look_through_possible_promotion (vec_info *vinfo, tree op, ...@@ -367,6 +367,7 @@ vect_look_through_possible_promotion (vec_info *vinfo, tree op,
tree res = NULL_TREE; tree res = NULL_TREE;
tree op_type = TREE_TYPE (op); tree op_type = TREE_TYPE (op);
unsigned int orig_precision = TYPE_PRECISION (op_type); unsigned int orig_precision = TYPE_PRECISION (op_type);
unsigned int min_precision = orig_precision;
stmt_vec_info caster = NULL; stmt_vec_info caster = NULL;
while (TREE_CODE (op) == SSA_NAME && INTEGRAL_TYPE_P (op_type)) 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, ...@@ -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 This copes with cases such as the result of an arithmetic
operation being truncated before being stored, and where that operation being truncated before being stored, and where that
arithmetic operation has been recognized as an over-widened one. */ 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 /* Use OP as the UNPROM described above if we haven't yet
found a promotion, or if using the new input preserves the 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, ...@@ -393,7 +394,10 @@ vect_look_through_possible_promotion (vec_info *vinfo, tree op,
if (!res if (!res
|| TYPE_PRECISION (unprom->type) == orig_precision || TYPE_PRECISION (unprom->type) == orig_precision
|| TYPE_SIGN (unprom->type) == TYPE_SIGN (op_type)) || 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 /* Stop if we've already seen a promotion and if this
conversion does more than change the sign. */ conversion does more than change the sign. */
else if (TYPE_PRECISION (op_type) else if (TYPE_PRECISION (op_type)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment