> Tested on x86_64-linux-gnu, mipsisa32-elf and mipsisa64-elf. Also tested > by making sure that there were no code differences for a set of gcc .ii > files on gcc20 (-O2 -march=native). OK to install?
Are you sure that generating TRUNCATEs out of nowhere in simplify_subreg is always correct? > gcc/ > * machmode.h (GET_MODE_UNIT_PRECISION): New macro. > * simplify-rtx.c (simplify_truncation): New function. You should say where it comes from. > (simplify_unary_operation_1): Use it. Remove sign bit test > for !TRULY_NOOP_TRUNCATION_MODES_P. (simplify_unary_operation_1) <TRUNCATE>: ... > (simplify_subreg): Use simplify_int_lowpart for TRUNCATE. This function doesn't exist. And this is misleading, it's not just for TRUNCATE, it's for a truncation to the lowpart. > /* Try to simplify a unary operation CODE whose output mode is to be > MODE with input operand OP whose mode was originally OP_MODE. > Return zero if no simplification can be made. */ > @@ -689,12 +850,6 @@ simplify_unary_operation_1 (enum rtx_cod > op_mode = mode; > in2 = simplify_gen_unary (NOT, op_mode, in2, op_mode); > > - if (GET_CODE (in2) == NOT && GET_CODE (in1) != NOT) > - { > - rtx tem = in2; > - in2 = in1; in1 = tem; > - } > - > return gen_rtx_fmt_ee (GET_CODE (op) == IOR ? AND : IOR, > mode, in1, in2); > } Why is this hunk here? > @@ -5595,14 +5730,6 @@ simplify_subreg (enum machine_mode outer > return NULL_RTX; > } > > - /* Merge implicit and explicit truncations. */ > - > - if (GET_CODE (op) == TRUNCATE > - && GET_MODE_SIZE (outermode) < GET_MODE_SIZE (innermode) > - && subreg_lowpart_offset (outermode, innermode) == byte) > - return simplify_gen_unary (TRUNCATE, outermode, XEXP (op, 0), > - GET_MODE (XEXP (op, 0))); > - > /* SUBREG of a hard register => just change the register number > and/or mode. If the hard register is not valid in that mode, > suppress this simplification. If the hard register is the stack, Likewise. -- Eric Botcazou