On Wed, May 3, 2017 at 11:09 AM, Kyrill Tkachov <kyrylo.tkac...@foss.arm.com> wrote: > Hi Bin, > > > On 03/05/17 11:02, Bin.Cheng wrote: >> >> On Wed, May 3, 2017 at 9:38 AM, Bin.Cheng <amker.ch...@gmail.com> wrote: >>> >>> On Wed, May 3, 2017 at 7:17 AM, Eric Botcazou <ebotca...@adacore.com> >>> wrote: >>>>> >>>>> 2017-04-11 Bin Cheng <bin.ch...@arm.com> >>>>> >>>>> * rtlanal.c (rtx_cost): Handle TRUNCATE between tieable modes. >>>> >>>> This breaks bootstrap with RTL checking: >>>> >>>> /home/eric/build/gcc/native/./gcc/xgcc >>>> -B/home/eric/build/gcc/native/./gcc/ - >>>> nostdinc -x c /dev/null -S -o /dev/null -fself- >>>> test=/home/eric/svn/gcc/gcc/testsuite/selftests >>>> cc1: internal compiler error: RTL check: expected code 'subreg', have >>>> 'truncate' in rtx_cost, at rtlanal.c:4169 >>>> 0xbae338 rtl_check_failed_code1(rtx_def const*, rtx_code, char const*, >>>> int, >>>> char const*) >>>> /home/eric/svn/gcc/gcc/rtl.c:829 >>>> 0xbbc9b4 rtx_cost(rtx_def*, machine_mode, rtx_code, int, bool) >>>> /home/eric/svn/gcc/gcc/rtlanal.c:4169 >>>> 0x8517e6 set_src_cost >>>> /home/eric/svn/gcc/gcc/rtl.h:2685 >>>> 0x8517e6 init_expmed_one_conv >>>> /home/eric/svn/gcc/gcc/expmed.c:142 >>>> 0x8517e6 init_expmed_one_mode >>>> /home/eric/svn/gcc/gcc/expmed.c:209 >>>> 0x853fb2 init_expmed() >>>> /home/eric/svn/gcc/gcc/expmed.c:270 >>>> 0xc45974 backend_init_target >>>> /home/eric/svn/gcc/gcc/toplev.c:1665 >>>> 0xc45974 initialize_rtl() >>>> >>> Sorry for disturbing, I will revert this if can't fix today. >> >> It looks bogus and I couldn't find the motivating case for it, so >> revert with attached patch. Build on x86 and commit as obvious. >> >> Thanks, >> bin >> 2017-05-03 Bin Cheng <bin.ch...@arm.com> >> >> Revert >> 2017-05-02 Bin Cheng <bin.ch...@arm.com> >> * rtlanal.c (rtx_cost): Handle TRUNCATE between tieable modes. > > > Looking at the code in the patch... > > + case TRUNCATE: > + /* If we can tie these modes, make this cheap. */ > + if (MODES_TIEABLE_P (mode, GET_MODE (SUBREG_REG (x)))) > > 'code' here is GET_CODE (x) and in this case it is TRUNCATE. > SUBREG_REG asserts (in RTL checking mode) that its argument is a SUBREG, so > passing it a TRUNCATE rtx would cause > the checking failure Eric reported. I think you meant to use XEXP (x, 0) > instead of SUBREG_REG (x) ? Turned out this is still necessary for a test case pr49781-1.c. I updated patch as suggested. This is kind of an obvious update.
Thanks, bin > > Thanks, > Kyrill >
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 321363f..d9f57c3 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -4164,6 +4164,13 @@ rtx_cost (rtx x, machine_mode mode, enum rtx_code outer_code, return COSTS_N_INSNS (2 + factor); break; + case TRUNCATE: + if (MODES_TIEABLE_P (mode, GET_MODE (XEXP (x, 0)))) + { + total = 0; + break; + } + /* FALLTHRU */ default: if (targetm.rtx_costs (x, mode, outer_code, opno, &total, speed)) return total;