Check operand for type, not LHS.

When folding, the LHS has not been set, so we should be checking the type of
op1.  We should also make sure op1 is not undefined.

	PR tree-optimization/105597
	gcc/
	* range-op.cc (operator_minus::lhs_op1_relation): Use op1 instead
	of the lhs and make sure it is not undefined.
	gcc/testsuite/
	* gcc.dg/pr105597.c: New.
This commit is contained in:
Andrew MacLeod 2022-05-13 13:11:18 -04:00
parent 70d624ff06
commit e97e992965
2 changed files with 29 additions and 2 deletions

View File

@ -1343,10 +1343,10 @@ operator_minus::wi_fold (irange &r, tree type,
// OP1 and OP2.
relation_kind
operator_minus::lhs_op1_relation (const irange &lhs, const irange &,
operator_minus::lhs_op1_relation (const irange &, const irange &op1,
const irange &, relation_kind rel) const
{
if (TYPE_SIGN (lhs.type ()) == UNSIGNED)
if (!op1.undefined_p () && TYPE_SIGN (op1.type ()) == UNSIGNED)
switch (rel)
{
case VREL_GT:

View File

@ -0,0 +1,27 @@
/* PR tree-optimization/105597 */
/* { dg-do compile } */
/* { dg-options "-O2 -Wno-int-conversion" } */
typedef struct {
int allocated;
} vvec;
int vvneeds_want, mgpssort;
void vvinit(vvec *v, int minelems) { v->allocated = -minelems; }
void vvneeds(vvec *v, int needed) {
if (needed > v->allocated)
if (v->allocated < 0)
;
else {
int next = v->allocated + (v->allocated >> 1);
vvneeds_want = next;
}
}
void mgpssort_1() {
vvinit((vvec *) &mgpssort, mgpssort_1);
vvneeds((vvec *) &mgpssort, mgpssort_1);
}