When rhs equals to 0x7fffffff, adding 1 to rhs overflows SI, generating
invalid const_int.
gcc/ChangeLog:
* config/loongarch/loongarch.cc (loongarch_emit_int_compare):
Call trunc_int_mode to ensure valid rhs.
gcc/testsuite/ChangeLog:
* gcc.target/loongarch/la32/trunc_int_for_mode.c: New test.
Reviewed-by: Xi Ruoyao <xry111@xry111.site>
Reviewed-by: Lulu Cheng <chenglulu@loongson.cn>
break;
new_rhs = rhs + (increment ? 1 : -1);
+ new_rhs = trunc_int_for_mode (new_rhs, GET_MODE (*op0));
if (loongarch_integer_cost (new_rhs)
< loongarch_integer_cost (rhs))
{
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+float
+__cbrtf (float x)
+{
+ double r = 13322 * 1111;
+ float ub = r;
+ long long cvt1 = x;
+ long long m0 = cvt1 << 19;
+ long long m1 = m0 >> 63;
+ if ((m0 ^ m1) < (1ULL << 31))
+ {
+ cvt1 = (cvt1 + (1 << 31)) & 0xffffffff00000000;
+ ub = cvt1;
+ }
+ return ub;
+}