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.
// 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:
--- /dev/null
+/* 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);
+}
+