Fold all statements in Ranger VRP.

Until now, ranger VRP has only simplified statements with ranges.  This patch
enables us to fold all statements.

	gcc/
	* tree-vrp.c (rvrp_folder::fold_stmt): If simplification fails, try
	to fold anyway.

	gcc/testsuite/
	* gcc.dg/tree-ssa/vrp98.c: Disable evrp for vrp1 test.
	* gcc.dg/tree-ssa/vrp98-1.c: New. Test for folding in evrp.
This commit is contained in:
Andrew MacLeod 2021-10-20 13:37:29 -04:00
parent 90205f67e4
commit cb15322240
3 changed files with 46 additions and 2 deletions

View file

@ -0,0 +1,41 @@
/* { dg-do compile } */
/* { dg-require-effective-target int128 } */
/* { dg-options "-Os -fdump-tree-evrp-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\\)" "evrp" } } */
/* { dg-final { scan-tree-dump-not "Folded into: if \\(_\[0-9\]+ == 2\\)" "evrp" } } */
/* { dg-final { scan-tree-dump "Folded into: if \\(_\[0-9\]+ == 3\\)" "evrp" } } */

View file

@ -1,6 +1,6 @@
/* { dg-do compile } */
/* { dg-require-effective-target int128 } */
/* { dg-options "-Os -fdump-tree-vrp1-details" } */
/* { dg-options "-Os -fdisable-tree-evrp -fdump-tree-vrp1-details" } */
#include <stdint.h>
#include <limits.h>

View file

@ -50,6 +50,7 @@ along with GCC; see the file COPYING3. If not see
#include "gimple-range.h"
#include "gimple-range-path.h"
#include "value-pointer-equiv.h"
#include "gimple-fold.h"
/* Set of SSA names found live during the RPO traversal of the function
for still active basic-blocks. */
@ -4381,7 +4382,9 @@ public:
bool fold_stmt (gimple_stmt_iterator *gsi) OVERRIDE
{
return m_simplifier.simplify (gsi);
if (m_simplifier.simplify (gsi))
return true;
return ::fold_stmt (gsi, follow_single_use_edges);
}
private: