Check operand for type, not LHS.
authorAndrew MacLeod <amacleod@redhat.com>
Fri, 13 May 2022 17:11:18 +0000 (13:11 -0400)
committerAndrew MacLeod <amacleod@redhat.com>
Fri, 13 May 2022 18:38:50 +0000 (14:38 -0400)
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.

gcc/range-op.cc
gcc/testsuite/gcc.dg/pr105597.c [new file with mode: 0644]

index e6b32e2..c88da8c 100644 (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:
diff --git a/gcc/testsuite/gcc.dg/pr105597.c b/gcc/testsuite/gcc.dg/pr105597.c
new file mode 100644 (file)
index 0000000..e463ec6
--- /dev/null
@@ -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);
+}
+