diff options
author | Jakub Jelinek <jakub@redhat.com> | 2009-10-16 12:43:18 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2009-10-16 12:43:18 +0200 |
commit | d02a5a4b9abb043ff6a243bb4f9a9aaac2fb8656 (patch) | |
tree | 6eba8425535818cb1b7315f03e20aef3130b2545 /gcc/cfgexpand.c | |
parent | 200ab6fd4b218b3e9f5617bcf1d36857b68e0c1e (diff) | |
download | gcc-d02a5a4b9abb043ff6a243bb4f9a9aaac2fb8656.zip gcc-d02a5a4b9abb043ff6a243bb4f9a9aaac2fb8656.tar.gz gcc-d02a5a4b9abb043ff6a243bb4f9a9aaac2fb8656.tar.bz2 |
re PR debug/41717 (internal compiler error: in expand_debug_expr)
PR debug/41717
* cfgexpand.c (expand_debug_expr): Handle CONJ_EXPR.
* dwarf2out.c (mem_loc_descriptor): Don't handle
POST_INT/POST_DEC/POST_MODIFY like SUBREG. For SUBREG
punt if it is not lowpart subreg or if inner mode isn't
MODE_INT.
* gcc.dg/debug/pr41717.c: New test.
From-SVN: r152897
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r-- | gcc/cfgexpand.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 4f317d9..acd70c1 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -2869,6 +2869,46 @@ expand_debug_expr (tree exp) op1 = gen_rtx_CONST (GET_MODE_INNER (mode), op1); return gen_rtx_CONCAT (mode, op0, op1); + case CONJ_EXPR: + if (GET_CODE (op0) == CONCAT) + return gen_rtx_CONCAT (mode, XEXP (op0, 0), + gen_rtx_NEG (GET_MODE_INNER (mode), + XEXP (op0, 1))); + else + { + enum machine_mode imode = GET_MODE_INNER (mode); + rtx re, im; + + if (MEM_P (op0)) + { + re = adjust_address_nv (op0, imode, 0); + im = adjust_address_nv (op0, imode, GET_MODE_SIZE (imode)); + } + else + { + enum machine_mode ifmode = int_mode_for_mode (mode); + enum machine_mode ihmode = int_mode_for_mode (imode); + rtx halfsize; + if (ifmode == BLKmode || ihmode == BLKmode) + return NULL; + halfsize = GEN_INT (GET_MODE_BITSIZE (ihmode)); + re = op0; + if (mode != ifmode) + re = gen_rtx_SUBREG (ifmode, re, 0); + re = gen_rtx_ZERO_EXTRACT (ihmode, re, halfsize, const0_rtx); + if (imode != ihmode) + re = gen_rtx_SUBREG (imode, re, 0); + im = copy_rtx (op0); + if (mode != ifmode) + im = gen_rtx_SUBREG (ifmode, im, 0); + im = gen_rtx_ZERO_EXTRACT (ihmode, im, halfsize, halfsize); + if (imode != ihmode) + im = gen_rtx_SUBREG (imode, im, 0); + } + im = gen_rtx_NEG (imode, im); + return gen_rtx_CONCAT (mode, re, im); + } + case ADDR_EXPR: op0 = expand_debug_expr (TREE_OPERAND (exp, 0)); if (!op0 || !MEM_P (op0)) |