LoongArch: fix signed overflow in loongarch_emit_int_compare
authorXi Ruoyao <xry111@xry111.site>
Thu, 3 Nov 2022 17:35:25 +0000 (01:35 +0800)
committerXi Ruoyao <xry111@xry111.site>
Wed, 9 Nov 2022 09:11:23 +0000 (17:11 +0800)
Signed overflow is an undefined behavior, so we need to prevent it from
happening, instead of "checking" the result.

gcc/ChangeLog:

* config/loongarch/loongarch.cc (loongarch_emit_int_compare):
Avoid signed overflow.

gcc/config/loongarch/loongarch.cc

index f54c233..8d5d8d9 100644 (file)
@@ -4178,10 +4178,13 @@ loongarch_emit_int_compare (enum rtx_code *code, rtx *op0, rtx *op1)
              if (!increment && !decrement)
                continue;
 
+             if ((increment && rhs == HOST_WIDE_INT_MAX)
+                 || (decrement && rhs == HOST_WIDE_INT_MIN))
+               break;
+
              new_rhs = rhs + (increment ? 1 : -1);
              if (loongarch_integer_cost (new_rhs)
-                   < loongarch_integer_cost (rhs)
-                 && (rhs < 0) == (new_rhs < 0))
+                   < loongarch_integer_cost (rhs))
                {
                  *op1 = GEN_INT (new_rhs);
                  *code = mag_comparisons[i][increment];