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:
parent
90205f67e4
commit
cb15322240
3 changed files with 46 additions and 2 deletions
41
gcc/testsuite/gcc.dg/tree-ssa/vrp98-1.c
Normal file
41
gcc/testsuite/gcc.dg/tree-ssa/vrp98-1.c
Normal 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" } } */
|
|
@ -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>
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Reference in a new issue