This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug target/81874] internal compiler error: in do_SUBST, at combine.c:725


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81874

--- Comment #6 from zwzhangwen.zhang at huawei dot com ---
I think this bug exists and hides.The reason is that trunc_int_for_mode will
check newval replacing oldval with CONST_INT in combine pass, but for
0x80000000,the result of  trunc_int_for_mode is 0xfffffff80000000 and is not
equal to 0x80000000. So gcc assert as follows:
      /* Sanity check that we're replacing oldval with a CONST_INT
         that is a valid sign-extension for the original mode.  */
      gcc_assert (INTVAL (newval)
                  == trunc_int_for_mode (INTVAL (newval), GET_MODE (oldval)));
gcc tries to combine two insns as follows:
(insn 4018 4017 4019 226 (set (reg:SI 2681)
        (const_int -2147483648 [0xffffffff80000000])) ...
          (expr_list:REG_EQUAL (const_int 2147483648 [0x80000000])
     (nil))
(insn 4019 4018 12 226 (set (mem:SI (reg/f:SI 270 [ pretmp_609 ]) [1
*pretmp_609+0 S4 A32])
        (reg:SI 2681)) ...
     (nil))
The first time gcc try to combine them but fail. The second time gcc find equal
reg_note and continue to combine them then gcc assert.
Because many optimizing pass can affect insn list, many patch can hide the bug.
Hope your help to resolve the problem.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]