Hi, Our ARC processor has a multiplication operation that returns a 64 bit result into a fixed register pair named <mlo,mhi> like this:
mlo:DI=zero_extend(r159:SI)*sign_extend(r181:SI) The GCSE rtl pre step has some difficulties to handle hard register pair information. To exemplify my problem please see the following example: 18: mlo:DI=zero_extend(r159:SI)*sign_extend(r170:SI) REG_EQUAL zero_extend(r159:SI)*0xffffffffcccccccd REG_DEAD r170:SI REG_UNUSED mlo:SI 20: r168:SI=mhi:SI 0>>0x3 REG_DEAD mhi:SI REG_EQUAL udiv(r159:SI,0xa) .... 36: mlo:DI=zero_extend(r159:SI)*sign_extend(r181:SI) REG_EQUAL zero_extend(r159:SI)*0xffffffffcccccccd REG_DEAD r181:SI REG_UNUSED mlo:SI 38: r179:SI=mhi:SI 0>>0x3 REG_DEAD mhi:SI REG_EQUAL udiv(r159:SI,0xa) The "reg_avail_info" structure misses information about mhi register. The mlo information, the first register in the register pair, the information is correctly computed. Due to the missing mhi information, the instruction 38 is considered an anticipated expression (due to faulty return of function oprs_unchanged_p() ). This leads to removal of instruction 38 ( gcse via insn 20) and all the dependent instructions. A possible solution is to check if reg_avail_info holds initialized data in oprs_unchanged_p() function, avoiding false positive returns, like this: --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -881,6 +881,8 @@ oprs_unchanged_p (const_rtx x, const_rtx insn, int avail_p) { struct reg_avail_info *info = ®_avail_info[REGNO (x)]; + if (info->last_bb == NULL) + return 0; if (info->last_bb != current_bb) return 1; if (avail_p) Please let me know if this is an acceptable solution for my issue. Thank you, Claudiu Zissulescu