Compilation of gcc.dg/pr85180.c and gcc.dg/pr87985.c times out after 5 minutes for msp430 with -mlarge.
nonzero_bits1 (from rtlanal.c), recurses many times for each reg because reg_nonzero_bits_for_combine (combine.c) never considers using last_set_nonzero_bits for the given reg when the reg is PSImode (i.e. Pmode for msp430-elf -mlarge). nonzero bits for a mode of class MODE_PARTIAL_INT are valid for a mode of class MODE_INT, and vice-versa. The existing comment in reg_nonzero_bits_for_combine explaining why last_set_nonzero_bits is valid even when the precision of the last set mode is less than the current mode, also explains why MODE_PARTIAL_INT and MODE_INT can be used interchangeably here: > record_value_for_reg invoked nonzero_bits on the register > with nonzero_bits_mode (because last_set_mode is necessarily integral > and HWI_COMPUTABLE_MODE_P in this case) so bits in nonzero_bits_mode > are all valid, hence in mode too since nonzero_bits_mode is defined > to the largest HWI_COMPUTABLE_MODE_P mode. The attached patch fixes the timeout with mlarge (compilation takes only a couple of seconds) by allowing the last set nonzero bits for a reg to be used if either the current mode or last mode is MODE_PARTIAL_INT or MODE_INT. Currently only MODE_INT is considered. Successfully bootstrapped and regtested x86_64-pc-linux-gnu and msp430-elf -msmall and -mlarge. Ok for trunk?
>From 753dbbfab665020cece59496765086b3debe23f9 Mon Sep 17 00:00:00 2001 From: Jozef Lawrynowicz <joze...@mittosystems.com> Date: Tue, 27 Nov 2018 19:03:53 +0000 Subject: [PATCH] Use last_set_nonzero_bits for a REG when REG mode is MODE_PARTIAL_INT 2018-12-12 Jozef Lawrynowicz <joze...@mittosystems.com> gcc/ChangeLog: * combine.c (reg_nonzero_bits_for_combine): Use last_set_nonzero_bits for a reg if the current mode or last set mode was MODE_PARTIAL_INT. --- gcc/combine.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gcc/combine.c b/gcc/combine.c index 7e61139..73b80b6 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -10245,8 +10245,10 @@ reg_nonzero_bits_for_combine (const_rtx x, scalar_int_mode xmode, if (rsp->last_set_value != 0 && (rsp->last_set_mode == mode || (REGNO (x) >= FIRST_PSEUDO_REGISTER - && GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT - && GET_MODE_CLASS (mode) == MODE_INT)) + && (GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT + || GET_MODE_CLASS (rsp->last_set_mode) == MODE_PARTIAL_INT) + && (GET_MODE_CLASS (mode) == MODE_INT + || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT))) && ((rsp->last_set_label >= label_tick_ebb_start && rsp->last_set_label < label_tick) || (rsp->last_set_label == label_tick -- 2.7.4