diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 79906edfcc3d..2f653f99852a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2009-10-14 Jakub Jelinek + + * tree-parloops.c (separate_decls_in_region_debug_bind): Drop debug + stmts setting DEBUG_EXPR_DECLs. + + * cfgexpand.c (expand_debug_expr): Ignore zero-length bitfields. + Don't crash if mode1 is VOIDmode. + 2009-09-26 Vladimir Makarov * params.def (PARAM_IRA_LOOP_RESERVED_REGS): New. diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 6882954fab81..4f317d906bc0 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -2524,6 +2524,9 @@ expand_debug_expr (tree exp) &mode1, &unsignedp, &volatilep, false); rtx orig_op0; + if (bitsize == 0) + return NULL; + orig_op0 = op0 = expand_debug_expr (tem); if (!op0) @@ -2561,6 +2564,9 @@ expand_debug_expr (tree exp) if (MEM_P (op0)) { + if (mode1 == VOIDmode) + /* Bitfield. */ + mode1 = smallest_mode_for_size (bitsize, MODE_INT); if (bitpos >= BITS_PER_UNIT) { op0 = adjust_address_nv (op0, mode1, bitpos / BITS_PER_UNIT); @@ -2568,7 +2574,8 @@ expand_debug_expr (tree exp) } else if (bitpos < 0) { - int units = (-bitpos + BITS_PER_UNIT - 1) / BITS_PER_UNIT; + HOST_WIDE_INT units + = (-bitpos + BITS_PER_UNIT - 1) / BITS_PER_UNIT; op0 = adjust_address_nv (op0, mode1, units); bitpos += units * BITS_PER_UNIT; } diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c index 12b4ac0171a9..681e04612e48 100644 --- a/gcc/tree-parloops.c +++ b/gcc/tree-parloops.c @@ -715,6 +715,8 @@ separate_decls_in_region_debug_bind (gimple stmt, void **slot, **dslot; var = gimple_debug_bind_get_var (stmt); + if (TREE_CODE (var) == DEBUG_EXPR_DECL) + return true; gcc_assert (DECL_P (var) && SSA_VAR_P (var)); ielt.uid = DECL_UID (var); dslot = htab_find_slot_with_hash (decl_copies, &ielt, ielt.uid, NO_INSERT);