diff options
author | Richard Henderson <rth@gcc.gnu.org> | 2004-09-28 15:55:04 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2004-09-28 15:55:04 -0700 |
commit | b0b324b07fc46746d3eada8cc27d6000a3756bed (patch) | |
tree | 657a3287fd0f4515ef8192966bb543603c33c6ab /gcc/optabs.c | |
parent | 078208ebefcad46f0fd8e0c559d8c6b411ee4726 (diff) | |
download | gcc-b0b324b07fc46746d3eada8cc27d6000a3756bed.zip gcc-b0b324b07fc46746d3eada8cc27d6000a3756bed.tar.gz gcc-b0b324b07fc46746d3eada8cc27d6000a3756bed.tar.bz2 |
re PR tree-optimization/17531 ([ivopts] ICE compiling gzip deflate.c)
PR 17531
* expr.c (expand_expr_addr_expr_1): Only assemble_external for decls.
Don't check VOIDmode here. Force PLUS operands to common type.
(expand_expr_addr_expr): Do VOIDmode check earlier. Force use of
Pmode if given a non pointer type.
PR 17531
* optabs.c (expand_binop): Force constants to the correct mode.
From-SVN: r88257
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r-- | gcc/optabs.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c index fc3ef00..cc0627b 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -834,11 +834,19 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1, force expensive constants into a register. */ if (CONSTANT_P (op0) && optimize && rtx_cost (op0, binoptab->code) > COSTS_N_INSNS (1)) - op0 = force_reg (mode, op0); + { + if (GET_MODE (op0) != VOIDmode) + op0 = convert_modes (mode, VOIDmode, op0, unsignedp); + op0 = force_reg (mode, op0); + } if (CONSTANT_P (op1) && optimize && ! shift_op && rtx_cost (op1, binoptab->code) > COSTS_N_INSNS (1)) - op1 = force_reg (mode, op1); + { + if (GET_MODE (op1) != VOIDmode) + op1 = convert_modes (mode, VOIDmode, op1, unsignedp); + op1 = force_reg (mode, op1); + } /* Record where to delete back to if we backtrack. */ last = get_last_insn (); |