commit e97e99296505e6015bc9e281364818bb89ca8a49
Author: Andrew MacLeod <amacleod@redhat.com>
Date: Fri May 13 13:11:18 2022 -0400
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.
@@ -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:
new file mode 100644
@@ -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);
+}
+