Commit 1014b6f5 by Senthil Kumar Selvaraj Committed by Jeff Law

[Patch, vrp] Allow VRP type conversion folding only for widenings upto word mode

	* tree.h (desired_pro_or_demotion_p): New function.
	* tree-vrp.c (simplify_cond_using_ranges): Call it.

	* gcc.dg/tree-ssa/vrp98.c: New testcase.
	* gcc.target/avr/uint8-single-reg.c: New testcase.

From-SVN: r230618
parent 04a9bb6e
2015-11-19 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
* tree.h (desired_pro_or_demotion_p): New function.
* tree-vrp.c (simplify_cond_using_ranges): Call it.
2015-11-19 Jakub Jelinek <jakub@redhat.com> 2015-11-19 Jakub Jelinek <jakub@redhat.com>
Manuel López-Ibáñez <manu@gcc.gnu.org> Manuel López-Ibáñez <manu@gcc.gnu.org>
2015-11-19 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
* gcc.dg/tree-ssa/vrp98.c: New testcase.
* gcc.target/avr/uint8-single-reg.c: New testcase.
2015-11-19 Jakub Jelinek <jakub@redhat.com> 2015-11-19 Jakub Jelinek <jakub@redhat.com>
PR c++/67409 PR c++/67409
......
/* { dg-do compile } */
/* { dg-require-effective-target int128 } */
/* { dg-options "-Os -fdump-tree-vrp1-details" } */
#include <stdint.h>
#include <limits.h>
typedef unsigned int word __attribute__((mode(word)));
typedef unsigned __int128 bigger_than_word;
int
foo (bigger_than_word a, word b, uint8_t c)
{
/* Must fold use of t1 into use of b, as b is no wider than word_mode. */
const uint8_t t1 = b % UCHAR_MAX;
/* Must NOT fold use of t2 into use of a, as a is wider than word_mode. */
const uint8_t t2 = a % UCHAR_MAX;
/* Must fold use of t3 into use of c, as c is narrower than t3. */
const uint32_t t3 = (const uint32_t)(c >> 1);
uint16_t ret = 0;
if (t1 == 1)
ret = 20;
else if (t2 == 2)
ret = 30;
else if (t3 == 3)
ret = 40;
/* Th extra condition below is necessary to prevent a prior pass from
folding away the cast. Ignored in scan-tree-dump. */
else if (t3 == 4)
ret = 50;
return ret;
}
/* { dg-final { scan-tree-dump "Folded into: if \\(_\[0-9\]+ == 1\\)" "vrp1" } } */
/* { dg-final { scan-tree-dump-not "Folded into: if \\(_\[0-9\]+ == 2\\)" "vrp1" } } */
/* { dg-final { scan-tree-dump "Folded into: if \\(_\[0-9\]+ == 3\\)" "vrp1" } } */
/* { dg-do compile } */
/* { dg-options "-Os" } */
/* This testcase verifies that a uint8_t variable assigned from a wider variable
with the same range is held in a single register. VRP must not fold away the
conversion and use two regs to hold the uint16_t - widenings are ok only upto
word mode (1 byte for AVR).
*/
unsigned int foo(const unsigned int wvalue)
{
const unsigned char type = (wvalue >> 8);
unsigned int size = 0;
if (type == 1)
{
size = 20;
}
return size;
}
/* { dg-final { scan-assembler "cpi r25,lo8\\(1\\)" } } */
/* { dg-final { scan-assembler-not "cpc r\\d+,__zero_reg__" } } */
...@@ -9459,7 +9459,8 @@ simplify_cond_using_ranges (gcond *stmt) ...@@ -9459,7 +9459,8 @@ simplify_cond_using_ranges (gcond *stmt)
innerop = gimple_assign_rhs1 (def_stmt); innerop = gimple_assign_rhs1 (def_stmt);
if (TREE_CODE (innerop) == SSA_NAME if (TREE_CODE (innerop) == SSA_NAME
&& !POINTER_TYPE_P (TREE_TYPE (innerop))) && !POINTER_TYPE_P (TREE_TYPE (innerop))
&& desired_pro_or_demotion_p (TREE_TYPE (innerop), TREE_TYPE (op0)))
{ {
value_range *vr = get_value_range (innerop); value_range *vr = get_value_range (innerop);
......
...@@ -5358,4 +5358,18 @@ get_decl_source_range (tree decl) ...@@ -5358,4 +5358,18 @@ get_decl_source_range (tree decl)
return get_range_from_loc (line_table, loc); return get_range_from_loc (line_table, loc);
} }
/* Return true if it makes sense to promote/demote from_type to to_type. */
inline bool
desired_pro_or_demotion_p (const_tree to_type, const_tree from_type)
{
unsigned int to_type_precision = TYPE_PRECISION (to_type);
/* OK to promote if to_type is no bigger than word_mode. */
if (to_type_precision <= GET_MODE_PRECISION (word_mode))
return true;
/* Otherwise, allow only if narrowing or same precision conversions. */
return to_type_precision <= TYPE_PRECISION (from_type);
}
#endif /* GCC_TREE_H */ #endif /* GCC_TREE_H */
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