Fix a typo in two_value_replacement function
GCC revision 267634 implemented two_value_replacement function. However, a typo occurred during the parameter check, which caused us to miss some optimizations. The intent of the code might be to check that the input parameters are const int and their difference is one. However, when I read the code, I found that it is wrong to detect whether an input data plus one is equal to itself. This could be a typo. 2019-05-06 Li Jia He <helijia@linux.ibm.com> * tree-ssa-phiopt.c (two_value_replacement): Fix a typo in parameter detection. * gcc.dg/tree-ssa/pr37508.c: Add the no-ssa-phiopt option to skip phi optimization. * gcc.dg/tree-ssa/pr88676-2.c: New testcase. From-SVN: r270894
This commit is contained in:
parent
3997383be1
commit
94adc935af
5 changed files with 45 additions and 4 deletions
|
@ -1,3 +1,8 @@
|
|||
2019-05-06 Li Jia He <helijia@linux.ibm.com>
|
||||
|
||||
* tree-ssa-phiopt.c (two_value_replacement): Fix a typo in parameter
|
||||
detection.
|
||||
|
||||
2019-05-03 Richard Earnshaw <rearnsha@arm.com>
|
||||
|
||||
PR target/89400
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2019-05-06 Li Jia He <helijia@linux.ibm.com>
|
||||
|
||||
* gcc.dg/tree-ssa/pr37508.c: Add the no-ssa-phiopt option to skip phi
|
||||
optimization.
|
||||
* gcc.dg/tree-ssa/pr88676-2.c: New testcase.
|
||||
|
||||
2019-05-05 Thomas Koenig <tkoenig@gcc.gnu.org>
|
||||
|
||||
PR fortran/90344
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fno-tree-fre -fdump-tree-vrp1" } */
|
||||
/* { dg-options "-O2 -fno-ssa-phiopt -fno-tree-fre -fdump-tree-vrp1" } */
|
||||
|
||||
struct foo1 {
|
||||
int i:1;
|
||||
|
@ -22,7 +22,7 @@ int test2 (struct foo2 *x)
|
|||
{
|
||||
if (x->i == 0)
|
||||
return 1;
|
||||
else if (x->i == -1) /* This test is already folded to false by ccp1. */
|
||||
else if (x->i == -1) /* This test is already optimized by ccp1 or phiopt1. */
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ int test3 (struct foo1 *x)
|
|||
{
|
||||
if (x->i == 0)
|
||||
return 1;
|
||||
else if (x->i == 1) /* This test is already folded to false by fold. */
|
||||
else if (x->i == 1) /* This test is already optimized by ccp1 or phiopt1. */
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
|
30
gcc/testsuite/gcc.dg/tree-ssa/pr88676-2.c
Normal file
30
gcc/testsuite/gcc.dg/tree-ssa/pr88676-2.c
Normal file
|
@ -0,0 +1,30 @@
|
|||
/* PR tree-optimization/88676 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-phiopt1" } */
|
||||
/* { dg-final { scan-tree-dump-not " = PHI <" "optimized" } } */
|
||||
|
||||
struct foo1 {
|
||||
int i:1;
|
||||
};
|
||||
struct foo2 {
|
||||
unsigned i:1;
|
||||
};
|
||||
|
||||
int test1 (struct foo1 *x)
|
||||
{
|
||||
if (x->i == 0)
|
||||
return 1;
|
||||
else if (x->i == 1)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int test2 (struct foo2 *x)
|
||||
{
|
||||
if (x->i == 0)
|
||||
return 1;
|
||||
else if (x->i == -1)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -602,7 +602,7 @@ two_value_replacement (basic_block cond_bb, basic_block middle_bb,
|
|||
|| TREE_CODE (arg1) != INTEGER_CST
|
||||
|| (tree_int_cst_lt (arg0, arg1)
|
||||
? wi::to_widest (arg0) + 1 != wi::to_widest (arg1)
|
||||
: wi::to_widest (arg1) + 1 != wi::to_widest (arg1)))
|
||||
: wi::to_widest (arg1) + 1 != wi::to_widest (arg0)))
|
||||
return false;
|
||||
|
||||
if (!empty_block_p (middle_bb))
|
||||
|
|
Loading…
Add table
Reference in a new issue